关于hibernate中双向外键关联one-to-one的property-ref=的有关问题
大家都知道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)配置文件
IdCard的:
Person的:
结果如下:
+----+------+---------+
| id | name | card_ID |
+----+------+---------+
| 1 | 张三 | NULL |
+----+------+---------+
1 row in set (0.00 sec)
Empty set (0.00 sec)
在插入数据:
数据库中的结果如下:
+----+------+---------+
| id | name | card_ID |
+----+------+---------+
| 1 | 张三 | NULL |
| 2 | 王五 | 1 |
+----+------+---------+
2 rows in set (0.00 sec)
+----+------------+
| id | cardNo |
+----+------------+
| 1 | 1111111111 |
+----+------------+
1 row in set (0.00 sec)
(4)加载数据,这样的话就可以从person的一端加载到idCard,
如下:
结果如下:
Hibernate: select person0_.id as id0_0_, person0_.name as name0_0_, person0_.card_ID as card3_0_0_ from t_person person0_ where person0_.id=?
person.name=王五
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 as card3_0_0_ from t_idCard idcard0_ left outer join t_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 as card3_0_0_ from t_idCard idcard0_ left outer join t_person person1_ on idcard0_.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和它作比较找到我们要找的数据。