sql脚本:
--创建表
create table Person4 ( personId number(10) not null primary key ,personName NVARCHAR2(100));
create table PersonAddress4 ( personId4 number(10) not null, addressId4 number(10) not null,primary key
(personId4, addressId4));
create table Address4 ( addressId number(10) not null primary key,addressName NVARCHAR2(100));
address.java:
public class Address implements Serializable
{
/**
*
*/
private static final long serialVersionUID = -2468384878011374291L;
private int id;
private PojoName pojoName;
private Set<Person> persones = new HashSet<Person>();
setter/getter略
}
address.hbm.xml:
<class name="com.chenjun.eshop.staffManage.domain.Address"
table="Address4">
<id name="id" column="addressId"><!-- addressid引用的是person表的主键personid,也就是两表共用主键 -->
<generator class="assigned"><!-- 由程序分配主键 -->
</generator>
</id>
<component name="pojoName"
class="com.chenjun.eshop.staffManage.domain.PojoName"><!-- 将公用的属性提出来作为一个组件class,多个实体就可以复用这个组件class -->
<property name="addressName"></property> <!-- addressName 的值取自上面组件类的addressName值 -->
</component>
<set name="persones" inverse="true" table="PersonAddress4"
cascade="all">
<key column="addressId4" />
<many-to-many column="personId4"
class="com.chenjun.eshop.staffManage.domain.Person" />
</set>
</class>
person.java:
public class Person implements Serializable
{
/**
*
*/
private static final long serialVersionUID = 3746536169441688518L;
private int id;
private PojoName pojoName;
private Set<Address> addresses = new HashSet<Address>();
setter/gettter略
}
person.hbm.xml:
<class name="com.chenjun.eshop.staffManage.domain.Person"
table="Person4">
<id name="id" column="personId">
<generator class="assigned"><!-- 由程序分配主键 -->
</generator>
</id>
<component name="pojoName"
class="com.chenjun.eshop.staffManage.domain.PojoName">
<property name="personName"></property> <!-- personName 的值取自上面组件类的personName值 -->
</component>
<!-- personId4,addressId4都是连接表PersonAddress4里的字段-->
<set name="addresses" table="PersonAddress4" cascade="all">
<key column="personId4" />
<!-- unique="true" 表示当前实体是一方,不是多方,也就是person是一 -->
<many-to-many column="addressId4"
class="com.chenjun.eshop.staffManage.domain.Address" />
</set>
</class>
测试代码:
private void addPerson()
{
PojoName pojoName = new PojoName();
pojoName.setPersonName("张三");
pojoName.setAddressName("武汉");// 初始化组件
Person person1 = new Person();
person1.setId(21);
person1.setPojoName(pojoName);// 复用组件,从组件中取apersonName值
PojoName pojoName2 = new PojoName();
pojoName2.setPersonName("李四");
pojoName2.setAddressName("北京");// 初始化组件
Person person2 = new Person();
person2.setId(22);
person2.setPojoName(pojoName2);// 复用组件,从组件中取personName值
Address address1 = new Address();
address1.setId(22001);
address1.setPojoName(pojoName);// 复用组件,从组件中取addressName值
Address address2 = new Address();
address2.setId(22002);
address2.setPojoName(pojoName2);// 复用组件,从组件中取addressName值
person1.getAddresses().add(address1);
person1.getAddresses().add(address2);
person2.getAddresses().add(address1);
person2.getAddresses().add(address2);
address1.getPersones().add(person1);// 添加关联表数据
address1.getPersones().add(person2);
address2.getPersones().add(person1);
address2.getPersones().add(person2);
Session session = this.getHibernateTemplate().getSessionFactory().openSession();
session.beginTransaction();
session.save(address1);
session.save(address2);
session.beginTransaction().commit();
session.close();
}