深入研究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 */




原创粉丝点击