先看单向一对一: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维护关系
*/
@Test
public 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);
}
}
新增正常!
第二种:
/**
* 由不维护关系的那一端设置的话,不好意思,会出错的
*/
@Test
public 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不维护关系
@Test
public 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);
}
}
@Test
public 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
*/