hibernate 中的主键一对一

引用:

题记:Hibernate是个好东西,可我感觉这个好东东不好驾御,一个one-to-one就让我花费了很多时间,现在终于有点理解,所以想给大家分享分享我的观点,如有差错,还请各位批评指正!

1.关于one-to-one

持久化对象之间一对一的关联关系是通过one-to-one元素定义:

<one-to-onename="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:属性的名字[POJO中的]。

(2)

class(可选-默认是通过反射得到的属性类型):被关联的类的名字。

(3)

cascade(级联)(可选)表明操作是否从父对象级联到被关联的对象。

(4)

constrained(约束)(可选)表明该类对应的表对应的数据库表,和被关联的对象所对应的数据库表之间,通过一个外键引用对主键进行约束。这个选项影响save()和delete()在级联执行时的先后顺序(也在schemaexporttool中被使用)。

(5)

outer-join(外连接)(可选-默认为自动):当设置hibernate.use_outer_join的时候,对这个关联允许外连接抓取。

(6)

property-ref:(可选)指定关联类的一个属性,这个属性将会和本外键相对应。如果没有指定,会使用对方关联类的主键[POJO中POJO类的实例]。

(7)

access(可选-默认是property):Hibernate用来访问属性的策略。

2.one-to-one分类

主键关联

惟一外键关联

主键关联不需要额外的表字段;两行是通过这种一对一关系相关联的,那么这两行就共享同样的主关键字值。所以如果你希望两个对象通过主键一对一关联,你必须确认它们被赋予同样的标识值!

另一种方式是一个外键和一个惟一关键字对应。

3.one-to-one中惟一外键关联操作

(1)数据库DDL

#

#Tablestructurefortable'author'

#

CREATETABLEauthor(

author_idchar(20)NOTNULLdefault'',

person_idchar(20)defaultNULL,

PRIMARYKEY(author_id)

)ENGINE=InnoDBDEFAULTCHARSET=gb2312;

#

#Tablestructurefortable'person'

#

CREATETABLEperson(

person_idchar(20)NOTNULLdefault'',

namechar(20)defaultNULL,

PRIMARYKEY(person_id)

)ENGINE=InnoDBDEFAULTCHARSET=gb2312;

(2)映射文件

Author.hbm.XML

<?xmlversion="1.0"?>

<!DOCTYPEhibernate-mappingPUBLIC

"-//Hibernate/HibernateMappingDTD2.0//EN"

"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">

<!--DONOTEDIT:Thisisageneratedfilethatissynchronized-->

<!--byMyEclipseHibernatetoolintegration.-->

<!--CreatedSatApr2314:28:37CST2005-->

<hibernate-mappingpackage="po">

<classname="Author"table="author">