天宇的JAVA空间站


Hibernate one-to-one

07-05-29 00:37Update

LifevV.COM编辑部

Hibernate的one-to-one关系向来令人头疼。下面举例说明hibernate中one-to-one关系的定义和实现方法。

Page:  <1|2>
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里声明:
        <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);


Page:  <1|2>
补充2:
1,可以不在Wife方申明many-to-one关系,而只在Husband方申明one-to-one关系映射。
2,如果需要删除Husband的时候同时删除Wife,可以在Husband的one-to-one加上cascade="delete"属性。
LifevV.COM编辑部 07-09-19 10:15
 
Copyright ©2006-2010 lifevv.com. All Rights Reserved
POWERED BY @pmplat.syboos.com