hibernate一对多关联映射(二)---双向关联

1.新建工程项目hibernate_one2many_2,在该项目下添加hibernate所需的Jar包和数据库mysql驱动Jar包。

2.编写工具类HibernateUtils和ExportDB,代码如下:

    HibernateUtils.java

  1. package com.i51pro.hibernate;
  2. import org.hibernate.Session;
  3. import org.hibernate.SessionFactory;
  4. import org.hibernate.cfg.Configuration;
  5. public class HibernateUtils {
  6.     private static SessionFactory sessionFactory;
  7.     static {
  8.         try {
  9.             Configuration cfg = new Configuration().configure();
  10.             sessionFactory = cfg.buildSessionFactory();
  11.         } catch (Exception e) {
  12.             e.printStackTrace();
  13.         }
  14.     }
  15.     public static SessionFactory getSessionFactory() {
  16.         return sessionFactory;
  17.     }
  18.     public static Session getSession() {
  19.         return sessionFactory.openSession();
  20.     }
  21.     public static void closeSession(Session session) {
  22.         if (session != null) {
  23.             if (session.isOpen()) {
  24.                 session.close();
  25.             }
  26.         }
  27.     }
  28. }

    ExportDB.java

  1. package com.i51pro.hibernate;
  2. import org.hibernate.cfg.Configuration;
  3. import org.hibernate.tool.hbm2ddl.SchemaExport;
  4. public class ExportDB {
  5.     /**
  6.      * @param args
  7.      */
  8.     public static void main(String[] args) {
  9.         Configuration cfg = new Configuration().configure();
  10.         
  11.         SchemaExport export = new SchemaExport(cfg);
  12.         export.create(truetrue);
  13.     }
  14. }

 

3.编写实体类和映射文件,代码如下:

    Student.java

 

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

     Classes.java

  1. package com.i51pro.hibernate;
  2. import java.util.Set;
  3. public class Classes {
  4.     private int id;
  5.     
  6.     private String name;
  7.     
  8.     private Set students;
  9.     public int getId() {
  10.         return id;
  11.     }
  12.     public void setId(int id) {
  13.         this.id = id;
  14.     }
  15.     public String getName() {
  16.         return name;
  17.     }
  18.     public void setName(String name) {
  19.         this.name = name;
  20.     }
  21.     public Set getStudents() {
  22.         return students;
  23.     }
  24.     public void setStudents(Set students) {
  25.         this.students = students;
  26.     }
  27. }

    Student.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="com.i51pro.hibernate.Student" table="t_student">
  7.         <id name="id">
  8.             <generator class="native"/>
  9.         </id>
  10.         <property name="name" />
  11.         <many-to-one name="classes" column="classesid" />
  12.     </class>
  13. </hibernate-mapping>

    Classes.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="com.i51pro.hibernate.Classes" table="t_classes">
  7.         <id name="id">
  8.             <generator class="native" />
  9.         </id>
  10.         <property name="name"/>
  11.         <set name="students" inverse="true" cascade="all">
  12.             <key column="classesid" />
  13.             <one-to-many class="com.i51pro.hibernate.Student"/>
  14.         </set>
  15.     </class>
  16. </hibernate-mapping>

4.编写hibernate映射文件,代码如下:

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

4.在工程项目hibernate_one2many_2下,建立SourceFolder,命名为test,在该包下编写测试类One2ManyTest,进行单元测试,代码如下:

  1. package com.i51pro.hibernate;
  2. import java.util.HashSet;
  3. import java.util.Iterator;
  4. import java.util.Set;
  5. import org.hibernate.Session;
  6. import org.hibernate.Transaction;
  7. import junit.framework.TestCase;
  8. public class One2ManyTest extends TestCase {
  9.     public void testSave1() {
  10.         Session session = null;
  11.         try {
  12.             session = HibernateUtils.getSession();
  13.             Transaction tx = session.beginTransaction();
  14.             
  15.             Student student1 = new Student();
  16.             student1.setName("学生1");
  17.             session.save(student1);
  18.             
  19.             Student student2 = new Student();
  20.             student2.setName("学生2");
  21.             session.save(student2);
  22.             
  23.             Set students = new HashSet();
  24.             students.add(student1);
  25.             students.add(student2);
  26.             
  27.             Classes classes = new Classes();
  28.             classes.setName("JAVA学习小组");
  29.             classes.setStudents(students);
  30.             
  31.             //可以保存 
  32.             session.save(classes);
  33.             
  34.             session.getTransaction().commit();
  35.         }catch(Exception e) {
  36.             e.printStackTrace();
  37.             session.getTransaction().rollback();
  38.         }finally {
  39.             HibernateUtils.closeSession(session);                           
  40.         }
  41.     }
  42.     
  43.     public void testSave2() {
  44.         Session session = null;
  45.         try {
  46.             session = HibernateUtils.getSession();
  47.             Transaction tx = session.beginTransaction();
  48.             
  49.             Classes classes = new Classes();
  50.             classes.setName("JAVA研发小组");
  51.             session.save(classes);
  52.             
  53.             Student student1 = new Student();
  54.             student1.setName("程序员1");
  55.             student1.setClasses(classes);
  56.             session.save(student1);
  57.             
  58.             Student student2 = new Student();
  59.             student2.setName("程序员2");
  60.             student2.setClasses(classes);
  61.             session.save(student2);
  62.             
  63.             session.getTransaction().commit();
  64.         }catch(Exception e) {
  65.             e.printStackTrace();
  66.             session.getTransaction().rollback();
  67.         }finally {
  68.             HibernateUtils.closeSession(session);                           
  69.         }
  70.     }
  71.     
  72.     public void testSave3() {
  73.         Session session = null;
  74.         try {
  75.             session = HibernateUtils.getSession();
  76.             Transaction tx = session.beginTransaction();
  77.             
  78.             Classes classes = new Classes();
  79.             classes.setName("JAVA研发开小组");
  80.             
  81.             Student student1 = new Student();
  82.             student1.setName("程序员1");
  83.             student1.setClasses(classes);
  84.             
  85.             Student student2 = new Student();
  86.             student2.setName("程序员2");
  87.             student2.setClasses(classes);
  88.             
  89.             Set students = new HashSet();
  90.             students.add(student1);
  91.             students.add(student2);
  92.             
  93.             classes.setStudents(students);
  94.             
  95.             //可以正确保存
  96.             session.save(classes);
  97.             
  98.             session.getTransaction().commit();
  99.         }catch(Exception e) {
  100.             e.printStackTrace();
  101.             session.getTransaction().rollback();
  102.         }finally {
  103.             HibernateUtils.closeSession(session);                           
  104.         }
  105.     }
  106.     
  107.     public void testLoad1() {
  108.         Session session = null;
  109.         try {
  110.             session = HibernateUtils.getSession();
  111.             session.beginTransaction();
  112.             
  113.             Classes classes = (Classes)session.load(Classes.class2);
  114.             System.out.println("classes.name=" + classes.getName());
  115.             Set students = classes.getStudents();
  116.             for (Iterator iter=students.iterator(); iter.hasNext();) {
  117.                 Student student = (Student)iter.next();
  118.                 System.out.println("student.name=" + student.getName());
  119.             }
  120.             session.getTransaction().commit();
  121.         }catch(Exception e) {
  122.             e.printStackTrace();
  123.             session.getTransaction().rollback();
  124.         }finally {
  125.             HibernateUtils.closeSession(session);
  126.         }
  127.     }       
  128.     
  129.     public void testLoad2() {
  130.         Session session = null;
  131.         try {
  132.             session = HibernateUtils.getSession();
  133.             session.beginTransaction();
  134.             
  135.             Student student = (Student)session.load(Student.class1);
  136.             System.out.println("student.name=" + student.getName());
  137.             System.out.println("student.classes.name=" + student.getClasses().getName());
  138.             session.getTransaction().commit();
  139.         }catch(Exception e) {
  140.             e.printStackTrace();
  141.             session.getTransaction().rollback();
  142.         }finally {
  143.             HibernateUtils.closeSession(session);
  144.         }
  145.     }       
  146. }

 

总结:hihernate一对多关联映射(双向Classes<----->Student)

一对多双向关联映射:
 * 在一一端的集合上使用<key>,在对方表中加入一个外键指向一一端
 * 在多一端采用<many-to-one>
 
注意:<key>标签指定的外键字段必须和<many-to-one>指定的外键字段一致,否则引用字段的错误
 
如果在”一“一端维护一对多关联关系,hibernate会发出多余的udpate语句,所以我们一般在多
的一端来维护关联关系

关于inverse属性:
 inverse主要用在一对多和多对多双向关联上,inverse可以被设置到集合标签<set>上,
 默认inverse为false,所以我们可以从”一“一端和”多“一端维护关联关系,
 如果设置成inverse为true,则我们只能从多一端来维护关联关系
 
 注意:inverse属性,只影响数据的存储,也就是持久化
  
inverse和cascade
 * inverse是关联关系的控制方向
 * cascade操作上的连锁反应

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值