Many-to-One映射



舉例如下:

1.Group.java

  1. package edu.study.hibernate;  
  2.   
  3. public class Group {  
  4.   
  5.     private int id;  
  6.       
  7.     private String name;  
  8.   
  9.     public int getId() {  
  10.         return id;  
  11.     }  
  12.   
  13.     public void setId(int id) {  
  14.         this.id = id;  
  15.     }  
  16.   
  17.     public String getName() {  
  18.         return name;  
  19.     }  
  20.   
  21.     public void setName(String name) {  
  22.         this.name = name;  
  23.     }  
  24.       
  25. }  

2.User.java

  1. package edu.study.hibernate;  
  2.   
  3. public class User {  
  4.   
  5.     private int id;  
  6.       
  7.     private String name;  
  8.       
  9.     private Group group;  
  10.   
  11.     public int getId() {  
  12.         return id;  
  13.     }  
  14.   
  15.     public void setId(int id) {  
  16.         this.id = id;  
  17.     }  
  18.   
  19.     public String getName() {  
  20.         return name;  
  21.     }  
  22.   
  23.     public void setName(String name) {  
  24.         this.name = name;  
  25.     }  
  26.   
  27.     public Group getGroup() {  
  28.         return group;  
  29.     }  
  30.   
  31.     public void setGroup(Group group) {  
  32.         this.group = group;  
  33.     }  
  34.       
  35. }  

3.Group.hbm.xml配置文件

  1. <?xml version="1.0"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC   
  3.     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  4.     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
  5. <hibernate-mapping>  
  6.     <class name="edu.study.hibernate.Group" table="t_group">  
  7.         <id name="id">  
  8.             <generator class="native"></generator>  
  9.         </id>  
  10.         <property name="name"></property>  
  11.     </class>    
  12. </hibernate-mapping>  

4.User.hbm.xml配置文件

  1. <?xml version="1.0"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC   
  3.     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  4.     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
  5. <hibernate-mapping>  
  6.     <class name="edu.study.hibernate.User" table="t_user">  
  7.         <id name="id">  
  8.             <generator class="native"></generator>  
  9.         </id>  
  10.         <property name="name"></property>  
  11.         <many-to-one name="group" column="groupid" cascade="all"></many-to-one>  
  12.     </class>    
  13. </hibernate-mapping>  

5.hibernate.cfg.xml配置文件

  1. <!DOCTYPE hibernate-configuration PUBLIC  
  2.     "-//Hibernate/Hibernate Configuration DTD 3.0//EN"  
  3.     "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">  
  4.   
  5. <hibernate-configuration>  
  6.     <session-factory >  
  7.         <property name="hibernate.connection.url">jdbc:mysql://127.0.0.1/hibernate_many2one</property>  
  8.         <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>  
  9.         <property name="hibernate.connection.username">root</property>  
  10.         <property name="hibernate.connection.password">root</property>  
  11.         <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>  
  12.         <property name="hibernate.show_sql">true</property>  
  13.           
  14.     <mapping resource="edu/study/hibernate/User.hbm.xml"/>  
  15.     <mapping resource="edu/study/hibernate/Group.hbm.xml"/>  
  16.     </session-factory>  
  17. </hibernate-configuration>  


6.測試代碼

  1. Group group=new Group();  
  2.           group.setName("研發部");  
  3.             
  4.           User u1=new User();  
  5.           u1.setName("小黃");  
  6.           u1.setGroup(group);  
  7.             
  8.           User u2=new User();  
  9.           u2.setName("小張");  
  10.           u2.setGroup(group);  
  11.             
  12.           session.save(u1);  
  13.           session.save(u2);  

如果沒使用cascade屬性,會拋出TransientObjectException異常,因爲Group爲transient狀態,User爲persistent狀態,而persistent狀態對象不能引用transient狀態對象,因此會拋出異常。正確的如下:

  1. Group group=new Group();  
  2.       group.setName("研發部");  
  3.         
  4.       //首先要保存Group  
  5.       session.save(group);  
  6.         
  7.       User u1=new User();  
  8.       u1.setName("小黃");  
  9.       u1.setGroup(group);  
  10.         
  11.       User u2=new User();  
  12.       u2.setName("小張");  
  13.       u2.setGroup(group);  
  14.         
  15.       //可以正確存儲  
  16.       session.save(u1);  
  17.       session.save(u2);  

注意:沒有使用cascade屬性的前提下,首先存儲Group,則Group對象成爲了persistent狀態,從而當persistent狀態的User對象對其引用時,不會拋出異常。

 

如果採用了級聯,即

  1. <many-to-one name="group" column="groupid" cascade="all"></many-to-one>  

cascade屬性進行了設置,即使不首先保存Group,也不會拋出異常,並正確存儲。

  1. Group group=new Group();  
  2.       group.setName("研發部");  
  3.         
  4.       User u1=new User();  
  5.       u1.setName("小黃");  
  6.       u1.setGroup(group);  
  7.         
  8.       User u2=new User();  
  9.       u2.setName("小張");  
  10.       u2.setGroup(group);  
  11.         
  12.       session.save(u1);  
  13.       session.save(u2);  


 

因爲採用了級聯cascade屬性,會首先保存Group,所以不會拋出異常。



總結:

(1)多對一映射:會在多的一端(User)加入外鍵,指向一的一端(Group),外鍵的定義由column屬性決定,如果沒有該屬性,默認的外鍵與實體的屬性一致。如

  1. <many-to-one name="group" column="groupid" cascade="all"></many-to-one>  

(2)cascade:級聯的意思是指定兩個對象之間的操作聯動關係,對一個對象執行了操作之後,對其指定的級聯對象也需要執行相同的操作。

     其屬性值如下:

      all:在所有的情況下都執行級聯操作;

      none:在所有情況下都不執行級聯操作;

      save-update:在保存和更新的時候執行級聯操作;

      delete:在刪除的時候執行級聯操作。

 

 

轉自:http://blog.csdn.net/yyywyr/article/details/6656522

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章