Hibernate中one-to-one学习札记
1.关于one-to-one
?
?? ?持久化对象之间一对一的关联关系是通过one-to-one元素定义:
?
<one-to-one
?? ? ? ?name="propertyName" ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?(1)
?? ? ? ?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?(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()在级联执行时的先后顺序(也在schema export tool中被使用)。
?
(5)
outer-join(外连接) (可选 - 默认为 自动): 当设置hibernate.use_outer_join的时候,对这个关联允许外连接抓取。
?
(6)
property-ref: (可选) 指定关联类的一个属性,这个属性将会和本外键相对应。如果没有指定,会使用对方关联类的主键[POJO中POJO类的实例]。
?
(7)
access (可选 - 默认是 property): Hibernate用来访问属性的策略。
?
2.one-to-one分类
?
主键关联
?
惟一外键关联
?
主键关联不需要额外的表字段;两行是通过这种一对一关系相关联的,那么这两行就共享同样的主关键字值。所以如果你希望两个对象通过主键一对一关联,你必须确认它们被赋予同样的标识值!
?
另一种方式是一个外键和一个惟一关键字对应。
?
?
深入探讨
?????a.由于主键采用assigned方式,必须自己指定ID;
??? b.如果只采用session.save(author);将会产生级联错误[ Could not synchronize database state with session???????????? net.sf.hibernate.HibernateException: Batch update row count wrong: 0],看看执行的SQL语句[Hibernate: insert into author (person_id, author_id) values (?, ?)?? Hibernate: update person set name=? where person_id=?]很明白是吧,因为person表还是空的,当然执行update操作会失败!虽然解决的方法很简单,可问题值得思考!虽然对person进行了setter方法,可不要忘了他仍旧是VO而不是PO!