• 【Hibernate框架】关联映射(多对多关联映射)


    按着我们的总结行进计划,接下来,就是有关于多对多映射的总结了。

    我们来举个例子啊,很长时间以来,房价暴涨不落,但是还有很多人拥有很多套房产,假如说,一个富豪拥有九套房产,家里人么准去住哪一套,我们就以说:

    对于富豪家人来说:一个人可以拥有很多住址Address;对于房子来说:一套房子可以让很多人住。

    1、多对多单向关联映射:

    Po对象:Person.Java:

    1. public class Person  
    2. {  
    3.       private int id;  
    4.       private String name;  
    5.       private Set<Address> address;  
    6.       //gettersetter  
    7. }  

    Address.java

    1. public class Address  
    2. {  
    3.       private int id;  
    4.       private String name;  
    5. }  

    映射文件:Person.hbm.xml

    1. <hibernate-mapping package="org.hibernate.test">  
    2.     <class name="com.ssh.hibernate.Person" table="t_person">  
    3.         <id name="id">  
    4.         <generator class="native"/>  
    5.     </id>  
    6.     <set name="addres" table="t_personAddress">  
    7.         <key column="personid"/>  
    8.         <many-to-many column="addressId" class="com.ssh.hibernate.Address"/>  
    9.     </set>  
    10.     </class>  
    11. </hibernate-mapping>  

    Address.hbm.xml:

    1. <hibernate-mapping package="org.hibernate.test">  
    2.     <class name="com.ssh.hibernate.Address" table="t_address">  
    3.         <id name="id">  
    4.             <generator class="native" />  
    5.         </id>  
    6.         <property name="name" />  
    7.     </class>  
    8. </hibernate-mapping>  


    运行程序,生成表语句:

    1. create table Person ( id bigint not null, name varchar(255), primary key(id) )  
    2. create table PersonAddress ( personid bigint not null, addressid bigint not null, primary key (personid, addressid) )  
    3. create table Address ( id bigint not null,name varchar(255), primary key(id) )  

    测试:

    1. session.beginTransaction();  
    2. Address address1=new Address();  
    3. address1.setName("<span margin: 0px; padding: 0px; border: currentColor; color: black; background-color: inherit;">font-family: Arial, Helvetica, sans-serif;">唐人街5号</span>");  
    4. session.save(address1);  
    5. Address address2=new Address();  
    6. address2.setName("北京帽儿胡同12号");  
    7. session.save(address2);  
    8. Address address3=new Address();  
    9. address3.setName("南京花雨石大街10号");  
    10. session.save(course3);  
    11. Address address4=new Address();  
    12. address4.setName("长安大街11号");  
    13. session.save(address4);  
    14.   
    15. Person person1=new Person();  
    16. Set addres1=new HashSet();  
    17. addres1.add(address1);  
    18. addres1.add(address2);  
    19. person1.setAddresss(addres1);  
    20. person1.setName("赵钱孙");  
    21. session.save(person1);  
    22.   
    23. Person person2=new Person();  
    24. Set addres2=new HashSet();  
    25. addres2.add(address2);  
    26. addres2.add(address4);  
    27. person2.setAddresss(addres2);  
    28. person2.setName("甲乙丙");  
    29. session.save(person2);  
    30. session.getTransaction().commit();  


    执行完成后,进行查询测试:

    1. session.beginTransaction();  
    2. Person person=(Person)session.load(person.class, 1);  
    3. System.out.println(person.getName());  
    4. for(Address s:person.getaddres()){  
    5.     System.out.println(s.getName());  
    6. }  
    7. session.getTransaction().commit();  

    执行查询结果:

    1. 赵钱孙  
    2. 唐人街5号  
    3. 北京帽儿胡同12号  


    2、多对多双向关联映射:

    Po对象:Person.java:

    1. public class Person  
    2. {  
    3.       private int id;  
    4.       private String name;  
    5.       private Set<Address> address;  
    6.       //gettersetter  
    7. }  

    Address.java

    1. public class Address  
    2. {  
    3.       private int id;  
    4.       private String name;  
    5.       private Set<Person> person;  
    6. }  


    配置文件:Person.hbm.xml

    1. <class name="com.ssh.hibernate.Person" talbe="t_person">  
    2.     <id name="id" column="id">  
    3.         <generator class="native"/>  
    4.     </id>  
    5.     <set name="addres"  table="t_personAddress">  
    6.         <key column="personId"/>  
    7.         <many-to-many column="addressId" class="com.ssh.hibernate.Address"/>  
    8.     </set>  
    9. </class>  


    Address.hbm.xml

    1. <class name="com.ssh.hibernate.Address" table="t_address">  
    2.     <id name="id" column="id">  
    3.         <generator class="native"/>  
    4.     </id>  
    5.     <set name="people" inverse="true" table="t_personAddress">  
    6.         <key column="addressId"/>  
    7.         <many-to-many column="personId" class="com.ssh.hibernate.Person"/>  
    8.     </set>  
    9. </class>  

    这就是双向的了,通过住户可以知道他的所有房产,也可以通过房产知道它的所有的住户。其中值得一说的是<set>的<inverse="true">,还记得咱们的IOC容器的全称吗?Inverse Of Control,控制反转,这里指的也是反转,在多对多关联中,如果设置了inverse="true"就表示本方不进行关联的维护,由另一方进行关联的维护。就那上面实力来说,因为设置了<inverse="true">,所以即使执行:

    1. Set<Address> adres=new HashSet<Address>();  
    2. adres.add(new Address("北京胡同"));  
    3. adres.add(new Address("南京胡同"));  
    4. person.setAdres(adres);  
    5. session.save(person);  

    也只会想t_person表中插入数据,而不会向t_personAddress表中插入数据,如果想要同时插入数据,只需要将inserve设置为false;在多对多双向关联映射中,任何一方设置inserve=true都可以,没有特殊限定,因为两方都一样。

  • 相关阅读:
    差分约束系统详解
    AC自动机详解
    KMP算法详解
    ST算法详解
    Trie详解
    欧拉路径详解
    树上差分详解
    LCA详解
    树链剖分详解
    树的直径详解
  • 原文地址:https://www.cnblogs.com/DoubleEggs/p/6257645.html
Copyright © 2020-2023  润新知