zoukankan      html  css  js  c++  java
  • Hibernate的many-to-many双向关联的配置办法

    <?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();
     }
  • 相关阅读:
    vue的class绑定
    less里面calc() 语法
    问题
    Spring Boot面试题
    Redis面试题
    nginx面试题
    rabbitMQ面试题
    Linux+Git命令
    docker
    JAVA常用单词
  • 原文地址:https://www.cnblogs.com/flycatnet/p/5163445.html
Copyright © 2011-2022 走看看