sql脚本:
create table Person3 ( personId number(10) not null primary key ,personName NVARCHAR2(100) );
create table PersonAddress3 ( personId3 number(10) not null primary key , addressId3 number(10) );
create table Address3 ( addressId number(10) not null primary key,addressName NVARCHAR2(100) );
person.hbm.xml:
<class name="com.chenjun.eshop.staffManage.domain.Person"
table="Person3">
<id name="id" column="personId">
<generator class="assigned"><!-- 由程序分配主键 -->
</generator>
</id>
<property name="personName"></property>
<!-- personId3,addressId3 都是连接表PersonAddress3的字段 -->
<join table="PersonAddress3" optional="true">
<key column="personId3" unique="true" />
<many-to-one name="address" column="addressId3"
not-null="true" />
</join>
</class>
address.hbm.xml:
<class name="com.chenjun.eshop.staffManage.domain.Address"
table="Address3">
<id name="id" column="addressId">
<generator class="assigned"><!-- 由程序分配主键 -->
</generator>
</id>
<property name="addressName"></property>
</class>
测试代码:
public void test()
{
Session session = this.getHibernateTemplate().getSessionFactory().openSession();
session.beginTransaction();
Address address1 = new Address();
address1.setId(1);
address1.setAddressName("武汉");
session.save(address1);//要先持久化,不然报org.hibernate.exception.ConstraintViolationException: could not insert: [com.chenjun.eshop.staffManage.domain.Person]
Person person1 = new Person();
person1.setId(11);
person1.setPersonName("王五");
person1.setAddress(address1);
Person person2 = new Person();
person2.setId(12);
person2.setPersonName("赵六");
person2.setAddress(address1);
session.save(person1);
session.save(person2);
// hibernate中的增删改都要提交事件,因为它默认是设为不提交的,而jdbc的connect是默认提交的。
session.beginTransaction().commit();
// 释放资源
session.close();
}
后台sql执行过程:
insert into Address3 (addressName, addressId) values (?, ?)
insert into Person3 (personName, personId) values (?, ?)
insert into PersonAddress3 (addressId3, personId3) values (?, ?)
insert into Person3 (personName, personId) values (?, ?)
insert into PersonAddress3 (addressId3, personId3) values (?, ?)
你可以注意到,它与我上一文章,一对多的sql执行顺序是有区别的,一对多是先执行完多方,再执行完一方,再执行连接表;而这里是先执行一方,再执行多方一次,紧接着就执行连接表,而不是等多方都执行完后,再统一执行连接表。