为了解决这澳门新萄京赌场手机版一问题

当前位置:澳门新葡新京手机app下载 > 澳门新萄京赌场手机版 > 为了解决这澳门新萄京赌场手机版一问题
作者: 澳门新葡新京手机app下载|来源: http://www.fashioman.com|栏目:澳门新萄京赌场手机版

文章关键词:澳门新葡新京手机app下载,级联

  为了解决这一问题,Hibernate 提供了反转操作,同时,为了在操作多表时,主表(主控方)操作后的数据能与关联表的数据保持一致,Hibernate 还提供了级联操作。接下来将对这两种操作进行详细讲解。

  反转操作在映射文件的 set 标签中,有一个 inverse(反转)属性,它的作用是控制关联的双方由哪一方管理关联关系。

  通常情况下,在一对多关联关系中,会将“一”的一方的 inverse 属性取值为 true,即由“多”的一方维护关联关系,否则会产生多余的 SQL 语句;而在多对多的关联关系中,任意设置一方的 inverse 属性为 true 即可。

  通过《Hibernate多对多映射关系详解》教程的学习,读者已经了解了多对多关联的单向关联,接下来结合反转操作演示多对多双向关联的情况。澳门新萄京赌场手机版

  从图 1 的报错信息中可以看出,相同的主键值出现了重复写入,这是因为在双向关联中会产生一张中间表,由于关联双方都向中间表插入了数据,因此出现了重复写入的情况。

  通常情况下,这种问题有两种解决方案:第一种是进行单向关联,第二种是在一方的映射文件中,将 set 标签的 inverse 属性设置为 true。

  使用 JUnit 再次运行 test1() 方法,执行成功后,分别查看 students 表、course 表和 s_c 表,查询结果如图 2 所示。

  在执行 save、update 或 saveOrUpdate 吋进行关联操作

  所有情况下均进行关联操作,但不包含 delete-orphan 的操作

  了解了 cascade 的相关属性后,下面通过案例讲解 cascade 属性在实际应用中的级联操作。

  在《Hibernate一对多映射关系详解》教程中,通过班级和学生的关系讲解了一对多的关联关系映射,其案例代码实现了添加班级和学生的操作,下面演示一下仅添加班级的情况。

  3)使用 JUnit 测试运行 test2() 方法,执行成功后,分别查询 grade 表和 student 表,查询结果如图 3 所示。

  2. 一对多的级联删除操作在班级和学生的关联关系中,如果使用级联删除了班级,那么该班级对应的学生也会被删除。接下来演示在不使用级联删除操作的情况下,删除班级信息时学生信息的变化情况。在 OneToMany 类中添加一个名为 test3() 的方法,其代码如下所示:

  使用 JUnit 测试运行 test3() 方法,执行成功后,分别查询 grade 表和 student 表,查询结果如图 4 所示。

  从图 4 的查询结果中可以看出,id 为 1 的班级已经成功被删除了,但是该班级的学生依然存在于 student 表中,只是 student 表中对应的外键被设为了 null 值。

  这是因为班级被删除后,与其关联的 student 表中的外键值没有了。在删除 grade 表中数据之前,student 表先执行了 update 操作,将其表中的班级外键值设为了 null,然后才删除 grade 表中的班级。

  如果希望在删除 grade 表中数据的同时,也删除与其关联的 student 表中的数据,那么就可以使用级联删除操作。设置级联删除操作非常简单,只需要在 Grade.hbm.xml 映射文件的 set 标签中,将 cascade 属性值设置为 delete 即可。具体配置如下所示:在 OneToMany 类中添加一个名为 test4() 的方法,其代码如下所示:// 一对多级联的删除操作 @Test public void test4() { Session session = HibernateUtils.getSession(); session.beginTransaction(); Grade grade = (Grade) session.get(Grade.class, 3); // 查询id=3的班级对象 session.delete(grade); //删除班级it(); session.close(); }使用 JUnit 测试运行 test4() 方法,运行成功后,分别查询 grade 表和 student 表,澳门新萄京赌场手机版查询结果如图 5 所示。

  从图 5 的查询结果中可以看出,grade 表中 id 为 3 的班级和关联的一个学生都已经被成功删除了。

  3. 孤儿删除操作在班级和学生的关系中,如果没有设置级联删除,则删除班级后,该班级所关联学生的外键会被设为 null,这时可以将这些学生比喻为孤儿,孤儿删除就是删除与某个班级解除关系的学生。

  下面通过示例演示孤儿删除操作。首先执行一次 OneToManyTest 类中的 test1() 方法,向 grade 表和 student 表插入数据,运行成功后,分别查询 grade 表和 student 表,查询结果如图 6 所示。澳门新萄京赌场手机版

  使用 JUnit 测试运行 test5() 方法,运行成功后,分别查询 grade 表和 student 表,查询结果如图 7 所示。

  从图 7 的查询结果中可以看出,id 为 4 的班级和关联的 id 为 4 的学生数据还在,但 id 为 5 的学生数据已经被成功删除了,这表明孤儿删除的功能已经成功实现。

  4. 多对多的级联添加操作在前面小节中,我们已经学习了一对多的级联添加操作,下面通过具体示例演示多对多的级联添加操作。

  1)在 ManyToManyTest 类中添加一个名为 test2() 的方法,其具体代码如下所示:// 多对多级联添加操作 @Test public void test2() { Session session = HibernateUtils.getSession(); session.beginTransaction(); // 创建课程对象 Course c = new Course(); c.setCname(JavaWeb程序开发); // 创建学生对象 Students s = new Students(); s.setSname(王五); // 学生关联课程 s.getCourses().add(c); // 存储it(); session.close(); }2)在 Students.hbm.xml 映射文件中,将 cascade 属性设置为 save-update,具体配置如下所示:3)使用 JUnit 测试运行 test2() 方法,运行成功后,分别查询 student 表、course 表和 s_c 表,查询结果如图 8 所示。

  从图 8 的查询结果中可以看出,多对多级联添加操作已经成功实现。上一页Hibernate多对多映射关系Hibernate的5种检索方式下一页

  文章不深奥,不需要钻研,在公交、在地铁、在厕所都可以阅读,随时随地涨姿势。

  精美而实用的网站,分享优质编程教程,帮助有志青年。千锤百炼,只为大作;精益求精,处处斟酌;这种教程,看一眼就倾心。

网友评论

我的2016年度评论盘点
还没有评论,快来抢沙发吧!