<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2016-1-25 16:18:31 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping package="cn.opfo.app.domain">
<class name="Person" table="t_person">
<id name="id" type="java.lang.Integer">
<column name="ID" />
<generator class="native" />
</id>
<property generated="never" lazy="false" name="name"
type="java.lang.String">
<column name="NAME" />
</property>
<property generated="never" lazy="false" name="passowrd"
type="int">
<column name="PASSOWRD" />
</property>
<property generated="never" lazy="false" name="birthDay"
type="java.util.Date">
<column name="BIRTHDAY" />
</property>
<!--
table不配置时,可正常创建但多出一个无用表,但在通过主表查询从表时会
因找主表对应创建的表而无法找到对应从表而出现异常。
所以建议二个表都要配置中间关联表,且名称一致。
inverse配置方法:因为有级联,所以无需二个对象都来提交
此处在配置文件中需要在Person表的Set配置片段设定inverse="false",即由Person表管理级联关系
而在Address对象的Set配置片段设定inverse="true",即同意级联关系交给Person对象进行管理
通常二者设定相反,由设定inverse="false"的一方控制级联关系
反之亦然
如果设定相同,则在CUID中双方都要对数据进行处理,即失去级联的意义了。
-->
<set name="addressSet" cascade="all" inverse="false" table="person_join_address">
<!-- key指定关联关系列,是本对象ID对应在中间表中的索引列 -->
<key column="p_id" />
<!-- 指定另一对象(Set集合)中ID在中间表中所对应的索引列(对象名+属性名)-->
<many-to-manyclass="Address" column="a_id"/>
</set>
</class>
<class name="Address" table="t_address">
<id name="id">
<column name="ID" />
<generator class="native"/>
</id>
<property generated="never" lazy="false" name="descs"
type="java.lang.String">
<column name="DESCS" />
</property>
<property generated="never" lazy="false" name="code" type="int">
<column name="CODE" />
</property>
<!--
table不配置时,可正常创建但多出一个无用表,但在通过主表查询从表时会
因找主表对应创建的表而无法找到对应从表而出现异常。
所以建议二个表都要配置中间关联表,且名称一致。
inverse配置方法:因为有级联,所以无需二个对象都来提交
此处在配置文件中需要在Person表的Set配置片段设定inverse="false",即由Person表管理级联关系
而在Address对象的Set配置片段设定inverse="true",即同意级联关系交给Person对象进行管理
通常二者设定相反,由设定inverse="false"的一方控制级联关系
反之亦然
如果设定相同,则在CUID中双方都要对数据进行处理,即失去级联的意义了。
-->
<set name="personSet" cascade="all" inverse="true" table="person_join_address">
<!-- key指定关联关系列,是本对象ID对应在中间表中的索引列 -->
<key column="a_id"/>
<!-- 指定另一对象(Set集合)中ID在中间表中所对应的索引列(对象名+属性名)-->
<many-to-many class="Person"column="p_id"/>
</set>
</class>
</hibernate-mapping>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2016-1-25 16:18:31 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping package="cn.opfo.app.domain">
<class name="Person" table="t_person">
<id name="id" type="java.lang.Integer">
<column name="ID" />
<generator class="native" />
</id>
<property generated="never" lazy="false" name="name"
type="java.lang.String">
<column name="NAME" />
</property>
<property generated="never" lazy="false" name="passowrd"
type="int">
<column name="PASSOWRD" />
</property>
<property generated="never" lazy="false" name="birthDay"
type="java.util.Date">
<column name="BIRTHDAY" />
</property>
<!--
table不配置时,可正常创建但多出一个无用表,但在通过主表查询从表时会
因找主表对应创建的表而无法找到对应从表而出现异常。
所以建议二个表都要配置中间关联表,且名称一致。
inverse配置方法:因为有级联,所以无需二个对象都来提交
此处在配置文件中需要在Person表的Set配置片段设定inverse="false",即由Person表管理级联关系
而在Address对象的Set配置片段设定inverse="true",即同意级联关系交给Person对象进行管理
通常二者设定相反,由设定inverse="false"的一方控制级联关系
反之亦然
如果设定相同,则在CUID中双方都要对数据进行处理,即失去级联的意义了。
-->
<set name="addressSet" cascade="all" inverse="false" table="person_join_address">
<!-- key指定关联关系列,是本对象ID对应在中间表中的索引列 -->
<key column="p_id" />
<!-- 指定另一对象(Set集合)中ID在中间表中所对应的索引列(对象名+属性名)-->
<many-to-manyclass="Address" column="a_id"/>
</set>
</class>
<class name="Address" table="t_address">
<id name="id">
<column name="ID" />
<generator class="native"/>
</id>
<property generated="never" lazy="false" name="descs"
type="java.lang.String">
<column name="DESCS" />
</property>
<property generated="never" lazy="false" name="code" type="int">
<column name="CODE" />
</property>
<!--
table不配置时,可正常创建但多出一个无用表,但在通过主表查询从表时会
因找主表对应创建的表而无法找到对应从表而出现异常。
所以建议二个表都要配置中间关联表,且名称一致。
inverse配置方法:因为有级联,所以无需二个对象都来提交
此处在配置文件中需要在Person表的Set配置片段设定inverse="false",即由Person表管理级联关系
而在Address对象的Set配置片段设定inverse="true",即同意级联关系交给Person对象进行管理
通常二者设定相反,由设定inverse="false"的一方控制级联关系
反之亦然
如果设定相同,则在CUID中双方都要对数据进行处理,即失去级联的意义了。
-->
<set name="personSet" cascade="all" inverse="true" table="person_join_address">
<!-- key指定关联关系列,是本对象ID对应在中间表中的索引列 -->
<key column="a_id"/>
<!-- 指定另一对象(Set集合)中ID在中间表中所对应的索引列(对象名+属性名)-->
<many-to-many class="Person"column="p_id"/>
</set>
</class>
</hibernate-mapping>
/*
* Junit测试代码
*/
* Junit测试代码
*/
public class HibernateJUnitTest {
private SessionFactory sFactory;
Session session;
Transaction tx;
/*
* 测试前进行初始化
*/
private SessionFactory sFactory;
Session session;
Transaction tx;
/*
* 测试前进行初始化
*/
@Before
public void setUp() throws Exception {
System.out.println("-----初始化数据------");
Configuration config = new Configuration().configure();
// ServiceRegistry sr = new
// StandardServiceRegistryBuilder().applySettings(config.getProperties()).build();
// sFactory = config.buildSessionFactory(sr);
sFactory = config.buildSessionFactory();
session = sFactory.openSession();
}
public void setUp() throws Exception {
System.out.println("-----初始化数据------");
Configuration config = new Configuration().configure();
// ServiceRegistry sr = new
// StandardServiceRegistryBuilder().applySettings(config.getProperties()).build();
// sFactory = config.buildSessionFactory(sr);
sFactory = config.buildSessionFactory();
session = sFactory.openSession();
}
/*
* 测试之后释放数据
*/
@After
public void tearDown() throws Exception {
System.out.println("-----释放化数据------");
if (session.isOpen()) {
session.close();
}
}
* 测试之后释放数据
*/
@After
public void tearDown() throws Exception {
System.out.println("-----释放化数据------");
if (session.isOpen()) {
session.close();
}
}
@Test
public void testOne2OneII(){
//定义人的集合
Set<Person> pSet = new HashSet<>();
Person p1 = new Person("wanglifu",134324,new Date());
Person p2 = new Person("wanglili",434321,new Date());
pSet.add(p1);
pSet.add(p2);
//定义地址的集合
Set<Address> aSet = new HashSet<Address>();
Address a1 = new Address("江苏盐城", 224562);
Address a2 = new Address("江苏南京", 224556);
aSet.add(a1);
aSet.add(a2);
//每个人和多个地址关联
p1.setAddressSet(aSet);
p2.setAddressSet(aSet);
//每个地址与多人建立关联
// a1.setPersonSet(pSet);
// a2.setPersonSet(pSet);
tx = session.beginTransaction();
//因为有级联,所以无需二个对象都来提交
//此处在配置文件中需要在Person表的Set配置片段设定inverse="false",即由Person表管理级联关系
//而在Address对象的Set配置片段设定inverse="true",即同意级联关系交给Person对象进行管理
//二者设定相反,由设定inverse="false"的一方控制级联关系
//反之亦然
session.persist(p1);
session.persist(p2);
// session.persist(a1);
// session.persist(a2);
tx.commit();
}