Hibernate的一对一关联实例<转>
Hibernate的一对一关联实例
Hibernate中的表的关联有一对一,一对多和多对多三种关联方式,在这篇笔记和接下来的笔记中,我将用我自己的实际例子来说明如何具体实施。
??????我使用的Hibernate版本是2.1.8,在Hibernate的网站2.1.6版本的中文文档中有关一对一的关联有下面一段表述:
5.1.11.?一对一
持久化对象之间一对一的关联关系是通过one-to-one元素定义的。?
<one-to-one
????????name="propertyName"????????????????????????????????(1)
????????class="ClassName"??????????????????????????????????(2)
????????cascade="all|none|save-update|delete"??????????????(3)
????????constrained="true|false"???????????????????????????(4)
????????outer-join="true|false|auto"???????????????????????(5)
????????property-ref="propertyNameFromAssociatedClass"?????(6)
????????access="field|property|ClassName"??????????????????(7)
????????
/>
(1)?name:?属性的名字。?
?
(2)?class?(可选?-?默认是通过反射得到的属性类型):被关联的类的名字。?
?
(3)?cascade(级联)?(可选)?表明操作是否从父对象级联到被关联的对象。?
?
(4)?constrained(约束)?(可选)?表明该类对应的表对应的数据库表,和被关联的对象所对应的数据库表之间,通过一个外键引用对主键进行约束。这个选项影响save()和delete()在级联执行时的先后顺序(也在schema?export?tool中被使用)。?
?
(5)?outer-join(外连接)?(可选?-?默认为?自动):?当设置hibernate.use_outer_join的时候,对这个关联允许外连接抓取。?
?
(6)?property-ref:?(可选)?指定关联类的一个属性,这个属性将会和本外键相对应。如果没有指定,会使用对方关联类的主键。?
?
(7)?access?(可选?-?默认是?property):?Hibernate用来访问属性的策略。?
?
有两种不同的一对一关联:?
主键关联?
惟一外键关联?
主键关联不需要额外的表字段;两行是通过这种一对一关系相关联的,那么这两行就共享同样的主关键字值。所以如果你希望两个对象通过主键一对一关联,你必须确认它们被赋予同样的标识值!?
比如说,对下面的Employee和Person进行主键一对一关联:?
<one-to-one?name="person"?class="Person"/>
<one-to-one?name="employee"?class="Employee"?constrained="true"/>
现在我们必须确保PERSON和EMPLOYEE中相关的字段是相等的。我们使用一个特别的称为foreign的Hibernate标识符生成器策略:?
<class?name="person"?table="PERSON">
????<id?name="id"?column="PERSON_ID">
????????<generator?class="foreign">
????????????<param?name="property">employee</param>
????????</generator>
????</id>
????
????<one-to-one?name="employee"
????????class="Employee"
????????constrained="true"/>
</class>
一个刚刚保存的Person实例被赋予和该Person的employee属性所指向的Employee实例同样的关键字值。?
另一种方式是一个外键和一个惟一关键字对应,上面的Employee和Person的例子,如果使这种关联方式,应该表达成:?
<many-to-one?name="person"?class="Person"?column="PERSON_ID"?unique="true"/>
如果在Person的映射加入下面几句,这种关联就是双向的:?
<one-to-one?name"employee"?class="Employee"?property-ref="person"/>
??????
CREATE?TABLE?IF?NOT?EXISTS?UserBasic
(
???Guid???????????????????????????INT????????????????????????????NOT?NULL?AUTO_INCREMENT,
???Account????????????????????????VARCHAR(64)????????????????????NOT?NULL,
???Password???????????????????????VARCHAR(16)????????????????????NOT?NULL,
???Email??????????????????????????VARCHAR(128)???????????????????NOT?NULL,
???PRIMARY?KEY?(Guid)
)?TYPE=InnoDB;
CREATE?TABLE?IF?NOT?EXISTS?UserInfo
(
???Guid???????????????????????????INT????????????????????????????NOT?NULL,
???Username???????????????????????VARCHAR(128),
???Gender?????????????????????????CHAR(1),
???Birthday???????????????????????DATETIME,
???PRIMARY?KEY?(Guid)
)?TYPE=InnoDB;
ALTER?TABLE?UserInfo?ADD?CONSTRAINT?UserInfoRFUserBasic?FOREIGN?KEY?(Guid)?
???REFERENCES?UserBasic?(Guid)?ON?DELETE?CASCADE?ON?UPDATE?RESTRICT;
<?xml?version="1.0"?>
<!DOCTYPE?hibernate-mapping?PUBLIC
????"-//Hibernate/Hibernate?Mapping?DTD?2.0//EN"
????"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd"?>
????
<hibernate-mapping>
<!--?
????Created?by?the?Middlegen?Hibernate?plugin?2.1
????http://boss.bekk.no/boss/middlegen/
????http://www.hibernate.org/
-->
<class?
????name="com.xxx.hibernate.UserBasic"?
????table="UserBasic"
????dynamic-update="true"
????dynamic-insert="true"
>
????<meta?attribute="class-description"?inherit="false">
???????@hibernate.class
????????table="UserBasic"
????????dynamic-update="true"
????????dynamic-insert="true"
????</meta>
????<id
????????name="guid"
????????type="int"
????????column="Guid"
????>
????????<meta?attribute="field-description">
???????????@hibernate.id
????????????generator-alt="Hibernate的一对一联系关系实例<转>" src="//img.reader8.net/uploadfile/jiaocheng/20140188/3040/201401301440589455.gif">????????????type="int"
????????????column="Guid"

????????</meta>
????????<generator?class="native"?/>
????</id>
????<property
????????name="account"
????????type="java.lang.String"
????????column="Account"
????????not-null="true"
????????length="64"
????>
????????<meta?attribute="field-description">
???????????@hibernate.property
????????????column="Account"
????????????length="64"
????????????not-null="true"
????????</meta>????
????</property>
????<property
????????name="password"
????????type="java.lang.String"
????????column="Password"
????????not-null="true"
????????length="16"
????>
????????<meta?attribute="field-description">
???????????@hibernate.property
????????????column="Password"
????????????length="16"
????????????not-null="true"
????????</meta>????
????</property>
????<property
????????name="email"
????????type="java.lang.String"
????????column="Email"
????????not-null="true"
????????length="128"
????>
????????<meta?attribute="field-description">
???????????@hibernate.property
????????????column="Email"
????????????length="128"
????????????not-null="true"
????????</meta>????
????</property>
????<!--?Associations?-->
??
????<!--?bi-directional?one-to-one?association?to?UserInfo?-->
????<one-to-one
????????name="userInfo"
????????class="com.xxx.hibernate.UserInfo"
????????cascade="save-update"
????>
????????<meta?attribute="field-description">
???????????@hibernate.one-to-one
????????</meta>
????</one-to-one>
</class>
</hibernate-mapping>
<?xml?version="1.0"?>
<!DOCTYPE?hibernate-mapping?PUBLIC
????"-//Hibernate/Hibernate?Mapping?DTD?2.0//EN"
????"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd"?>
????
<hibernate-mapping>
<!--?
????Created?by?the?Middlegen?Hibernate?plugin?2.1
????http://boss.bekk.no/boss/middlegen/
????http://www.hibernate.org/
-->
<class?
????name="com.xxx.hibernate.UserInfo"?
????table="UserInfo"
????dynamic-update="true"
????dynamic-insert="true"
>
????<meta?attribute="class-description"?inherit="false">
???????@hibernate.class
????????table="UserInfo"
????????dynamic-update="true"
????????dynamic-insert="true"
????</meta>
????<id
????????name="guid"
????????type="int"
????????column="Guid"
????>
????????<meta?attribute="field-description">
???????