hibernate 一对一 和 N-1
Hibernate 一对一外键单向关联? ??
?事实上,单向1-1与N-1的实质是相同的,1-1是N-1的特例,单向1-1与N-1的映射配置也非常相似。只需要将原来的many-to-one元素增加unique="true"属性,用于表示N的一端也必须是唯一的,在N的一端增加了唯一的约束,即成为单向1-1。基于外键的单向1-1的配置将与无连接表N-1关联的many-to-one增加unique="true"属性即可。
?
one-to-one 不会加载字段,它告诉HIBERNATE 怎样加载其引用对象.如何加载呢,默认根据?主键加载其引用对象.如在t_person 中查到id=2,自动加载t_idCard 中id=2的对象信息.?constrained="true",表明person主键是个外键,表示当前主键上存在着idCard约束,当?前主键id作为外键,参照了idCard.?
?
大家都知道hibernate中的one-to-one映射主要有两种策略,(1)一对一主键关联(单向和双向)。(2)一对一外键映射(单项和双向)。本文主要讲解一下,一对一外键映射中的双向问题,在此前先通过一个实例了解。
? person和idCard,是一种一对一的关系,其中
??
t_person表??????????????????????????????
id???????name?????? idCard(unique)?
1?????????张三?????
2 ??王五?????? 1?
其中王五是没有idcard,这也符合现实中的,有些人是没有身份证的。
t_idCard表
id???????? cardNo?
1 ?? 11111111111111?
实体类:
??? IdCard
?
Person的:?
(3)
向t_person中插入数据:?
结果如下:
??? Hibernate: select person0_.id as id0_0_, person0_.name asname0_0_, person0_.card_ID as card3_0_0_ from t_person person0_ whereperson0_.id=??
person.name=王五
??????? Hibernate: select idcard0_.id asid1_1_, idcard0_.cardNo as cardNo1_1_, person1_.id as id0_0_, person1_.name asname0_0_, person1_.card_ID as card3_0_0_ from t_idCard idcard0_ left outer joint_person person1_ on idcard0_.id=person1_.id where idcard0_.id=??
??? person.cardNo=1111111111?这样的就找到了person对应的idcard,那能不能有idCard找到person呢??
结果如下:
Hibernate: select idcard0_.id as id1_1_, idcard0_.cardNo as cardNo1_1_,person1_.id as id0_0_, person1_.name as name0_0_, person1_.card_ID ascard3_0_0_ from t_idCard idcard0_ left outer join t_person person1_ onidcard0_.id=person1_.id where idcard0_.id=??
idCard.cardNo=1111111111?
idCard.person.name=张三
结果对吗?
??肯定不对,idCard.cardNo=1111111111这是王五的idCard,怎么查出来张三的呢?原因在于:
idCard的配置文件问题:
应该在idCard的配置文件的<one-to-one name="person"?class="Person"? />?
修改为<one-to-one name="person"?class="Person"? property-ref="idCard"/>?
因为:如果不修改则idCard会根据自己的id和person中的id比较(因为one-to-one是通过id查找到的),这样是不符合要求的,因为我们t_idcard中的id和t_person中 Card_ID相比较,这样的话可以通过
property-ref="idCard"?的设置找到t_person表中Card_ID和它作比较找到我们要找的数据。?
?