Hibernate多对多映射
昨夜西风凋碧树,独上高楼,望尽天涯路。
衣带渐宽终不悔,为君消得人憔悴。
众里寻他千百度,蓦然回首,那人却在灯火阑珊处。
-------------王国维《人间词话》
古今成大事者、大学问者首先要树立明确的目标,即使长路漫漫也要下决心走下这条路,这是一个人在孤独中需找理想,寻找生命的落脚点的痛苦时刻。然后执着的追求,忘我的奋斗,直到憔悴消瘦连衣服都变得宽大,这一切都是为了心中的梦想。经过不断的磨练,多次失败某时刻忽然灵犀一点,参透真谛。
一直都很欣赏王大师总结的这篇文章,一个人学习境界的唯美表述使我常常沉浸在这种书画般的境界。自己时常又不是在高处独自登上高楼,单薄的衣服挡不住习习秋风,放眼望去繁华的灯火哪里是我的归宿?为了完成一些有趣的事,何尝不是在电脑前通宵达旦,炯炯有神的目光中隐隐泛着充满智慧和激情的纹路?且不说自己如何如何,自己依旧在缓慢的成长抵不过身边那些向着太阳愤怒生长的麦子。
废话不多说,这么文艺的也只能在自己心血来潮的时候来几句 ,博客博客。。。
自己再次总结之前学过的Hibernate多对多映射,在我们具体的业务场景中有很多的着这种情况。比如学生和教师的对应关系,一个学生可以对应多个教师,一个教师可以对应多个学生。
下面是我用PowerDesigner做的类图的对应关系
然后是相应的数据库模型,在这种多对多的情况下会出现一个中间表。
然后生成代码如下:
Student.java
package com.school.domain; import java.util.HashSet; /*********************************************************************** * Module: Student.java * Author: ZDX * Purpose: Defines the Class Student ***********************************************************************/ /** @pdOid 250f1280-ff07-4a23-861a-388479f12ca7 */ public class Student { /** @pdOid 73a45190-7b2e-4455-9135-32f62e6865ce */ private Integer studentId; /** @pdOid 063f1ccc-8682-4727-8d26-2724d9e5c907 */ private String name; /** * @pdRoleInfo migr=no name=Teacher assc=association1 coll=java.util.Set * impl=java.util.HashSet mult=1..* side=A */ private java.util.Set<Teacher> teacherSet=new HashSet<Teacher>(); public Student() { // TODO Auto-generated constructor stub } public Student(String name) { this.name = name; } /******************************get和set方法*************/ }
Teacher.java
package com.school.domain; import java.util.HashSet; /*********************************************************************** * Module: Teacher.java * Author: ZDX * Purpose: Defines the Class Teacher ***********************************************************************/ /** @pdOid 16d32ee4-1b55-4ac8-aa68-3ca9d0df72d0 */ public class Teacher { /** @pdOid 26587481-5822-4b3a-9763-0ae2ef690853 */ private Integer teacherId; /** @pdOid eaf2ad6c-4bf3-4321-863e-345f78962fad */ private String name; /** @pdRoleInfo migr=no name=Student assc=association1 coll=java.util.Set impl=java.util.HashSet mult=1..* */ private java.util.Set<Student> studentSet=new HashSet<Student>(); public Teacher() { // TODO Auto-generated constructor stub } /*****************get和set方法*********************/ }
然后就是比较关键的xml配置了
首先是Student.xml如下:
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping default-lazy="false"> <class name="com.school.domain.Student" table="student"> <id name="studentId"> <generator class="native"></generator> </id> <property name="name"></property> <!-- 1.中间表的名称 2.集合外键(引用本表主键的那个外键) 3.引用关联实体表主键的那个外键 4.关联对方实体的类型 --> <set name="teacherSet" table="teacher_student"> <key column="studentId"></key> <many-to-many class="com.school.domain.Teacher" column="teacherId"></many-to-many> </set> </class> </hibernate-mapping>
首先是Teacher.xml如下:
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping default-lazy="false"> <class name="com.school.domain.Teacher" table="teacher"> <id name="teacherId"> <generator class="native"></generator> </id> <property name="name"></property> <!-- 1.中间表的名称 2.集合外键(引用本表主键的那个外键) 3.引用关联实体表主键的那个外键 4.关联对方实体的类型 --> <set name="studentSet" table="teacher_student"> <key column="teacherId"></key> <many-to-many class="com.school.domain.Student" column="studentId"></many-to-many> </set> </class> </hibernate-mapping>
下面是测试方法:
public class StudentDaoTest { StudentDao dao=new StudentDao(); TeacherDao teacherDao=new TeacherDao(); @Test public void testSaveStudent() { /**************************new Student*******************************/ Student student1=new Student("张三"); Student student2=new Student("李四"); Student student3=new Student("王五"); Student student4=new Student("杨六"); Set<Student> students=new HashSet<Student>(); students.add(student1); students.add(student2); students.add(student3); students.add(student4); /**************************new Teacher*******************************/ Teacher teacher1=new Teacher("伟帅"); Teacher teacher2=new Teacher("铁哥"); Teacher teacher3=new Teacher("松哥"); Set<Teacher> teachers=new HashSet<Teacher>(); teachers.add(teacher1); teachers.add(teacher2); teachers.add(teacher3); /*************给老师和学生设置对应关系*****************/ teacher1.setStudentSet(students); teacher2.setStudentSet(students); teacher3.setStudentSet(students); /***********************保存到数据库*****************/ dao.saveStudent(student1); dao.saveStudent(student2); dao.saveStudent(student3); dao.saveStudent(student4); teacherDao.saveTeacher(teacher1); teacherDao.saveTeacher(teacher2); teacherDao.saveTeacher(teacher3); } }
上面这种方式是在不设置级联的情况下进行的所以要同时保存student和teacher
dao.saveStudent(student1); dao.saveStudent(student2); dao.saveStudent(student3); dao.saveStudent(student4); teacherDao.saveTeacher(teacher1); teacherDao.saveTeacher(teacher2); teacherDao.saveTeacher(teacher3);
如果将级联设置为如下:
save-update:级联保存(load以后如果子对象发生了更新,也会级联更新). 但它不会级联删除
all-delete-orphan: 在解除父子关系时,自动删除不属于父对象的子对象, 也支持级联删除和级联保存更新。
那么只需要执行
/***********************保存到数据库*****************/ // dao.saveStudent(student1); // dao.saveStudent(student2); // dao.saveStudent(student3); // dao.saveStudent(student4); teacherDao.saveTeacher(teacher1); teacherDao.saveTeacher(teacher2); teacherDao.saveTeacher(teacher3);
配置只需要在set参数配置中添加属性就可以如下:
Student.hbm.xml:
<set name="teacherSet" table="teacher_student" cascade="save-update"> <key column="studentId"></key> <many-to-many class="com.school.domain.Teacher" column="teacherId"></many-to-many> </set>
Teacher.hbm.xml
<set name="studentSet" table="teacher_student" cascade="save-update"> <key column="teacherId"></key> <many-to-many class="com.school.domain.Student" column="studentId"></many-to-many> </set>
以上就是Hibernate的多对多映射。
相关推荐
在Java的持久化框架Hibernate中,多对多关联映射是一种常见的关系数据库模型映射方式,用于处理两个实体之间存在多个实例互相关联的情况。本文将深入探讨Hibernate如何实现多对多关联映射,并通过实际例子解析相关...
在这个“hibernate 多对多映射实例,学生 选课”项目中,我们将探讨如何使用Hibernate处理多对多关系,以及如何构建一个学生选课的系统。 首先,我们要理解多对多关系。在现实生活中,学生和课程之间就是一个典型的...
本篇主要探讨的是Hibernate中的多对多映射,这是一个复杂但常见的数据库关系,适用于那些实体之间存在多个关联的情况。 一、Hibernate多对多映射基础 多对多映射在数据库中表现为两个表通过一个中间表(或称为连接...
本教程将带你入门Hibernate的多对多实体映射,帮助你理解如何通过源码来实现这种复杂的关系映射。 一、Hibernate概述 Hibernate是一个对象关系映射(ORM)框架,它允许我们将Java对象(实体)与数据库表进行映射,...
本项目聚焦于Hibernate中的多对多关系映射,这是一种复杂但常见的数据库关联类型,适用于如用户角色、商品类别等场景。 **一、多对多关系** 在数据库设计中,多对多关系表示两个实体之间存在多个匹配的可能性。...
包含《多对多双向关联映射》《多对一单向关联映射》《多对一双向关联映射》《一对多单向关联映射》等文档,并有图解及例子,非常适合新手学习,尤其是刚刚接触hibernate,对映射关系不清楚的。。。。
**标题:“Hibernate多对多映射实战”** 在Java领域,ORM(对象关系映射)框架如Hibernate极大地简化了数据库操作。本示例主要聚焦于使用Hibernate处理数据库中的多对多关系,这是一种复杂但常见的关联类型。在关系...
在Java的持久化框架Hibernate中,多对多关联映射是一种常见的关系模型,它用于处理两个实体类之间存在多个对应关系的情况。这篇博客"hibernate多对多关联映射(单项关联)"深入探讨了如何在Hibernate中实现这种映射...
本文将深入探讨Hibernate中的一对多和多对一映射关系,并通过一个实际的demo演示它们在增删查改操作中的应用。 首先,我们要理解什么是数据库的关联关系。在数据库设计中,我们经常遇到一种情况,即一个实体可能与...
本主题聚焦于"hibernate单向多对多映射",特别是在XML配置文件中的实现。在这个过程中,我们将探讨多对多关系的原理,以及如何在Hibernate中通过XML配置文件来定义这种关系。 首先,我们需要理解多对多关系的概念。...
在本章中,我们将深入探讨Hibernate中的关联映射,包括一对多、多对一以及多对多的关系。这些映射关系对于理解如何在Java应用程序中有效地管理数据库对象至关重要。 首先,我们来解决描述中提到的问题。`...
本教程将详细讲解如何使用Hibernate来实现MySQL数据库中的一对多和多对一的映射关系。 ### 一、Hibernate简介 Hibernate是一个开源的ORM框架,它通过XML配置文件或者注解将Java对象映射到关系数据库表,实现了对象...
Hibernate 多对一、一对一、一对多、多对多映射的理解 Hibernate 是一个流行的 Java 持久层框架,它提供了多种方式来映射 Java 对象与数据库表之间的关系。其中,多对一、一对一、一对多、多对多是四种基本的映射...
"自动生成 Hibernate 映射文件和实体类" 自动生成 Hibernate 映射文件和实体类是使用 MyEclipse 工具来实现的,这可以大大提高开发效率,减少开发时间。下面将详细介绍如何使用 MyEclipse 自动生成 Hibernate 映射...
在Java的持久化框架Hibernate中,多对一(Many-to-One)映射是一种常见的关联关系。这种关系表示在一个实体类中可以引用另一个实体类的多个实例,而在被引用的实体类中,每个实例只被一个引用实体类实例引用。本文将...
在这个“hibernate学习入门之一对多实体映射源码”教程中,我们将深入探讨如何在Hibernate中设置和管理一对多的关系。 一、Hibernate简介 Hibernate是Java开发人员用于处理数据库操作的强大工具,通过它,我们可以...
在Java的持久化框架Hibernate中,单向多对多映射是一种常见的关系映射方式,尤其在处理数据库中两个实体间复杂关联时显得尤为重要。在注解版的Hibernate中,我们不再需要传统的XML配置文件,而是直接在实体类上使用...
本篇文章将深入探讨“Hibernate多对一映射”这一关键概念,并通过实例来阐述其工作原理。 ### 一、多对一映射概述 在数据库设计中,多对一关联意味着一个实体(表)可以与另一个实体(表)中的多个记录相关联,而...