业务需求:增加一个人,这个人有两个地址,人是一张表,两个地址是一张表。一个人,两个地址全部保存是一个事务,否则谁也不保存。
1,Person类:
Person的映射文件:
2,Address类
Address映射文件:
3,测试类:
1,Person类:
package com.supan.bean;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class Person {
private int id;
private String name;
private int age;
private Set<Address> addresss = new HashSet<Address>();
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 int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Set<Address> getAddresss() {
return addresss;
}
public void setAddresss(Set<Address> addresss) {
this.addresss = addresss;
}
}
Person的映射文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping default-lazy="true" default-access="property" package="com.supan.bean" >
<class name="Person" dynamic-update="true" dynamic-insert="true" table="myperson">
<id name="id" column="id" type="integer">
<generator class="native"/>
</id>
<property name="name" type="string" column="name" length="20"/>
<property name="age" type="integer" column="age" length="3"/>
<set name="addresss" inverse="true" cascade="all" >
<key column="personid"/>
<one-to-many class="Address"/>
</set>
</class>
</hibernate-mapping>
2,Address类
package com.supan.bean;
public class Address {
private int id;
private String name;
private String info;
private String remark;
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 getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
public String getRemark() {
return remark;
}
public void setRemark(String remark) {
this.remark = remark;
}
}
Address映射文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping default-lazy="true" default-access="property" package="com.supan.bean" >
<class name="Address" dynamic-update="true" dynamic-insert="true" table="address">
<id name="id" column="id" type="integer">
<generator class="native"/>
</id>
<property name="name" type="string" column="NAME" length="20"/>
<property name="info" type="string" column="INFO" length="30"/>
<property name="remark" type="string" column="REMARK" length="30"/>
<many-to-one name="person" class="Person" column="personid" not-null="true"></many-to-one>
</class>
</hibernate-mapping>
3,测试类:
/**
* 该测试类,结果是,人,和两个地址都保存不成功,事务回滚
*/
public void testInsert() {
Configuration config = new Configuration().configure();
SessionFactory sf = config.buildSessionFactory();
Session sess = sf.openSession();
Transaction tx = null;
try {
sess = sf.openSession();
tx = sess.beginTransaction();// 相当于JDBC的connection.setAutoCommit(false);
Person person = new Person();
person.setName("陈超阳");
person.setAge(27);
//先保存人,这个人是一定能保存成功的。
sess.save(person);
System.out.println("人已经保存到数据库中");
Address address = new Address();
address.setName("aaaaa");
address.setInfo("aaaaa");
address.setRemark("aaaaa");
//保存第一个地址,这个地址是保存不成功的,因为personid不能为null
//该句会抛出一个异常
sess.persist(address);
Address address2 = new Address();
address2.setName("bbbbbbbbbb");
address2.setInfo("bbbbbbbbbbb");
address2.setRemark("bbbbbbbbbb");
sess.persist(address2);
tx.commit();//
} catch (HibernateException e) {
if (tx != null)
tx.rollback();// 相当于JDBC的connection.rollback();
throw e;
} finally {
if (sess != null)
sess.close();
}
}