`
KuangYeYaZi
  • 浏览: 56521 次
文章分类
社区版块
存档分类
最新评论

Hibernate入门之一对一实体映像

 
阅读更多

一对一实体映像的两种方式:

 

一、外键的关联的方式:
假设我们之前范例的User与Room是一对一的关系,也就是每一个人分配一个房间,先看看这两个类别: 

User.java 类:

 

package onlyfun.caterpillar; 

public class User { 
private long id; 
private String name; 
private Room room; 

public long getId() { 
return id; 
} 
public void setId(long id) { 
this.id = id; 
} 
public String getName() { 
return name; 
} 
public void setName(String name) { 
this.name = name; 
} 
public Room getRoom() { 
return room; 
} 

public void setRoom(Room room) { 
this.room = room; 
} 
} 
Room.java 
package onlyfun.caterpillar; 

public class Room { 
private long id; 
private String address; 
private User user; 

public long getId() { 
return id; 
} 
public void setId(long id) { 
this.id = id; 
} 
public String getAddress() { 
return address; 
} 
public void setAddress(String address) { 
this.address = address; 
} 
public User getUser() { 
return user; 
} 
public void setUser(User user) { 
this.user = user; 
} 
}

 要映像User与Room的一对一关系,我们可以有两种方式,一种是透过外键参考,在之前的多对一的例子中即使外键参考的例子,我们现在限制多对一为一对一,只要在User.hbm.xml中的<many-to-one>上加上unique="true",表示限制一个User有一独有的 Room,详细的代码如下: 

User.hbm.xml 配置文件:

<?xml version="1.0"?> 
<!DOCTYPE hibernate-mapping 
PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" 
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd"> 

<hibernate-mapping> 

<class name="onlyfun.caterpillar.User" table="USER"> 

<id name="id" column="USER_ID" unsaved-value="0"> 
<generator class="increment"/> 
</id> 

<property name="name"> 
<column name="NAME" length="16" not-null="true"/> 
</property> 

<many-to-one name="room" 
column="ROOM_ID" 
class="onlyfun.caterpillar.Room" 
cascade="all" 
unique="true"/> 
</class> 

</hibernate-mapping> 

 这就完成了单向的一对一映射,我们可以在Room.hbm.xml上加入参考回User的设定,使其成为双向的一对一映射,如下:

Room.hbm.xml 的xml配置如下:

<?xml version="1.0"?> 
<!DOCTYPE hibernate-mapping 
PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" 
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd"> 

<hibernate-mapping> 

<class name="onlyfun.caterpillar.Room" table="ROOM"> 

<id name="id" column="ROOM_ID" unsaved-value="0"> 
<generator class="increment"/> 
</id> 

<property name="address" type="string"/> 

<one-to-one name="user" 
class="onlyfun.caterpillar.User" 
property-ref="room"/> 
</class> 

</hibernate-mapping> 

  在<one-to-one>的设定中,我们告诉Hibernate,Room返向参考回User的room属性。 

 使用以下的程序来测试数据的储存: 

HibernateTest.java 的文件代码如下:

import onlyfun.caterpillar.*; 
import net.sf.hibernate.*; 
import net.sf.hibernate.cfg.*; 

public class HibernateTest { 
public static void main(String[] args) throws HibernateException { 
SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory(); 

Room room = new Room(); 
room.setAddress("NTU-M8-419"); 

User user1 = new User(); 
user1.setName("bush"); 

user1.setRoom(room); 
room.setUser(user1); 

Session session = sessionFactory.openSession(); 
Transaction tx= session.beginTransaction(); 
session.save(user1); 

tx.commit(); 
session.close(); 

sessionFactory.close(); 
} 
} 

 数据表的实际例子,与多对一映像时相同,只不过现在一个User只能对应一个Room。 

 

二、言键的关联的方式:

一对一关联关系的主键关联方式:

 另一个映像一对一的方式是使用主键关联,限制两个数据表的主键使用相同的值,如此一个User与Room就是一对一关系,在User.hbm.xml这边,只要使用<one-to-one>设定关联即可: 

User.hbm.xml 文件配置如下:

<?xml version="1.0"?> 
<!DOCTYPE hibernate-mapping 
PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" 
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd"> 

<hibernate-mapping> 

<class name="onlyfun.caterpillar.User" table="USER"> 

<id name="id" column="USER_ID" unsaved-value="0"> 
<generator class="increment"/> 
</id> 

<property name="name"> 
<column name="NAME" length="16" not-null="true"/> 
</property> 

<one-to-one name="room" 
class="onlyfun.caterpillar.Room" 
cascade="all"/> 
</class> 

 在Room.hbm.xml这边,必须限制其主键与User的主键相同,而在属性上,使用constrained="true"告诉Hibernate参考至User的主键: 

Room.hbm.xml 配置如下:

<?xml version="1.0"?> 
<!DOCTYPE hibernate-mapping 
PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" 
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd"> 

<hibernate-mapping> 

<class name="onlyfun.caterpillar.Room" table="ROOM"> 

<id name="id" column="ROOM_ID" unsaved-value="0"> 
<generator class="foreign"> 
<param name="property">user</param> 
</generator> 
</id> 

<property name="address" type="string"/> 

<one-to-one name="user" 
class="onlyfun.caterpillar.User" 
constrained="true"/> 
</class> 

</hibernate-mapping> 

 只要改变映像文件即可,程序的部份无需修改,数据库中的实际储存例子如下: 

mysql> select * from USER; 
+---------+-------------+ 
| USER_ID | NAME | 
+---------+-------------+ 
| 1 | bush | 
| 2 | caterpillar | 
+---------+-------------+ 
2 rows in set (0.00 sec) 

mysql> select * from ROOM; 
+---------+------------+ 
| ROOM_ID | address | 
+---------+------------+ 
| 1 | NTU-M8-419 | 
| 2 | NTU-M8-420 | 
+---------+------------+ 
2 rows in set (0.00 sec) 

 

 

以上来自:http://www.360doc.com/content/07/0715/09/16915_611884.shtml

http://www.360doc.com/userhome.aspx?userid=16915&cid=4#

 

分享到:
评论

相关推荐

    hibernate学习入门一对多实体映射源码

    在这个“hibernate学习入门之一对多实体映射源码”教程中,我们将深入探讨如何在Hibernate中设置和管理一对多的关系。 一、Hibernate简介 Hibernate是Java开发人员用于处理数据库操作的强大工具,通过它,我们可以...

    Hibernate入门到精通

    SessionFactory 对象是 Hibernate 的核心组件之一。 Hibernate 的优点 Hibernate 有很多优点,它可以帮助开发者快速地访问和操作数据库。下面是 Hibernate 的一些优点: * 简洁高效:Hibernate 提供了一种简洁...

    Hibernate入门jar包

    本压缩包提供的是Hibernate入门所需的jar包,包括了Hibernate的核心库以及与之配合使用的相关组件。让我们深入探讨一下这些jar包以及它们在Hibernate中的作用。 1. Hibernate核心库: - `hibernate-core.jar`:这...

    Hibernate入门案例源码

    【Hibernate入门案例源码】是针对初学者设计的一份教程,旨在帮助理解并掌握Java持久化框架Hibernate的基础应用。Hibernate是一个强大的ORM(对象关系映射)框架,它简化了数据库与Java对象之间的交互,使开发者可以...

    初学hibernate,hibernate入门

    **初学Hibernate,Hibernate入门** ...随着对Hibernate的深入学习,你会发现它还支持更高级的功能,如级联操作、多对一、一对多等复杂关系映射、缓存机制、延迟加载等,这些都将极大地提升你的开发效率。

    hibernate框架一对一测试案例

    **hibernate框架一对一关联测试案例详解** 在Java开发中,Hibernate是一个强大的对象关系映射(ORM)框架,它简化了数据库操作,使得开发者能够用Java对象来处理数据。本篇我们将深入探讨Hibernate中的一对一...

    Hibernate入门(代码+笔记)

    总结来说,本教程涵盖了Hibernate的基础知识,从入门到实体映射,再到复合主键和实体层设计,旨在帮助初学者快速掌握Hibernate的使用,从而更高效地进行数据库操作。通过实践这些知识点,你将能够熟练地在Java应用中...

    hibernate入门--第一个实例

    在这个“hibernate入门--第一个实例”中,我们将了解如何设置Hibernate环境,创建实体类,配置映射文件,以及执行基本的CRUD(创建、读取、更新和删除)操作。 1. **环境搭建** - **下载与安装**: 首先,你需要从...

    hibernate入门小例子

    【hibernate入门小例子】是一个适合初学者的教程,主要涵盖了如何在JavaWeb项目中使用Hibernate框架与MySQL数据库进行集成。在这个例子中,我们将会深入理解Hibernate的核心概念,包括实体映射、对象关系映射(ORM)...

    Hibernate入门

    ### Hibernate入门知识点详解 #### Hibernate概述与ORM思想 - **定义**:Hibernate是一个开源的、轻量级的对象关系映射(Object-Relational Mapping,简称ORM)框架,它主要应用于JavaEE架构中的DAO(Data Access ...

    Hibernate入门到精通.pdf

    《Hibernate入门到精通》这本书是针对Java开发人员深入学习Hibernate框架的一份宝贵资源。Hibernate是一个开源的对象关系映射(ORM)框架,它极大地简化了Java应用程序与数据库之间的交互。通过使用Hibernate,...

    Hibernate一对一,一对多,多对多实例

    本实例将深入探讨Hibernate中的三种基本关联关系:一对一(One-to-One)、一对多(One-to-Many)以及多对多(Many-to-Many)的实现方式。 1. **一对一关联**: 一对一关联通常出现在两个实体之间存在唯一对应关系...

    hibernate入门

    Hibernate 支持多种对象关系映射,如一对一、一对多、多对一、多对多。例如,一个User可以有多个Order: ```xml &lt;!-- User.hbm.xml --&gt; &lt;!-- Order.hbm.xml --&gt; ``` 以上就是Hibernate入门的基础内容。...

    hibernate一对一关联关系

    本资源主要探讨的是“hibernate一对一关联关系”。 一对一关联关系在现实世界中很常见,比如一个人只有一个身份证,或者一个公司的总部只有一个。在Hibernate中,设置一对一关联关系可以帮助我们更好地管理和操作...

    hibernate 映射关系学习入门 一对一映射

    在提供的压缩包`TestHiberOnetoOne`中,可能包含了使用Eclipse创建的Hibernate一对一映射关系的项目源码。你可以通过运行这个项目来更直观地理解一对一映射的工作原理,包括实体类的定义、配置文件的编写以及如何在...

    hibernate 映射关系学习入门 多对多实体映射

    本教程将带你入门Hibernate的多对多实体映射,帮助你理解如何通过源码来实现这种复杂的关系映射。 一、Hibernate概述 Hibernate是一个对象关系映射(ORM)框架,它允许我们将Java对象(实体)与数据库表进行映射,...

    Hibernate入门教程.pdf

    相比之下,Hibernate则更加自动化,能够根据实体类自动生成相应的SQL语句,进一步减少了开发者的负担。 通过上述知识点的学习,初学者可以更好地理解Hibernate的核心概念和技术优势,并逐步掌握其基本用法,为...

    Hibernate入门笔记

    ### Hibernate入门知识点详解 #### 一、环境搭建与配置 - **工程创建**:首先,创建一个名为`HibernateDemo`的Java工程,这是构建Hibernate应用的基础。为了使工程能够识别和运行Hibernate相关的代码,需要正确地...

    hibernate系列(一)hibernate入门

    Hibernate支持一对一、一对多、多对一、多对多等各种关系映射,通过注解或XML配置文件定义。例如,一个用户可以有多个订单,订单也可以属于一个用户: ```java @Entity @Table(name = "Order") public class Order ...

Global site tag (gtag.js) - Google Analytics