sql脚本:
create table Person2 ( personId number(10),personName NVARCHAR2(100) not null primary key );
create table PersonAddress2 ( personId2 number(10) not null, addressId2 number(10) not null primary key );
create table Address2 ( addressId number(10) not null primary key,addressName NVARCHAR2(100) );
Person.hbm.xml:
<class name="com.chenjun.eshop.staffManage.domain.Person"
table="Person2">
<id name="id" column="personId">
<generator class="assigned"><!-- 由程序分配主键 -->
</generator>
</id>
<property name="personName"></property>
<!-- PersonAddress2 是连接表, personId2,addressId2都是连接表PersonAddress2引用Person2,Address2表的外键,unique="true" 代表Person-Address是一对多关系-->
<set name="addresses" table="PersonAddress2">
<key column="personId2" />
<many-to-many column="addressId2" unique="true"
class="com.chenjun.eshop.staffManage.domain.Address" />
</set>
</class>
Address.hbm.xml:
<class name="com.chenjun.eshop.staffManage.domain.Address"
table="Address2">
<id name="id" column="addressId">
<generator class="assigned"><!-- 由程序分配主键 -->
</generator>
</id>
<property name="addressName"></property>
</class>
由于上面一对多默认是由一方来维护,所以先持久化多方address,再持久化一方person;
测试代码如下:
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 execute JDBC batch update错误
Address address2 = new Address();
address2.setId(2);
address2.setAddressName("上海");
session.save(address2);//这里必须要先持久化,不然会报org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update错误
Set<Address> addresses = new HashSet<Address>();
addresses.add(address1);
addresses.add(address2);
Person person1 = new Person();
person1.setId(11112);
person1.setPersonName("张三");
person1.setAddresses(addresses);
session.save(person1);
// hibernate中的增删改都要提交事件,因为它默认是设为不提交的,而jdbc的connect是默认提交的。
session.beginTransaction().commit();
// 释放资源
session.close();
}
后台执行的sql:
insert into Address2 (addressName, addressId) values (?, ?)
insert into Address2 (addressName, addressId) values (?, ?)
insert into Person2 (personName, personId) values (?, ?)
insert into PersonAddress2 (personId2, addressId2) values (?, ?)
insert into PersonAddress2 (personId2, addressId2) values (?, ?)
oracle数据库结果:
person2表:
11112 张三
address2表:
1 武汉
2 上海
PersonAddress2:
11112 2
11112 1
这种基于关联表的单向一对多在实际开发中是较常用的