关于hibernate中双向外键关联one-to-one的property-ref=的问题
来源:互联网 发布:qq国际网络 编辑:程序博客网 时间:2024/05/24 01:49
person和idCard,是一种一对一的关系,其中
t_person表
id name idCard(unique)
1 张三
2 王五 1
其中王五是没有idcard,这也符合现实中的,有些人是没有身份证的。
t_idCard表
id cardNo
1 11111111111111
实体类:
IdCard
- <span style="font-family:SimHei;font-size:18px;color:#000000;">package com.bjpowernode.hibernate;
- public class IdCard {
- private int id;
- private String cardNo;
- private Person person;
- public Person getPerson() {
- return person;
- }
- public void setPerson(Person person) {
- this.person = person;
- }
- public int getId() {
- return id;
- }
- public void setId(int id) {
- this.id = id;
- }
- public String getCardNo() {
- return cardNo;
- }
- public void setCardNo(String cardNo) {
- this.cardNo = cardNo;
- }
- }
- </span>
Person
- <span style="font-family:SimHei;font-size:18px;color:#000000;">package com.bjpowernode.hibernate;
- public class Person {
- private int id;
- private String name;
- private IdCard idCard;
- public int getId() {
- return id;
- }
- public void setId(int id) {
- this.id = id;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public IdCard getIdCard() {
- return idCard;
- }
- public void setIdCard(IdCard idCard) {
- this.idCard = idCard;
- }
- }
- </span>
(3)配置文件
IdCard的:
- <span style="font-family:SimHei;font-size:18px;color:#000000;"> <?xml version="1.0"?>
- <!DOCTYPE hibernate-mapping PUBLIC
- "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
- "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
- <hibernate-mapping package="com.bjpowernode.hibernate">
- <class name="IdCard" table="t_idCard">
- <id name="id">
- <generator class="native"/>
- </id>
- <property name="cardNo"/>
- <one-to-one name="person" class="Person" />
- </class>
- </hibernate-mapping>
- </span>
Person的:
- <span style="font-family:SimHei;"><span style="font-size:18px;color:#000000;"><?xml version="1.0"?>
- <!DOCTYPE hibernate-mapping PUBLIC
- "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
- "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
- <hibernate-mapping package="com.bjpowernode.hibernate">
- <class name="Person" table="t_person">
- <id name="id">
- <generator class="native"/>
- </id>
- <property name="name"/>
- <many-to-one name="idCard" cascade="all" class="IdCard"
- unique="true" column="card_ID" />
- </class>
- </hibernate-mapping>
- </span><span style="font-size:18px;color:#000000;">(3)</span></span><span style="color:#000000;"><span style="font-family:SimHei;font-size:18px;">
- 向t_person中插入数据: </span></span>
- <span style="font-family:SimHei;font-size:18px;color:#000000;">import org.hibernate.Session;
- import junit.framework.TestCase;
- public class One2OneTest extends TestCase {
- public void testSave1() {
- Session session = null;
- try {
- session = HibernateUtils.getSession();
- session.beginTransaction();
- Person person = new Person();
- person.setName("张三");
- session.save(person);
- session.getTransaction().commit();
- }catch(Exception e) {
- e.printStackTrace();
- session.getTransaction().rollback();
- }finally {
- HibernateUtils.closeSession(session);
- } </span>
结果如下:
- <span style="font-family:SimHei;font-size:18px;color:#000000;">mysql> select * from t_person; </span>
+----+------+---------+
| id | name | card_ID |
+----+------+---------+
| 1 | 张三 | NULL |
+----+------+---------+
1 row in set (0.00 sec)
- <span style="font-family:SimHei;font-size:18px;color:#000000;">mysql> select * from t_idcard; </span>
Empty set (0.00 sec)
在插入数据:
- <span style="font-family:SimHei;font-size:18px;color:#000000;">public void testSave2() {
- Session session = null;
- try {
- session = HibernateUtils.getSession();
- session.beginTransaction();
- IdCard idCard = new IdCard();
- idCard.setCardNo("1111111111");
- session.save(idCard);
- Person person = new Person();
- person.setName("王五");
- //建立关联
- person.setIdCard(idCard);
- session.save(person);
- session.getTransaction().commit();
- }catch(Exception e) {
- e.printStackTrace();
- session.getTransaction().rollback();
- }finally {
- HibernateUtils.closeSession(session);
- }
- } </span>
数据库中的结果如下:
- <span style="font-family:SimHei;font-size:18px;color:#000000;">mysql> select * from t_person; </span>
+----+------+---------+
| id | name | card_ID |
+----+------+---------+
| 1 | 张三 | NULL |
| 2 | 王五 | 1 |
+----+------+---------+
2 rows in set (0.00 sec)
- <span style="font-family:SimHei;font-size:18px;color:#000000;">mysql> select * from t_idcard; </span>
+----+------------+
| id | cardNo |
+----+------------+
| 1 | 1111111111 |
+----+------------+
1 row in set (0.00 sec)
(4)加载数据,这样的话就可以从person的一端加载到idCard,
如下:
- <span style="font-family:SimHei;font-size:18px;color:#000000;">public void testLoad1() {
- Session session = null;
- try {
- session = HibernateUtils.getSession();
- session.beginTransaction();
- Person person = (Person)session.load(Person.class, 2);
- System.out.println("person.name=" + person.getName());
- System.out.println("person.cardNo=" + person.getIdCard().getCardNo());
- session.getTransaction().commit();
- }catch(Exception e) {
- e.printStackTrace();
- session.getTransaction().rollback();
- }finally {
- HibernateUtils.closeSession(session);
- }
- } </span>
结果如下:
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呢?
- <span style="font-family:SimHei;font-size:18px;color:#000000;">public void testLoad2() {
- Session session = null;
- try {
- session = HibernateUtils.getSession();
- session.beginTransaction();
- //
- IdCard idCard = (IdCard)session.load(IdCard.class, 1);
- System.out.println("idCard.cardNo=" + idCard.getCardNo());
- System.out.println("idCard.person.name=" + idCard.getPerson().getName());
- session.getTransaction().commit();
- }catch(Exception e) {
- e.printStackTrace();
- session.getTransaction().rollback();
- }finally {
- HibernateUtils.closeSession(session);
- }
- } </span>
结果如下:
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和它作比较找到我们要找的数据。
- 关于hibernate中双向外键关联one-to-one的property-ref=的问题
- 关于hibernate中双向外键关联one-to-one的property-ref=的问题
- 关于hibernate中双向外键关联one-to-one的property-ref=的问题
- 双向外键关联one-to-one的property-ref=的问题
- Hibernate之one-to-one双向外键关联Annotation
- Hibernate使用property-ref属性解决遗留数据库One To Many关系的问题。
- Hibernate使用property-ref属性解决遗留数据库One To Many关系的问题。
- Hibernate中property-ref的使用,常用来解决遗留数据库One To Many关系
- Hibernate中property-ref的使用,常用来解决遗留数据库One To Many关
- hibernate one-to-one外键关联
- 关于hibernate one to one报错问题的总结
- hibernate 雙向 <one-to-one>中的property-ref属性
- one-to-one外键双向关联之建表
- Hibernate one-to-many many-to-one 双向关联
- Hibernate学习笔记:一对多的关联关系(one-to-many) 双向关联
- Hibernate学习笔记:一对多的关联关系(one-to-many) 双向关联
- Hibernate学习笔记:一对一的关联关系(one-to-one)
- Hibernate之one-to-one外键关联映射
- JVM各区域的用途
- HDU——1286找新朋友(欧拉函数)
- JAVA基础:对象的行为注意细节
- 1、微信小程序笔记---框架
- HDU 5092 Seam Carving 递推
- 关于hibernate中双向外键关联one-to-one的property-ref=的问题
- 6. 移动端Web开发调试之Chrome远程调试(Remote Debugging)
- URL、URN与URI
- html5中的canvas手册
- JAVA基础:数组细节
- Linux进程调度(1):CFS调度器的设计框架
- bootstrap+jquery validate 验证
- Hadoop 新 MapReduce 框架 Yarn 详解
- VS上配置opencv249所添加的附加依赖项