一对一关联

发布于 2022-10-15 10:07:47 字数 5206 浏览 17 评论 0

转:nanguogood  

一对一关联

●基于外键的一对一关联:
假设范例User与Room是一对一的关系,也就是每一个人分配一个房间,先看看这两个类:
代码: User.java

  1. package com.xtedu.teach.hibernate.mappings;
  2. public class User {
  3. private long id;
  4. private String name;
  5. private Room room;
  6. }
  7. 代码: Room.java
  8. package com.xtedu.teach.hibernate.mappings;
  9. public class Room {
  10. private long id;
  11. private String address;
  12. private User user;
  13. }

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

  1. <?xml version="1.0" encoding='UTF-8'?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
  4. <hibernate-mapping>
  5. <class name="com.User" table="USER">
  6. <id name="id" column="USER_ID" unsaved-value="0">
  7. <generator class="increment"/>
  8. </id>
  9. <property name="name">
  10. <column name="NAME" length="16" not-null="true"/>
  11. </property>
  12. <many-to-one name="room"
  13. column="ROOM_ID"
  14. class="com.Room"
  15. cascade="all"
  16. unique="true"/>
  17. </class>
  18. </hibernate-mapping>

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

  1. <?xml version="1.0" encoding='UTF-8'?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
  4. <hibernate-mapping>
  5. <class name="com.Room" table="ROOM">
  6. <id name="id" column="ROOM_ID" unsaved-value="0">
  7. <generator class="increment"/>
  8. </id>
  9. <property name="address" type="string"/>
  10. <one-to-one name="user"
  11. class="com.User"
  12. property-ref="room"/>
  13. </class>
  14. </hibernate-mapping>

复制代码在<one-to-one>的设定中,我们告诉Hibernate,Room返向参考回User的room属性。
●     基于主键的一对一关联:限制两个数据表的主键使用相同的值.
如此一个User与Room就是一对一关系,在User.hbm.xml这儿,只要使用<one-to-one>设定关联即可:

代码:

  1. <?xml version="1.0" encoding='UTF-8'?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
  4. <hibernate-mapping>
  5. <class name="com.User" table="USER">
  6. <id name="id" column="USER_ID" unsaved-value="0">
  7. <generator class="increment"/>
  8. </id>
  9. <property name="name">
  10. <column name="NAME" length="16" not-null="true"/>
  11. </property>
  12. <one-to-one name="room"
  13. class="com.Room"
  14. cascade="all"/>
  15. </class>

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

代码:

  1. <?xml version="1.0" encoding='UTF-8'?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
  4. <hibernate-mapping>
  5. <class name="com.Room" table="ROOM">
  6. <id name="id" column="ROOM_ID" unsaved-value="0">
  7. <generator class="foreign">
  8. <param name="property">user</param>
  9. </generator>
  10. </id>
  11. <property name="address" type="string"/>
  12. <one-to-one name="user"
  13. class="com.User"
  14. constrained="true"/>
  15. </class>
  16. </hibernate-mapping>

复制代码

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文