【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.       //getter\setter  
  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.       //getter\setter  
  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都可以,没有特殊限定,因为两方都一样。

posted @ 2017-01-06 20:32  Double-Eggs  阅读(811)  评论(0编辑  收藏  举报