深入研究Hibernate之八:一对一
来源:互联网 发布:myeclipse新建java项目 编辑:程序博客网 时间:2024/06/04 18:01
先看单向一对一:IDCard和Person,由IDCard维护关系
package org.yanglg.hibernate.model;public class Person {private int id;private String name;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;}}
package org.yanglg.hibernate.model;public class IDCard {private int id;private String idcard;private Person person;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getIdcard() {return idcard;}public void setIdcard(String idcard) {this.idcard = idcard;}public Person getPerson() {return person;}public void setPerson(Person person) {this.person = person;}}
<?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><class name="org.yanglg.hibernate.model.IDCard" table="t_idcard"><id name="id"><generator class="native" /></id><property name="idcard" /><many-to-one name="person" column="pid" unique="true" /></class></hibernate-mapping>
<?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><class name="org.yanglg.hibernate.model.Person" table="t_person"><id name="id"><generator class="native" /></id><property name="name" /></class></hibernate-mapping>
下面来看第一种方式新增数据:
/** * IdCard维护关系 */@Testpublic void testAdd2() {Session session = null;try {session = HibernateUtils.openSession();session.beginTransaction();Person p = new Person();p.setName("p001");session.save(p);IDCard id = new IDCard();id.setIdcard("001");id.setPerson(p);session.save(id);session.getTransaction().commit();} catch (Exception e) {if (session != null) {session.getTransaction().rollback();}} finally {HibernateUtils.closeSession(session);}}新增正常!
第二种:
/** * 由不维护关系的那一端设置的话,不好意思,会出错的 */@Testpublic void testAdd3() {Session session = null;try {session = HibernateUtils.openSession();session.beginTransaction();IDCard id = new IDCard();id.setIdcard("001");session.save(id);Person p = new Person();p.setName("p001");p.setIdCard(id);session.save(p);session.getTransaction().commit();} catch (Exception e) {if (session != null) {session.getTransaction().rollback();}e.printStackTrace();} finally {HibernateUtils.closeSession(session);}}也没有报错,BUT,数据库中IDCard的pid字段为NULL!
所以还是那个结论,先保存不维护关系(Person)的一端,再保存维护关系的一端(IDCard)!
再看双向一对一:
Person实体类中是要加IDCard的引用的,并且IDCard的映射文件没有变化,这里就不引入代码了
<?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><class name="org.yanglg.hibernate.model.Person" table="t_person"><id name="id"><generator class="native" /></id><property name="name" /><one-to-one name="idCard" property-ref="person"></one-to-one></class></hibernate-mapping>
<one-to-one name="idCard" property-ref="person"></one-to-one>这句表示person不维护关系
@Testpublic void testLoad2() {Session session = null;try {session = HibernateUtils.openSession();IDCard c = (IDCard) session.load(IDCard.class, 1);System.out.println(c.getIdcard());System.out.println(c.getPerson());} catch (Exception e) {e.printStackTrace();} finally {HibernateUtils.closeSession(session);}}@Testpublic void testLoad3() {Session session = null;try {session = HibernateUtils.openSession();Person person = (Person)session.load(Person.class, 1);System.out.println(person.getName());System.out.println(person.getIdCard());} catch (Exception e) {e.printStackTrace();} finally {HibernateUtils.closeSession(session);}}/** * 在双向一对一时,取数据时,一定要从没有维护关系的取起,要不会多发SQL */
- 深入研究Hibernate之八:一对一
- Hibernate(八)多表联查之双向一对一
- Hibernate 深入研究之 Criteria
- Hibernate 深入研究之 Criteria
- Hibernate 深入研究之 Criteria
- Hibernate 深入研究之 Criteria
- Hibernate 深入研究之 Criteria
- Hibernate 深入研究之 Criteria
- Hibernate之一对一映射
- hibernate之一对一
- 深入研究Hibernate之四:HQL查询
- 深入研究Hibernate之六:原生SQL
- 深入研究Hibernate之七:一级缓存
- Hibernate基础之八:一对一单/双向,主/外键关联 @OneToOne@JoinColumn
- Hibernate 一对一双向关联深入详解
- Hibernate之一对一关联映射
- hibernate映射之一对一映射
- Hibernate学习之一对一映射
- 函数设计的一般原则和技巧
- java实现简单语法分析器
- Linux 内存管理子系统导读
- arm9 norflash与nandflash启动过程分析
- 内存映射文件&PE内存映像
- 深入研究Hibernate之八:一对一
- 看书笔记(二)
- 织梦系统使用总结
- TCP和UDP网络通讯的区别及实现方式
- ajax中的xml传送乱码问题
- hdu 1850 Being a Good Boy in Spring Festival(尼姆博弈)
- HTTP协议之缓存
- page fault 过程
- springside4