Hibernate之关于多对多双向关联映射

简介:

多对多的双向关联映射在项目实战中还是相当重要的,所以这里着重写一下!以学生表(Student)和老师表(Teacher)为例。


首先我们还是先看Annotations配置!


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
@Entity
@Table (name= "t_student" )
public  class  Student {
     private  Integer id;
     private  String name;
     private  Integer age;
     private  Set<Teacher> teachers= new  HashSet<Teacher>(); //指定从学生也可以映射老师
     
     @ManyToMany (mappedBy= "students" )
     public  Set<Teacher>getTeachers() {
        returnteachers;
     }
     publicvoidsetTeachers(Set<Teacher> teachers) {
        this .teachers = teachers;
     }
     @Id
     @GeneratedValue
     public  Integer getId() {
        returnid;
     }
     publicvoid setId(Integerid) {
        this .id = id;
     }
     @Column (name= "s_name" )
     public  String getName() {
        returnname;
     }
     publicvoid setName(Stringname) {
        this .name = name;
     }
     @Column (name= "s_age" )
     public  Integer getAge() {
        returnage;
     }
     publicvoid setAge(Integerage) {
        this .age = age;
     }
}

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
@Entity
@Table (name= "t_teacher" )
public  class  Teacher {
     private  Integer id;
     private  String name;
     private  Set<Student> students= new  HashSet<Student>(); //set不允许重复,最适合数据库模型
     @Id
     @GeneratedValue
     public  Integer getId() {
        returnid;
     }
     publicvoid setId(Integerid) {
        this .id = id;
     }
     @Column (name= "t_name" )
     public  String getName() {
        returnname;
     }
     publicvoid setName(Stringname) {
        this .name = name;
     }
     @ManyToMany
     @JoinTable (name= "t_s_two" , //自定义表名
            joinColumns={ @JoinColumn (name= "teacher_id" )}, //自定义列名
            inverseJoinColumns={ @JoinColumn (name= "student_id" )}) //反转,和Teacher对应的那个表的ID,也是自定义
     public  Set<Student>getStudents() {
        returnstudents;
     }
     publicvoidsetStudents(Set<Student> students) {
        this .students = students;
     }
}


JunitTest单元测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
@Test
     publicvoid add(){
        try  {
            Configuration cfg= new  Configuration();
            cfg.configure();
            SessionFactory    sessionFactory=cfg.buildSessionFactory();
            Sessionsession=sessionFactory.openSession();
            session.beginTransaction();
            Student s= new  Student();
            s.setAge( 12 );
            s.setName( "张三" );
            session.save(s);
            Student s2= new  Student();
            s2.setAge( 13 );
            s2.setName( "李四" );
            session.save(s2);
            Teacher t= new  Teacher();
            t.setName( "张老师" );
            Teacher t2= new  Teacher();
            t2.setName( "李老师" );
            Set<Student>students=newHashSet<Student>();
            students.add(s);
            students.add(s2);
            t.setStudents(students);
//         Set<Teacher>teachers=new HashSet<Teacher>();
//         teachers.add(t);
//         teachers.add(t2);
//         s.setTeacher(teachers);
//         s2.setTeacher(teachers);
            session.save(t);
            session.save(t2);
            session.getTransaction().commit();
            sessionFactory.close();
        catch  (HibernateException e){
            e.printStackTrace();
        }
     }


XML配置方法


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<? 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  package = "csg.hibernate.entity" >
     < class  name = "Student"  table = "t_student" >
        < id  name = "id" >
            < column  name = "id" />
            < generator  class = "native"  />
        </ id >
        < property  name = "name"  />
        < property  name = "age"  />
        < set  name = "teachers"  table = "t_s_two" >
            < key  column = "student_id" />
            < many-to-many  class = "csg.hibernate.entity.Teacher"  column = "Teacher_id" />
        </ set >
     </ class >
</ hibernate-mapping >
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<? 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  package = "csg.hibernate.entity" >
     < class  name = "Teacher"  table = "t_teacher" >
        < id  name = "id" >
            < column  name = "id" />
            < generator  class = "native"  />
        </ id >
        < property  name = "name"  />
        < set  name = "students"  table = "t_s_two" >
            < key  column = "teacher_id" />
            < many-to-many  class = "csg.hibernate.entity.Student"  column = "student_id" />
        </ set >
     </ class >
</ hibernate-mapping >


Ok,大家看到的其实就是将XML中的Set里面的值进行拷贝,修改, 需要注意的是

tablecloum都需要一致!这样建立的中间表才正规!










本文转自 小夜的传说 51CTO博客,原文链接:http://blog.51cto.com/1936625305/1568931,如需转载请自行联系原作者
目录
相关文章
|
2月前
|
Java 数据库连接 API
解锁高效开发秘籍:深入探究 Hibernate 如何优雅处理一对多与多对多关系,让数据映射再无烦恼!
【9月更文挑战第3天】Hibernate 是 Java 领域中最流行的 ORM 框架之一,广泛用于处理实体对象与数据库表之间的映射。尤其在处理复杂关系如一对多和多对多时,Hibernate 提供了丰富的 API 和配置选项。本文通过具体代码示例,展示如何使用 `@OneToMany`、`@JoinColumn`、`@ManyToMany` 和 `@JoinTable` 等注解优雅地实现这些关系,帮助开发者保持代码简洁的同时确保数据一致性。
50 4
|
6月前
|
Java 数据库连接 数据库
hibernate多对多、正向工程创建数据表——访问温馨提示
hibernate多对多、正向工程创建数据表——访问温馨提示
|
SQL XML 存储
Hibernate框架【五】——基本映射——多对多映射
Hibernate框架【五】——基本映射——多对多映射
189 0
|
6月前
|
机器学习/深度学习 SQL Java
Hibernate - 多对多关联关系映射
Hibernate - 多对多关联关系映射
60 0
|
Java 数据库连接 数据库
hibernate多对多、正向工程创建数据表——访问温馨提示
hibernate多对多、正向工程创建数据表——访问温馨提示
|
XML Java 数据库连接
《Hibernate上课笔记》-----class5----Hibernate实现一对一关联映射
《Hibernate上课笔记》-----class5----Hibernate实现一对一关联映射
67 0
《Hibernate上课笔记》-----class5----Hibernate实现一对一关联映射
|
XML Java 数据库连接
《Hibernate上课笔记》------class6------Hibernate实现一对多关联映射
《Hibernate上课笔记》------class6------Hibernate实现一对多关联映射
61 0
《Hibernate上课笔记》------class6------Hibernate实现一对多关联映射
|
XML Java 数据库连接
《Hibernate上课笔记》-----class7----Hibernate实现多对多关联映射
《Hibernate上课笔记》-----class7----Hibernate实现多对多关联映射
93 0
《Hibernate上课笔记》-----class7----Hibernate实现多对多关联映射
|
Java 数据库连接 网络安全
【SSH快速进阶】——Hibernate 多对多映射
说到多对多关系,印象最深刻的就是大学的选修课。**一个学生可以选修多门课程,一门课程可以有多个学生选修,学生所选的每一门课程还有成绩**。这个场景的E-R图如下:
【SSH快速进阶】——Hibernate 多对多映射
|
SQL Java 数据库连接
【SSH快速进阶】——Hibernate一对一映射(one-to-one)——主键关联映射
 现实生活中,有很多场景需要用到一对一映射,比如每个学生只有一个学生证,每个公民只有一张身份证等。这里用公民-身份证来举例说明。
【SSH快速进阶】——Hibernate一对一映射(one-to-one)——主键关联映射