sql脚本:
--创建表
create table Person4 ( personId number(10) not null primary key ,personName NVARCHAR2(100));
create table Address4 ( addressId number(10) not null primary key,addressName NVARCHAR2(100));
address.hbm.xml:
<class name="com.chenjun.eshop.staffManage.domain.Address"
table="Address4">
<id name="id" column="addressId"> <!-- addressid引用的是person表的主键personid,也就是两表共用主键 -->
<generator class="foreign">
<param name="property">person</param> <!-- person就是session应该保存的对象,由它来级联保存address -->
</generator>
</id>
<property name="addressName"></property>
<one-to-one name="person" />
</class>
person.hbm.xml:
<class name="com.chenjun.eshop.staffManage.domain.Person"
table="Person4">
<id name="id" column="personId">
<generator class="assigned"><!-- 由程序分配主键 -->
</generator>
</id>
<property name="personName"></property>
<one-to-one name="address" cascade="all"/> <!-- 这里cascade不能少,否则当insert person时,address不能级联insert -->
</class>
测试代码:
/**
* 根据人级联查到它所在地址,或者根据地址级联查到人
*/
public void getAddressByPerson()
{
Session session = this.getHibernateTemplate().getSessionFactory().openSession();
session.beginTransaction();
Address address = (Address) session.get(Address.class, Integer.valueOf(2));
System.out.println(address.getAddressName());
System.out.println(address.getPerson().getId()+":"+address.getPerson().getPersonName());
}
/**
* 添加人员
*/
private void addPerson()
{
Person person = new Person();
person.setId(2);
person.setPersonName("王五");
Address address = new Address();
address.setAddressName("上海");
address.setPerson(person);// 双向关联
person.setAddress(address);// 双向关联
Session session = this.getHibernateTemplate().getSessionFactory().openSession();
session.beginTransaction();
session.save(person); // 只需保存有外键一方的对象,那么该外键的主键方也会自动保存
// session.save(address); //如果这样执行的话,不会保存任何表,报cannot execute batch update异常
session.beginTransaction().commit();
session.close();
}
后台sql:
insert into Person4 (personName, personId) values (?, ?)
insert into Address4 (addressName, addressId) values (?, ?)