Hibernate的一对一联系关系实例<转>

Hibernate的一对一关联实例<转>

Hibernate的一对一关联实例

Hibernate中的表的关联有一对一,一对多和多对多三种关联方式,在这篇笔记和接下来的笔记中,我将用我自己的实际例子来说明如何具体实施。
      我使用的Hibernate版本是2.1.8,在Hibernate的网站2.1.6版本的中文文档中有关一对一的关联有下面一段表述:

Hibernate的一对一联系关系实例<转&gt5.1.11. 一对一
Hibernate的一对一联系关系实例<转&gt持久化对象之间一对一的关联关系是通过one-to-one元素定义的。 
Hibernate的一对一联系关系实例<转&gt
Hibernate的一对一联系关系实例<转&gt
<one-to-one
Hibernate的一对一联系关系实例<转&gt        
name="propertyName"                                (1)
Hibernate的一对一联系关系实例<转&gt        class
="ClassName"                                  (2)
Hibernate的一对一联系关系实例<转&gt        cascade
="all|none|save-update|delete"              (3)
Hibernate的一对一联系关系实例<转&gt        constrained
="true|false"                           (4)
Hibernate的一对一联系关系实例<转&gt        outer-join
="true|false|auto"                       (5)
Hibernate的一对一联系关系实例<转&gt        property-ref
="propertyNameFromAssociatedClass"     (6)
Hibernate的一对一联系关系实例<转&gt        access
="field|property|ClassName"                  (7)
Hibernate的一对一联系关系实例<转&gt        
Hibernate的一对一联系关系实例<转&gt
/>
Hibernate的一对一联系关系实例<转&gt(1) name: 属性的名字。 
Hibernate的一对一联系关系实例<转&gt 
Hibernate的一对一联系关系实例<转&gt(2) class (可选 - 默认是通过反射得到的属性类型):被关联的类的名字。 
Hibernate的一对一联系关系实例<转&gt 
Hibernate的一对一联系关系实例<转&gt(3) cascade(级联) (可选) 表明操作是否从父对象级联到被关联的对象。 
Hibernate的一对一联系关系实例<转&gt 
Hibernate的一对一联系关系实例<转&gt(4) constrained(约束) (可选) 表明该类对应的表对应的数据库表,和被关联的对象所对应的数据库表之间,通过一个外键引用对主键进行约束。这个选项影响save()和delete()在级联执行时的先后顺序(也在schema export tool中被使用)。 
Hibernate的一对一联系关系实例<转&gt 
Hibernate的一对一联系关系实例<转&gt(5) outer-join(外连接) (可选 - 默认为 自动): 当设置hibernate.use_outer_join的时候,对这个关联允许外连接抓取。 
Hibernate的一对一联系关系实例<转&gt 
Hibernate的一对一联系关系实例<转&gt(6) property-ref: (可选) 指定关联类的一个属性,这个属性将会和本外键相对应。如果没有指定,会使用对方关联类的主键。 
Hibernate的一对一联系关系实例<转&gt 
Hibernate的一对一联系关系实例<转&gt(7) access (可选 - 默认是 property): Hibernate用来访问属性的策略。 
Hibernate的一对一联系关系实例<转&gt 
Hibernate的一对一联系关系实例<转&gt
Hibernate的一对一联系关系实例<转&gt有两种不同的一对一关联: 
Hibernate的一对一联系关系实例<转&gt
Hibernate的一对一联系关系实例<转&gt主键关联 
Hibernate的一对一联系关系实例<转&gt
Hibernate的一对一联系关系实例<转&gt惟一外键关联 
Hibernate的一对一联系关系实例<转&gt
Hibernate的一对一联系关系实例<转&gt主键关联不需要额外的表字段;两行是通过这种一对一关系相关联的,那么这两行就共享同样的主关键字值。所以如果你希望两个对象通过主键一对一关联,你必须确认它们被赋予同样的标识值! 
Hibernate的一对一联系关系实例<转&gt
Hibernate的一对一联系关系实例<转&gt比如说,对下面的Employee和Person进行主键一对一关联: 
Hibernate的一对一联系关系实例<转&gt
Hibernate的一对一联系关系实例<转&gt
<one-to-one name="person" class="Person"/>
Hibernate的一对一联系关系实例<转&gt
<one-to-one name="employee" class="Employee" constrained="true"/>
Hibernate的一对一联系关系实例<转&gt现在我们必须确保PERSON和EMPLOYEE中相关的字段是相等的。我们使用一个特别的称为foreign的Hibernate标识符生成器策略: 
Hibernate的一对一联系关系实例<转&gt
Hibernate的一对一联系关系实例<转&gt
<class name="person" table="PERSON">
Hibernate的一对一联系关系实例<转&gt    
<id name="id" column="PERSON_ID">
Hibernate的一对一联系关系实例<转&gt        
<generator class="foreign">
Hibernate的一对一联系关系实例<转&gt            
<param name="property">employee</param>
Hibernate的一对一联系关系实例<转&gt        
</generator>
Hibernate的一对一联系关系实例<转&gt    
</id>
Hibernate的一对一联系关系实例<转&gt    Hibernate的一对一联系关系实例<转&gt
Hibernate的一对一联系关系实例<转&gt    
<one-to-one name="employee"
Hibernate的一对一联系关系实例<转&gt        class
="Employee"
Hibernate的一对一联系关系实例<转&gt        constrained
="true"/>
Hibernate的一对一联系关系实例<转&gt
</class>
Hibernate的一对一联系关系实例<转&gt一个刚刚保存的Person实例被赋予和该Person的employee属性所指向的Employee实例同样的关键字值。 
Hibernate的一对一联系关系实例<转&gt
Hibernate的一对一联系关系实例<转&gt另一种方式是一个外键和一个惟一关键字对应,上面的Employee和Person的例子,如果使这种关联方式,应该表达成: 
Hibernate的一对一联系关系实例<转&gt
Hibernate的一对一联系关系实例<转&gt
<many-to-one name="person" class="Person" column="PERSON_ID" unique="true"/>
Hibernate的一对一联系关系实例<转&gt如果在Person的映射加入下面几句,这种关联就是双向的: 
Hibernate的一对一联系关系实例<转&gt
Hibernate的一对一联系关系实例<转&gt
<one-to-one name"employee" class="Employee" property-ref="person"/>
Hibernate的一对一联系关系实例<转&gt
      
      下面是我的一个一对一主键关联的例子,使用的数据库是MySQL 4.1.11:
      我有两个表:UserBasic和UserInfo,UserBasic记录的是用户的基本注册信息,UserInfo表记录的是用户的详细信息。表的结构如下:

 1Hibernate的一对一联系关系实例<转&gtCREATE TABLE IF NOT EXISTS UserBasic
 2Hibernate的一对一联系关系实例<转&gt(
 3Hibernate的一对一联系关系实例<转&gt   Guid                           INT                            NOT NULL AUTO_INCREMENT,
 4Hibernate的一对一联系关系实例<转&gt   Account                        VARCHAR(64)                    NOT NULL,
 5Hibernate的一对一联系关系实例<转&gt   Password                       VARCHAR(16)                    NOT NULL,
 6Hibernate的一对一联系关系实例<转&gt   Email                          VARCHAR(128)                   NOT NULL,
 7Hibernate的一对一联系关系实例<转&gt   PRIMARY KEY (Guid)
 8Hibernate的一对一联系关系实例<转&gt) TYPE=InnoDB;
 9Hibernate的一对一联系关系实例<转&gt
10Hibernate的一对一联系关系实例<转&gtCREATE TABLE IF NOT EXISTS UserInfo
11Hibernate的一对一联系关系实例<转&gt(
12Hibernate的一对一联系关系实例<转&gt   Guid                           INT                            NOT NULL,
13Hibernate的一对一联系关系实例<转&gt   Username                       VARCHAR(128),
14Hibernate的一对一联系关系实例<转&gt   Gender                         CHAR(1),
15Hibernate的一对一联系关系实例<转&gt   Birthday                       DATETIME,
16Hibernate的一对一联系关系实例<转&gt   PRIMARY KEY (Guid)
17Hibernate的一对一联系关系实例<转&gt) TYPE=InnoDB;
18Hibernate的一对一联系关系实例<转&gt
19Hibernate的一对一联系关系实例<转&gtALTER TABLE UserInfo ADD CONSTRAINT UserInfoRFUserBasic FOREIGN KEY (Guid) 
20Hibernate的一对一联系关系实例<转&gt   REFERENCES UserBasic (Guid) ON DELETE CASCADE ON UPDATE RESTRICT;

      UserInfo的主键值和UserBasic的主键值是一样的,两个表是单向的一对一关系。UserBasic为主控方,UserInfo是被动方。
      用Middlegen生成的UserBasic.hbm.xml文件,修改后的内容如下:

  1Hibernate的一对一联系关系实例<转&gt<?xml version="1.0"?>
  2Hibernate的一对一联系关系实例<转&gt<!DOCTYPE hibernate-mapping PUBLIC
  3Hibernate的一对一联系关系实例<转&gt    "-//Hibernate/Hibernate Mapping DTD 2.0//EN"
  4Hibernate的一对一联系关系实例<转&gt    "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd" >
  5Hibernate的一对一联系关系实例<转&gt    
  6Hibernate的一对一联系关系实例<转&gt<hibernate-mapping>
  7Hibernate的一对一联系关系实例<转&gt<!-- 
  8Hibernate的一对一联系关系实例<转&gt    Created by the Middlegen Hibernate plugin 2.1
  9Hibernate的一对一联系关系实例<转&gt
 10Hibernate的一对一联系关系实例<转&gt    http://boss.bekk.no/boss/middlegen/
 11Hibernate的一对一联系关系实例<转&gt    http://www.hibernate.org/
 12Hibernate的一对一联系关系实例<转&gt-->
 13Hibernate的一对一联系关系实例<转&gt
 14Hibernate的一对一联系关系实例<转&gt<class 
 15Hibernate的一对一联系关系实例<转&gt    name="com.xxx.hibernate.UserBasic" 
 16Hibernate的一对一联系关系实例<转&gt    table="UserBasic"
 17Hibernate的一对一联系关系实例<转&gt    dynamic-update="true"
 18Hibernate的一对一联系关系实例<转&gt    dynamic-insert="true"
 19Hibernate的一对一联系关系实例<转&gt>
 20Hibernate的一对一联系关系实例<转&gt    <meta attribute="class-description" inherit="false">
 21Hibernate的一对一联系关系实例<转&gt       @hibernate.class
 22Hibernate的一对一联系关系实例<转&gt        table="UserBasic"
 23Hibernate的一对一联系关系实例<转&gt        dynamic-update="true"
 24Hibernate的一对一联系关系实例<转&gt        dynamic-insert="true"
 25Hibernate的一对一联系关系实例<转&gt    </meta>
 26Hibernate的一对一联系关系实例<转&gt
 27Hibernate的一对一联系关系实例<转&gt    <id
 28Hibernate的一对一联系关系实例<转&gt        name="guid"
 29Hibernate的一对一联系关系实例<转&gt        type="int"
 30Hibernate的一对一联系关系实例<转&gt        column="Guid"
 31Hibernate的一对一联系关系实例<转&gt    >
 32Hibernate的一对一联系关系实例<转&gt        <meta attribute="field-description">
 33Hibernate的一对一联系关系实例<转&gt           @hibernate.id
 34Hibernate的一对一联系关系实例<转&gt            generator-class="native"
 35Hibernate的一对一联系关系实例<转&gt            type="int"
 36Hibernate的一对一联系关系实例<转&gt            column="Guid"
 37Hibernate的一对一联系关系实例<转&gt
 38Hibernate的一对一联系关系实例<转&gt
 39Hibernate的一对一联系关系实例<转&gt        </meta>
 40Hibernate的一对一联系关系实例<转&gt        <generator class="native" />
 41Hibernate的一对一联系关系实例<转&gt    </id>
 42Hibernate的一对一联系关系实例<转&gt
 43Hibernate的一对一联系关系实例<转&gt    <property
 44Hibernate的一对一联系关系实例<转&gt        name="account"
 45Hibernate的一对一联系关系实例<转&gt        type="java.lang.String"
 46Hibernate的一对一联系关系实例<转&gt        column="Account"
 47Hibernate的一对一联系关系实例<转&gt        not-null="true"
 48Hibernate的一对一联系关系实例<转&gt        length="64"
 49Hibernate的一对一联系关系实例<转&gt    >
 50Hibernate的一对一联系关系实例<转&gt        <meta attribute="field-description">
 51Hibernate的一对一联系关系实例<转&gt           @hibernate.property
 52Hibernate的一对一联系关系实例<转&gt            column="Account"
 53Hibernate的一对一联系关系实例<转&gt            length="64"
 54Hibernate的一对一联系关系实例<转&gt            not-null="true"
 55Hibernate的一对一联系关系实例<转&gt        </meta>    
 56Hibernate的一对一联系关系实例<转&gt    </property>
 57Hibernate的一对一联系关系实例<转&gt    <property
 58Hibernate的一对一联系关系实例<转&gt        name="password"
 59Hibernate的一对一联系关系实例<转&gt        type="java.lang.String"
 60Hibernate的一对一联系关系实例<转&gt        column="Password"
 61Hibernate的一对一联系关系实例<转&gt        not-null="true"
 62Hibernate的一对一联系关系实例<转&gt        length="16"
 63Hibernate的一对一联系关系实例<转&gt    >
 64Hibernate的一对一联系关系实例<转&gt        <meta attribute="field-description">
 65Hibernate的一对一联系关系实例<转&gt           @hibernate.property
 66Hibernate的一对一联系关系实例<转&gt            column="Password"
 67Hibernate的一对一联系关系实例<转&gt            length="16"
 68Hibernate的一对一联系关系实例<转&gt            not-null="true"
 69Hibernate的一对一联系关系实例<转&gt        </meta>    
 70Hibernate的一对一联系关系实例<转&gt    </property>
 71Hibernate的一对一联系关系实例<转&gt    <property
 72Hibernate的一对一联系关系实例<转&gt        name="email"
 73Hibernate的一对一联系关系实例<转&gt        type="java.lang.String"
 74Hibernate的一对一联系关系实例<转&gt        column="Email"
 75Hibernate的一对一联系关系实例<转&gt        not-null="true"
 76Hibernate的一对一联系关系实例<转&gt        length="128"
 77Hibernate的一对一联系关系实例<转&gt    >
 78Hibernate的一对一联系关系实例<转&gt        <meta attribute="field-description">
 79Hibernate的一对一联系关系实例<转&gt           @hibernate.property
 80Hibernate的一对一联系关系实例<转&gt            column="Email"
 81Hibernate的一对一联系关系实例<转&gt            length="128"
 82Hibernate的一对一联系关系实例<转&gt            not-null="true"
 83Hibernate的一对一联系关系实例<转&gt        </meta>    
 84Hibernate的一对一联系关系实例<转&gt    </property>
 85Hibernate的一对一联系关系实例<转&gt
 86Hibernate的一对一联系关系实例<转&gt    <!-- Associations -->
 87Hibernate的一对一联系关系实例<转&gt  
 88Hibernate的一对一联系关系实例<转&gt    <!-- bi-directional one-to-one association to UserInfo -->
 89Hibernate的一对一联系关系实例<转&gt    <one-to-one
 90Hibernate的一对一联系关系实例<转&gt        name="userInfo"
 91Hibernate的一对一联系关系实例<转&gt        class="com.xxx.hibernate.UserInfo"
 92Hibernate的一对一联系关系实例<转&gt        cascade="save-update"
 93Hibernate的一对一联系关系实例<转&gt    >
 94Hibernate的一对一联系关系实例<转&gt        <meta attribute="field-description">
 95Hibernate的一对一联系关系实例<转&gt           @hibernate.one-to-one
 96               class="com.xxx.hibernate.UserInfo"
 97Hibernate的一对一联系关系实例<转&gt            cascade="save-update"
 98Hibernate的一对一联系关系实例<转&gt        </meta>
 99Hibernate的一对一联系关系实例<转&gt    </one-to-one>
100Hibernate的一对一联系关系实例<转&gt
101Hibernate的一对一联系关系实例<转&gt</class>
102Hibernate的一对一联系关系实例<转&gt</hibernate-mapping>

      由于在建立外键的时候就声明了ON DELETE CASCADE,所以在xml的配置文件中第97行声明为save-update。如果声明为all,那么在删除UserBasic表的数据时,会无谓的多出一条删除UserInfo的delete语句出来。
      UserInfo.hbm.xml文件的内容如下:

 1Hibernate的一对一联系关系实例<转&gt<?xml version="1.0"?>
 2Hibernate的一对一联系关系实例<转&gt<!DOCTYPE hibernate-mapping PUBLIC
 3Hibernate的一对一联系关系实例<转&gt    "-//Hibernate/Hibernate Mapping DTD 2.0//EN"
 4Hibernate的一对一联系关系实例<转&gt    "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd" >
 5Hibernate的一对一联系关系实例<转&gt    
 6Hibernate的一对一联系关系实例<转&gt<hibernate-mapping>
 7Hibernate的一对一联系关系实例<转&gt<!-- 
 8Hibernate的一对一联系关系实例<转&gt    Created by the Middlegen Hibernate plugin 2.1
 9Hibernate的一对一联系关系实例<转&gt
10Hibernate的一对一联系关系实例<转&gt    http://boss.bekk.no/boss/middlegen/
11Hibernate的一对一联系关系实例<转&gt    http://www.hibernate.org/
12Hibernate的一对一联系关系实例<转&gt-->
13Hibernate的一对一联系关系实例<转&gt
14Hibernate的一对一联系关系实例<转&gt<class 
15Hibernate的一对一联系关系实例<转&gt    name="com.xxx.hibernate.UserInfo" 
16Hibernate的一对一联系关系实例<转&gt    table="UserInfo"
17Hibernate的一对一联系关系实例<转&gt    dynamic-update="true"
18Hibernate的一对一联系关系实例<转&gt    dynamic-insert="true"
19Hibernate的一对一联系关系实例<转&gt>
20Hibernate的一对一联系关系实例<转&gt    <meta attribute="class-description" inherit="false">
21Hibernate的一对一联系关系实例<转&gt       @hibernate.class
22Hibernate的一对一联系关系实例<转&gt        table="UserInfo"
23Hibernate的一对一联系关系实例<转&gt        dynamic-update="true"
24Hibernate的一对一联系关系实例<转&gt        dynamic-insert="true"
25Hibernate的一对一联系关系实例<转&gt    </meta>
26Hibernate的一对一联系关系实例<转&gt
27Hibernate的一对一联系关系实例<转&gt    <id
28Hibernate的一对一联系关系实例<转&gt        name="guid"
29Hibernate的一对一联系关系实例<转&gt        type="int"
30Hibernate的一对一联系关系实例<转&gt        column="Guid"
31Hibernate的一对一联系关系实例<转&gt    >
32Hibernate的一对一联系关系实例<转&gt        <meta attribute="field-description">
33Hibernate的一对一联系关系实例<转&gt       

文章评论

Hibernate的一对一联系关系实例<转&gt
程序员的样子
Hibernate的一对一联系关系实例<转&gt
我是如何打败拖延症的
Hibernate的一对一联系关系实例<转&gt
程序员的鄙视链
Hibernate的一对一联系关系实例<转&gt
Java程序员必看电影
Hibernate的一对一联系关系实例<转&gt
什么才是优秀的用户界面设计
Hibernate的一对一联系关系实例<转&gt
程序员应该关注的一些事儿
Hibernate的一对一联系关系实例<转&gt
不懂技术不要对懂技术的人说这很容易实现
Hibernate的一对一联系关系实例<转&gt
“肮脏的”IT工作排行榜
Hibernate的一对一联系关系实例<转&gt
程序员必看的十大电影
Hibernate的一对一联系关系实例<转&gt
为啥Android手机总会越用越慢?
Hibernate的一对一联系关系实例<转&gt
10个帮程序员减压放松的网站
Hibernate的一对一联系关系实例<转&gt
当下全球最炙手可热的八位少年创业者
Hibernate的一对一联系关系实例<转&gt
“懒”出效率是程序员的美德
Hibernate的一对一联系关系实例<转&gt
10个调试和排错的小建议
Hibernate的一对一联系关系实例<转&gt
Web开发人员为什么越来越懒了?
Hibernate的一对一联系关系实例<转&gt
如何成为一名黑客
Hibernate的一对一联系关系实例<转&gt
Java 与 .NET 的平台发展之争
Hibernate的一对一联系关系实例<转&gt
老美怎么看待阿里赴美上市
Hibernate的一对一联系关系实例<转&gt
代码女神横空出世
Hibernate的一对一联系关系实例<转&gt
鲜为人知的编程真相
Hibernate的一对一联系关系实例<转&gt
程序员都该阅读的书
Hibernate的一对一联系关系实例<转&gt
程序员和编码员之间的区别
Hibernate的一对一联系关系实例<转&gt
程序员周末都喜欢做什么?
Hibernate的一对一联系关系实例<转&gt
一个程序员的时间管理
Hibernate的一对一联系关系实例<转&gt
科技史上最臭名昭著的13大罪犯
Hibernate的一对一联系关系实例<转&gt
旅行,写作,编程
Hibernate的一对一联系关系实例<转&gt
60个开发者不容错过的免费资源库
Hibernate的一对一联系关系实例<转&gt
为什么程序员都是夜猫子
Hibernate的一对一联系关系实例<转&gt
漫画:程序员的工作
Hibernate的一对一联系关系实例<转&gt
老程序员的下场
Hibernate的一对一联系关系实例<转&gt
总结2014中国互联网十大段子
Hibernate的一对一联系关系实例<转&gt
看13位CEO、创始人和高管如何提高工作效率
Hibernate的一对一联系关系实例<转&gt
十大编程算法助程序员走上高手之路
Hibernate的一对一联系关系实例<转&gt
5款最佳正则表达式编辑调试器
Hibernate的一对一联系关系实例<转&gt
每天工作4小时的程序员
Hibernate的一对一联系关系实例<转&gt
那些争议最大的编程观点
Hibernate的一对一联系关系实例<转&gt
亲爱的项目经理,我恨你
Hibernate的一对一联系关系实例<转&gt
中美印日四国程序员比较
Hibernate的一对一联系关系实例<转&gt
程序猿的崛起——Growth Hacker
Hibernate的一对一联系关系实例<转&gt
Web开发者需具备的8个好习惯
Hibernate的一对一联系关系实例<转&gt
如何区分一个程序员是“老手“还是“新手“?
Hibernate的一对一联系关系实例<转&gt
编程语言是女人
Hibernate的一对一联系关系实例<转&gt
程序员最害怕的5件事 你中招了吗?
Hibernate的一对一联系关系实例<转&gt
聊聊HTTPS和SSL/TLS协议
Hibernate的一对一联系关系实例<转&gt
初级 vs 高级开发者 哪个性价比更高?