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

hibernate one-to-one 注意事项 。生成方式最好设为 foreign

 
阅读更多

在hibernate一对一实体映射中,常用有2种方式,一种就是把一对一看作多对一的一个特例,即通过外健参考。另一种是通过主健参考,限制2个数据表中的主健使用相同的值。

看如下一个例子:一个顾客住一个房间。如果使用不同的方式,其数据表的设计是不同的(这里hibernate的具体用法就不细述了)。如果是通过外健连接,就是一对多的特例,其表结构如图:

hibername的配置文件如下:
User.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="com.hiber">

<class name="User" table="user">
<id name="id" column="user_id" unsaved-value="0">
<generator class="increment"></generator>
</id>
<property name="name" column="name" type="string"></property>
<many-to-one name="room" column="ROOM_ID" class="Room" cascade="all" unique="true"/>
</class>

</hibernate-mapping>

常见问题说明:cascade="all",cascade (级联),指主控方执行操作时,关联对象是否同步执行同一操作。例如:对主控方调用sava-update或delete方法时,是否对关联对象进行同样 的操作。此处设置为all,表示无论主控方执行何种操作(insert,update,delete)都对其关联对象执行同样的操作

Room.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="com.hiber">

<class name="Room" table="room">
<id name="id" column="room_id" unsaved-value="0">
<generator class="increment"></generator>
</id>
<property name="address" column="address" type="string"></property>
<one-to-one name="user" class="User" property-ref="room"></one-to-one>
</class>
</hibernate-mapping>

另外一种方式是一对一的主键关联。限制兩各数据表的主键使用相同的值,如此一个User与Room就是一对一关系。如图:

hibernate的配置文件如下

User.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="com.hiber">

<class name="User" table="user">
<id name="id" column="user_id" unsaved-value="0">
<generator class="increment"></generator>
</id>
<property name="name" column="name" type="string"></property>
<one-to-one name="room" class="Room" cascade="all"></one-to-one>
</class>

</hibernate-mapping>

Room.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="com.hiber">

<class name="Room" table="room">
<id name="id" column="room_id" unsaved-value="0">
<generator class="increment"></generator>
</id>
<property name="address" column="address" type="string"></property>
<one-to-one name="user" class="User" constrained="true"></one-to-one>
</class>
</hibernate-mapping>

注:在一对一主键对应时
<id name="id" column="room_id" unsaved-value="0">
<generator class="increment"></generator>
</id>
可以用
<id name="id" column="room_id" unsaved-value="0">
<generator class="foreign">
<param name="property">user</param>
</generator>
</id>

替换。即第二种方式不需要再创见主键生成器。



注:在Room.hbm.xml这里,必須限制其主键与User的主键相同,而在属性上,使用 constrained="true"(约束条件)告诉Hibernate参考至User的主键。由于采用了主键关联,那么通过主键关联的两张表,其关联 的主键值必须保持同步。也就是说,只需要为一张表设置主键生产器,而另一张表的主键与之共享同一主键值。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics