【Hibernate框架】關聯映射(多對多關聯映射)

按着咱們的總結行進計劃,接下來,就是有關於多對多映射的總結了。html

 

咱們來舉個例子啊,很長時間以來,房價暴漲不落,可是還有不少人擁有不少套房產,假如說,一個富豪擁有九套房產,家裏人麼準去住哪一套,咱們就以說:java

對於富豪家人來講:一我的能夠擁有不少住址Address;對於房子來講:一套房子可讓不少人住。web

一、多對多單向關聯映射:sql

Po對象:Person.Java:session

 

[java]  view plain copy
 print?在CODE上查看代碼片派生到個人代碼片
  1. public class Person  
  2. {  
  3.       private int id;  
  4.       private String name;  
  5.       private Set<Address> address;  
  6.       //getter\setter  
  7. }  

Address.javaapp

 

 

[java]  view plain copy
 print?在CODE上查看代碼片派生到個人代碼片
  1. public class Address  
  2. {  
  3.       private int id;  
  4.       private String name;  
  5. }  

映射文件:Person.hbm.xmlssh

 

 

[html]  view plain copy
 print?在CODE上查看代碼片派生到個人代碼片
  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:oop

 

[html]  view plain copy
 print?在CODE上查看代碼片派生到個人代碼片
  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>  


運行程序,生成表語句:測試

 

 

[sql]  view plain copy
 print?在CODE上查看代碼片派生到個人代碼片
  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) )  

 

 

測試:this

 

[java]  view plain copy
 print?在CODE上查看代碼片派生到個人代碼片
  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();  


執行完成後,進行查詢測試:

 

 

[java]  view plain copy
 print?在CODE上查看代碼片派生到個人代碼片
  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();  

執行查詢結果:

 

 

[java]  view plain copy
 print?在CODE上查看代碼片派生到個人代碼片
  1. 趙錢孫  
  2. 唐人街5號  
  3. 北京帽兒衚衕12號  


二、多對多雙向關聯映射:

 

Po對象:Person.java:

 

 

[java]  view plain copy
 print?在CODE上查看代碼片派生到個人代碼片
  1. public class Person  
  2. {  
  3.       private int id;  
  4.       private String name;  
  5.       private Set<Address> address;  
  6.       //getter\setter  
  7. }  

Address.java

 

 

[java]  view plain copy
 print?在CODE上查看代碼片派生到個人代碼片
  1. public class Address  
  2. {  
  3.       private int id;  
  4.       private String name;  
  5.       private Set<Person> person;  
  6. }  

 


配置文件:Person.hbm.xml

 

[html]  view plain copy
 print?在CODE上查看代碼片派生到個人代碼片
  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

 

 

[html]  view plain copy
 print?在CODE上查看代碼片派生到個人代碼片
  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">,因此即便執行:

 

 

[java]  view plain copy
 print?在CODE上查看代碼片派生到個人代碼片
  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均可以,沒有特殊限定,由於兩方都同樣。

相關文章
相關標籤/搜索