Many-to-One映射

来源:互联网 发布:lol面具淘宝 编辑:程序博客网 时间:2024/05/18 03:22


举例如下:

1.Group.java

[java] view plaincopyprint?
  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

[java] view plaincopyprint?
  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配置文件

[html] view plaincopyprint?
  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配置文件

[html] view plaincopyprint?
  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配置文件

[html] view plaincopyprint?
  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.测试代码

[java] view plaincopyprint?
  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状态对象,因此会抛出异常。正确的如下:

[java] view plaincopyprint?
  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对象对其引用时,不会抛出异常。

 

如果采用了级联,即

[html] view plaincopyprint?
  1. <many-to-one name="group" column="groupid" cascade="all"></many-to-one>  

cascade属性进行了设置,即使不首先保存Group,也不会抛出异常,并正确存储。

[java] view plaincopyprint?
  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属性决定,如果没有该属性,默认的外键与实体的属性一致。如

[html] view plaincopyprint?
  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

0 0
原创粉丝点击