<?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>
 
 
 
 
/*
  * Junit测试代码
  */
 
public class HibernateJUnitTest {
 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();
 }
 
 /*
  * 测试之后释放数据
  */
 @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();
 }

Hibernate的many-to-many双向关联的配置办法的更多相关文章

  1. Hibernate多对多双向关联的配置

    Hibernate的双向多对多关联有两种配置方法:那我们就来看看两种方案是如何配置的.  一.创建以各自类为类型的集合来关联 1.首先我们要在两个实体类(雇员<Emploee>.工程< ...

  2. Hibernate(六)一对一双向关联映射

    在上次的博文Hibernate从入门到精通(五)一对一单向关联映射中我们讲解了一下一对一单向关联映射, 这次我们继续讲解一下与之对应的一对一双向关联映射. 一对一双向关联 与一对一单向关联映 射所不同 ...

  3. ORM框架Hibernate (四) 一对一单向、双向关联映射

    简介 在上一篇博客说了一下多对一映射,这里再说一下一对一关联映射,这种例子在生活中很常见,比如一个人的信息和他的身份证是一对一.又如一夫一妻制等等. 记得在Java编程思想上第一句话是“一切皆对象”, ...

  4. 【Hibernate步步】--一对一映射双向关联具体解释(两)

    很抱歉.有两天没更新博客文章,不要写文章一天真的感觉很是空的啊.制定一个写作习惯,想改也改不掉啊.说点题外话,前两天我收到一封私人信件给朋友,我写邀请函的文章OWS文章.一种技术用于研究图标工具,这位 ...

  5. Hibernate多对多映射(双向关联)实例详解——真

    一个学生可以选多门课 一门课程有多个学生上 实现步骤: 一.学生 (1)数据库创建学生数据表students,包含id,name字段 设置id字段为主键,类型:bigint,自增 设置name字段,类 ...

  6. Hibernate一对一外键双向关联(Annotation配置)

    如上图所示:一个学生有一个学生证号,一个学生证号对应一名学生.在Hibernate中怎么用Annotation来实现呢? 学生类,主键是id:学生证的主键也是Id: Student.java pack ...

  7. grails一对多双向关联

    前面分享了一些学习grails的心得,可是grails的知识还远不止这些,这次整理了一点有关grails一对多双向关联关系的知识.我认为这样的关联用的地方太多了,这次准备的样例是城市和区域的相关样例. ...

  8. hibernate多对一双向关联

    关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...

  9. hibernate一对一外键双向关联

    关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...

随机推荐

  1. Smallest Bounding Rectangle - uva10173

    Smallest Bounding Rectangle Given the Cartesian coordinates of n(>0)2-dimensional points, write a ...

  2. Python3基础 int(input())输入数字并产生一个int类型变量

    镇场诗:---大梦谁觉,水月中建博客.百千磨难,才知世事无常.---今持佛语,技术无量愿学.愿尽所学,铸一良心博客.------------------------------------------ ...

  3. 3. Swift 数组|字典|集合

    在OC中数组,字典,集合有自己的表示方法,分别是Array,Dictionary,Set 与 String 都属于数值类型变量,他们都属于结构体. 使用简介灵活多变,个人感觉可读性变差了很多,用起来由 ...

  4. c# 与java之间的简单区别

    C#中类的继承用通过冒号:实现,在Java中用extends C#中实现接口通过冒号:实现,在Java中用implements C#中密封类用sealed实现,在Java中用final C#中常数用c ...

  5. Kanzi UI Solution

    Kanzi UI Solution是一个完整的跨平台的UI解决方案, 基于OpenGL 和 OpenGL ES.Kanzi为UI的设计.开发和部署在嵌入式设备上的图形用户界面提供一个完善的开发平台. ...

  6. vs 2005 使用 boost regex

    第一步: Boost 入门及其VS2005下编译boost库  boost.regex库安装指南  深入浅出之正则表达式(一)  C++中三种正则表达式比较(C regex,C ++regex,boo ...

  7. myeclipse中disable maven nature

    1.直接原因:出现这个问题,一般都是因为手抖误操作. 但是出现了问题,还不知道从何查起. 可能出现的场景是eclipse安装Maven插件后,右键项目却找不到Maven按钮,继而无法编译项目. 2.实 ...

  8. Retrofit 2.0使用(2)如何使用@Body的形式发送Post

    在使用Retrofit的时候如果只是有几个参数我们可以用@Querry的形式,然后需要使用','隔开 但是在需要@Querry的参数多了之后,如果再用上面的方式就会造成参数写了一大堆的麻烦事 所以Re ...

  9. 【Python】下拉框元素的找法

    首先,从selenium.webdriver.support.ui里调用Select类,如下: 其次,找到下拉框元素,再找下拉框里要最终选择的元素,如下: 注意:调用Select类后,不必再加clic ...

  10. python 安装模块步骤

    1.下载 pyocr-0.4.1.tar.gz   tar.gz文件  解压  放到 c:/python27 文件夹下面 C:\Python27\pyocr-0.4.1  直接 cmd 命令 进入   ...