Hibernate one-to-one
07-05-29 00:37Update
Hibernate的one-to-one关系向来令人头疼。下面举例说明hibernate中one-to-one关系的定义和实现方法。
one-to-one关系的现实模型: 现代社会的一夫一妻制度就是典型的one-to-one关系模型。
在数据库设计里,one-to-one模型可以用2种方法来实现。
1,主键关联:这时候要保证2个表的主键具有完全相同的值。
2,外键关联:其中一个表使用外键关联另一个表。
one-to-one在hibernate里的实现,同样可以用2种方式实现。
为了便于理解,我们就使用这个模型作为我们的范例。
模型:husband vs wife(夫:妻)
Hibernate one-to-one实现方法1:
使用主键关联。为了保证2个表被生成的主键具有相同的值,其中一个表的主键生成要采用foreign生成方式。告诉hibernate此表的主键采用外键方式。在我们的例子里,我们在Wife.hbm.xml里声明:
表示WIFE的主键是外键,引用HUSBAND.ID。
具体请参考以下解释。
CREATE TABLE SQL:
To keep relationship of one-to-one, the HUSBAND.id must equals WIFE.id as a pair.
In Husband.hbm.xml
In Wife.hbm.xml
请注意这里的constrained属性,它必须要被设置为"true"。one-to-one关系是需要在双方的hbm文件里定义。constrained="true"必须在声明为外键的一方加以定义。在我们的例子里,WIFE.ID被声明为外键,所以在Wife.hbm.xml里为one-to-one加上constrained="true"。
In TestCase
在数据库设计里,one-to-one模型可以用2种方法来实现。
1,主键关联:这时候要保证2个表的主键具有完全相同的值。
2,外键关联:其中一个表使用外键关联另一个表。
one-to-one在hibernate里的实现,同样可以用2种方式实现。
为了便于理解,我们就使用这个模型作为我们的范例。
模型:husband vs wife(夫:妻)
Hibernate one-to-one实现方法1:
使用主键关联。为了保证2个表被生成的主键具有相同的值,其中一个表的主键生成要采用foreign生成方式。告诉hibernate此表的主键采用外键方式。在我们的例子里,我们在Wife.hbm.xml里声明:
<generator class="foreign"> <param name="property">husband</param> </generator>
表示WIFE的主键是外键,引用HUSBAND.ID。
具体请参考以下解释。
CREATE TABLE SQL:
# # husband TABLE # CREATE TABLE HUSBAND ( ID CHAR(32) NOT NULL, NAME CHAR(32) NOT NULL, PRIMARY KEY(id) ) # # wife TABLE # CREATE TABLE WIFE ( ID CHAR(32) NOT NULL, NAME CHAR(32) NOT NULL, PRIMARY KEY(id) )
To keep relationship of one-to-one, the HUSBAND.id must equals WIFE.id as a pair.
In Husband.hbm.xml
<class name="Husband" table="HUSBAND"> <id name="id" column="ID"> <generator class="uuid.hex" /> </id> <one-to-one name="wife" class="Wife" /> </class>
In Wife.hbm.xml
<class name="Wife" table="WIFE"> <id name="id" column="ID" type="java.lang.String" length="32"> <generator class="foreign"> <param name="property">husband</param> </generator> </id> <one-to-one name="husband" class="Husband" constrained="true" /> </class>
请注意这里的constrained属性,它必须要被设置为"true"。one-to-one关系是需要在双方的hbm文件里定义。constrained="true"必须在声明为外键的一方加以定义。在我们的例子里,WIFE.ID被声明为外键,所以在Wife.hbm.xml里为one-to-one加上constrained="true"。
In TestCase
Husband zhangshan = new Husband(); zhangshan.setName(“Zhangshan”); Wife lisi = new Husband(); lisi.setName(“Lisi”); zhangshan.setWife(lisi); lisi.setHusband(zhangshan); session.save(zhangshan); session.save(lisi);
- Relative Articles
- Hibernate one-to-one 的N+1问题分析及其解决方法 - (08-02-28 22:15)
- Hibernate 中的many-to-many关系 - (07-05-29 00:38)
- Hibernate one-to-many / many-to-one关系映射 - (07-05-29 00:32)