博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Hibernate - 多对多级联修改的问题
阅读量:6331 次
发布时间:2019-06-22

本文共 4777 字,大约阅读时间需要 15 分钟。

 

自己最近在做项目的过程中遇到了多对多修改的问题,因为之前已经有好几年没有用过Hibernate了,而Hibernate中的多对多的操作又是最复杂的,所以在这里难免就多花了一些时间,在这里总结下来供大家参考。以下我们来个简单的多对多关系建立老师Teacher 课程Course 是一个多对多的关系。

PojoXMl配置如下:

 

以下为 Pojo代码

=============================Course  Pojo============================

package com.domain;

import java.util.HashSet;

import java.util.Set;

 

/**

 * @author dengshaohua

 * @create_date 2011-09-14

 */

public class Course {

 

   private String id;

 

   private String name;

 

   private Set<Teacher> teachers = new HashSet<Teacher>();

 

   public String getId() {

      return id;

   }

   public void setId(String id) {

      this.id = id;

   }

   public String getName() {

      return name;

   }

   public void setName(String name) {

      this.name = name;

   }

   public Set<Teacher> getTeachers() {

      return teachers;

   }

   public void setTeachers(Set<Teacher> teachers) {

      this.teachers = teachers;

   }

}

 

============================Teacher  Pojo============================

package com.domain;

import java.util.HashSet;

import java.util.Set;

 

/**

 * @author dengshaohua

 * @create_date 2011-09-14

 */ 

public class Teacher {

 

   private String id;

 

   private String name;

 

   private Set<Course> courses = new HashSet<Course>();

 

   public String getId() {

      return id;

   }

   public void setId(String id) {

      this.id = id;

   }

   public String getName() {

      return name;

   }

   public void setName(String name) {

      this.name = name;

   }

   public Set<Course> getCourses() {

      return courses;

   }

   public void setCourses(Set<Course> courses) {

      this.courses = courses;

   }

}

 

XML配置文件如下

=================================Course  XML================================

<?xml version="1.0"?> 

<!DOCTYPE hibernate-mapping PUBLIC  

"-//Hibernate/Hibernate Mapping DTD 3.0//EN"         "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 

 

<hibernate-mapping> 

    <class name="com.domain.Course" table="tbl_course" 

       batch-size="100" dynamic-insert="true"

      dynamic-update="true">

        <id name="id" column="id"> 

            <generator class="uuid" /> 

        </id> 

        <property name="name" column="name" type="string" /> 

 

        <set access="property" lazy="true" inverse="false" 

           cascade="save-update" name="teachers"

         batch-size="10" fetch="select" 

           table="tbl_teacher_course"> 

           <key column="fk_course_id" /> 

           <many-to-many class="com.domain.Teacher" 

                column="fk_teacher_id" /> 

        </set>

      

    </class> 

</hibernate-mapping>

 

=================================Teacher  XML================================

<?xml version="1.0"?> 

<!DOCTYPE hibernate-mapping PUBLIC  

       "-//Hibernate/Hibernate Mapping DTD 3.0//EN"

"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 

 

<hibernate-mapping> 

    <class name="com.domain.Teacher" table="tbl_teacher" 

       batch-size="100" dynamic-insert="true"

      dynamic-update="true"> 

        <id name="id" column="id"> 

            <generator class="uuid" /> 

        </id>

        <property name="name" column="name" type="string" /> 

 

        <set access="property" lazy="true" inverse="true" 

            cascade="save-update" name="courses"

          batch-size="10" fetch="select" 

            table="tbl_teacher_course"> 

            <key column="fk_teacher_id" /> 

            <many-to-many class="com.domain.Course" 

                column="fk_course_id" /> 

        </set> 

    </class> 

</hibernate-mapping>

 

先往数据库里插入一些记录

public void testSave() {  

     Session session = HibernateSessionFactory.getSession();  

     session.beginTransaction();  

 

     // create course  

     Course c1 = new Course();  

     Course c2 = new Course();  

     c1.setName("C");  

     c2.setName("Java");  

 

     // create teacher  

     Teacher t1 = new Teacher();  

     Teacher t2 = new Teacher();  

     t1.setName("Leo");  

     t2.setName("Rose");  

 

     // create relationship  

     c1.getTeachers().add(t1);  

     c1.getTeachers().add(t2);  

     t1.getCourses().add(c1);  

     t2.getCourses().add(c1);  

 

// 因为主控方级联设置为save-update,如果设置为none,则下面被注释的代码需要开启,否则会报错

     //session.save(t1);   

     //session.save(t2);  

     session.save(c1);  

     session.getTransaction().commit();  

     session.close();  

}

 

下面是测试的一些结果:

 

1.      单独修改课程(Course)的信息,因为在这里课程(Course)被设置成了主控方(inverse="true"),所以在修改的时候,还需要保持与教师(Teacher)的关系,代码如下:

public void testUpdate() {

   Course c1 = new Course();

   c1.setId("402881ee175f04be01175f04c05d0001");

   c1.setName("new CourseName");

    Session session = HibernateSessionFactory.getSession();  

    session.beginTransaction();

    String hql = "from Course c left join fetch c.teachers where c.id="+c1.getId();

    List<Course> courses = session.createQuery(hql).list();

    if(courses!=null && courses.size()>0){

      c1.setTeachers(courses.get(0).getTeachers());

    }

    session.save(c1);

    session.getTransaction().commit();  

    session.close();  

}

通过这种方式去修改,查看后台,只有一条UpdateSQL语句。

但是如果不将TeacherCourse进行关联的话,因为Course是主控方,在保存的时候,CourseTeacher的关系就会丢失,这个时候后台会生成两条SQL,一条Update和一个Delete.

 

2.      单独修改教师(Teacher)信息的时候,就没有那么复杂了,在Action中获得了从From表单封装到的值后直接调会Save方法就可以了,如下:

public void testUpdate() {

   Teacher t1 = new Teacher();

   t1.setId("402881ee175f04be01175f04c05d0001");

   t1.setName("new TeacherName");

    Session session = HibernateSessionFactory.getSession();  

    session.beginTransaction();

    session.save(t1);  

    session.getTransaction().commit();  

    session.close();  

}

 

转载于:https://www.cnblogs.com/cookray/archive/2012/08/06/2625400.html

你可能感兴趣的文章
jdbcTemplate 调用存储过程。 入参 array 返回 cursor
查看>>
C++中的stack类、QT中的QStack类
查看>>
Linux常用基本命令[cp]
查看>>
CSS 相对|绝对(relative/absolute)定位系列(一)
查看>>
关于 Nginx 配置 WebSocket 400 问题
查看>>
Glide和Govendor安装和使用
查看>>
Java全角、半角字符的关系以及转换
查看>>
Dubbo和Zookeeper
查看>>
前端项目课程3 jquery1.8.3到1.11.1有了哪些新改变
查看>>
UOJ#179. 线性规划(线性规划)
查看>>
整合spring cloud云架构 - SSO单点登录之OAuth2.0登录认证(1)
查看>>
Isolation Forest原理总结
查看>>
windows的服务中的登录身份本地系统账户、本地服务账户和网络服务账户修改
查看>>
JAVA中循环删除list中元素的方法总结
查看>>
redis 安装
查看>>
SQL some any all
查看>>
电子书下载:Programming Windows Identity Foundation
查看>>
有理想的程序员必须知道的15件事
查看>>
用于测试的字符串
查看>>
财付通和支付宝资料收集
查看>>