`

hibernate多对多双向关联

 
阅读更多

多对多双向关联:数据库中有一张students表(字段 id和name),teachers表(字段id和name) 还有一张关联表 s_t(字段id 外键stu_id(参考students表的id)和tea_id(参考teachers表的id))

 

类图如下:Student中还存在一个teachers 的集合



 Students.java

package com.org.model;


import java.util.Set;

public class Students {
    private int id;
    private String name;
    private Set<Teacher> teachers;//多对多关系一般有一个中间表用于相关联,Hibernate面向对象,更注重于对象关系

    public int getId() {
        return id;
    }

    public void setId(int 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.java

package com.org.model;


import java.util.Set;

public class Teacher {
    private int id;
    private String name;
    private Set<Students> students;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Set<Students> getStudents() {
        return students;
    }

    public void setStudents(Set<Students> students) {
        this.students = students;
    }

}

 Students.hbm.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 package="com.org.model">
	<class name="Students" table="students" >
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="name" not-null="true"/>
		
		<!-- set标签中的name用于指定映射的集合类型(即为Students类中多方对应的属性名 )
		       key标签中的column为s_t表中参照students表的外键-->
		<set name="teachers"  cascade="save-update" inverse="true" table="s_t">
			<key column="stu_id" not-null="true"></key>
			<!-- class表明set中放的是什么类型的集合,column指定s_t表中参照teacher表的外键 -->
			<many-to-many class="Teacher" column="tea_id"></many-to-many>      
		</set>
	</class>


</hibernate-mapping>

 Teacher.hbm.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 package="com.org.model">
	<class name="Teacher" table="teachers" >
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="name" not-null="true"/>
		
		<!-- set标签中的name用于指定映射的集合类型(即为Teacher类中多方对应的属性名 )
		       key标签中的column为s_t表中参照teacher表的外键-->
		<set name="students"  cascade="save-update" table="s_t">
			<key column="tea_id" not-null="true"></key>
			<!-- class表明set中放的是什么类型的集合,column指定s_t表中参照students表的外键 -->
			<many-to-many class="Students" column="stu_id"></many-to-many>     
		</set>
	</class>


</hibernate-mapping>

 hibernate.cfg.xml

<mapping resource="com/org/model/Students.hbm.xml" />
<mapping resource="com/org/model/Teacher.hbm.xml" />

 测试类:

package com.org.model.test;

import java.util.HashSet;
import java.util.Set;

import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;

import com.org.model.Students;
import com.org.model.Teacher;
import com.org.util.HibernateUtil;

public class HibernateTest2 {

	@Test
	public void testSave1() {
		Session session = null;
		Transaction tx = null;
		try {

			// 拿到session
			session = HibernateUtil.getSession();
			// 开启事务
			tx = session.beginTransaction();

			// 给实体赋值

			Set<Teacher> ts = new HashSet<Teacher>();
			Teacher t1 = new Teacher();
			t1.setName("XiangfGang1");
			ts.add(t1);

			Teacher t2 = new Teacher();
			t2.setName("ZhengHui1");
			ts.add(t2);

			Teacher t3 = new Teacher();
			t3.setName("WangJinFeng1");
			ts.add(t3);

			Set<Students> ss = new HashSet<Students>();
			Students sd1 = new Students();
			sd1.setName("ChengHai1");
			ss.add(sd1);

			Students sd2 = new Students();
			sd2.setName("JiangKui1");
			ss.add(sd2);

			Students sd3 = new Students();
			sd3.setName("YanJiaYang1");
			ss.add(sd3);

			t1.setStudents(ss);
			t2.setStudents(ss);
			t3.setStudents(ss);
			session.save(t1);
			session.save(t2);
			session.save(t3);
			// 告诉学生有哪些老师,与上面告诉老师有哪些学生任选一种即可
			// sd1.setTeachers(ts);
			// sd2.setTeachers(ts);
			// sd3.setTeachers(ts);
			// session.save(sd1);
			// session.save(sd2);
			// session.save(sd3);

			// 提交事务
			tx.commit();

		} catch (Exception e) {
			// 打印堆栈信息
			e.printStackTrace();
			// 事务回滚
			if (tx != null) {
				tx.rollback();
			}
		} finally {
			HibernateUtil.closeSession(session);
		}
	}

}

 结果:

Hibernate: insert into teachers (name) values (?)
Hibernate: insert into students (name) values (?)
Hibernate: insert into students (name) values (?)
Hibernate: insert into students (name) values (?)
Hibernate: insert into teachers (name) values (?)
Hibernate: insert into teachers (name) values (?)
Hibernate: insert into s_t (tea_id, stu_id) values (?, ?)
Hibernate: insert into s_t (tea_id, stu_id) values (?, ?)
Hibernate: insert into s_t (tea_id, stu_id) values (?, ?)
Hibernate: insert into s_t (tea_id, stu_id) values (?, ?)
Hibernate: insert into s_t (tea_id, stu_id) values (?, ?)
Hibernate: insert into s_t (tea_id, stu_id) values (?, ?)
Hibernate: insert into s_t (tea_id, stu_id) values (?, ?)
Hibernate: insert into s_t (tea_id, stu_id) values (?, ?)
Hibernate: insert into s_t (tea_id, stu_id) values (?, ?)

 因为中间表的关系由Teacher端维护,所以插入Teacher的时候会插入关联关系。只能一段来维护关系,不能两端同时维护关系,这样会导致在中间表出现重复插入的现象。

  • 大小: 15.6 KB
分享到:
评论

相关推荐

    Hibernate多对多双向关联(annotation/xml)

    本主题将深入探讨使用Hibernate进行多对多双向关联的实现,既可以通过注解(Annotation)方式,也可以通过XML配置文件来完成。 首先,我们来看多对多关联的基本概念。在数据库设计中,当两个实体之间存在多个实例...

    Hibernate ORM - 一对多双向关联关系

    标题“Hibernate ORM - 一对多双向关联关系”指的是在数据库建模中,Hibernate ORM(对象关系映射)框架如何处理一个实体类(如User)与多个实体类(如Article)之间的关系。在这种关系中,一个用户可以拥有多个文章...

    hibernate一对多,多对一,一对多双向关联

    “Hibernate 一对多,多对一,一对多双向关联”是指在Java持久化框架Hibernate中,实体间常见的三种关联关系。在数据库设计中,这种关联关系是常见的,例如一个用户可以有多个订单(一对多),一个订单对应一个用户...

    Hibernate ORM - 多对多双向连接表关联关系

    在Hibernate中,实现多对多双向关联主要涉及以下步骤: 1. **配置实体类**:首先,你需要为每个参与关联的实体定义一个Java类,并添加相应的属性。例如,对于“学生-课程”关系,可以有`Student`和`Course`类,它们...

    Hibernate一对多双向自身关联demo代码

    在这个“Hibernate一对多双向自身关联demo代码”中,我们将深入理解如何实现一个实体类与其自身进行一对多的双向关联。这种关联在实际应用中常见于例如用户的朋友关系、员工的上下级关系等场景。 首先,让我们了解...

    Hibernate一对一主键关联映射(双向关联)

    标题"Hibernate一对一主键关联映射(双向关联)"中的"主键关联"指的是两个实体通过共享相同的主键来建立关联。"双向关联"则意味着在两个实体类中,都可以直接访问到对方的实例,即在实体A中有一个对实体B的引用,...

    hibernate表之间3种双向关联映射

    总结来说,Hibernate中的双向关联映射是对象关系映射的重要组成部分,包括双向多对多、双向一对多和双向一对一。理解并熟练运用这些映射方式,有助于开发者更好地实现Java应用程序与数据库间的交互,提高开发效率和...

    hibernate双向一对多关联映射(注解版)

    对于"hibernate双向一对多关联映射(注解版)",我们可以按照以下步骤进行: 1. **定义实体类**:首先,我们需要创建两个实体类,例如`Parent`和`Child`。在`Parent`类中,`Child`是一个集合,而在`Child`类中,`...

    hibernate关联映射详解

    包含《多对多双向关联映射》《多对一单向关联映射》《多对一双向关联映射》《一对多单向关联映射》等文档,并有图解及例子,非常适合新手学习,尤其是刚刚接触hibernate,对映射关系不清楚的。。。。

    Hibernate双向一对一关联映射(注解版)

    本主题聚焦于“Hibernate双向一对一关联映射”的注解实现,这是一种高级的数据库设计模式,用于处理两个实体之间一对一的关系。 在Hibernate中,一对一关联映射分为单向和双向。单向一对一映射通常涉及一个实体持有...

    hibernate多对多关联映射(单项关联)

    在Hibernate中,多对多关联可以通过定义双向或单向的关联来实现。"单项关联"通常指的是只在一个实体类中定义了与另一个实体的关联,而在另一个实体类中没有对应的引用。这可以通过使用`@ManyToMany`注解来完成。 ...

    Hibernate一对多(多对一)双向关联(annotation/xml)

    总之,理解和熟练运用Hibernate的一对多、多对一以及双向关联,是提升Java企业级应用开发效率的关键。通过注解或XML配置,开发者可以灵活地定义实体间的关联,实现数据的持久化。同时,注意级联操作、懒加载策略等...

    hibernate 多对多全注解(单向关联、双向关联)

    hibernate关联映射注解多对多单向关联、

    hibernate双向多对多关联映射(注解版)

    在这个“hibernate双向多对多关联映射(注解版)”的主题中,我们将深入探讨如何使用Hibernate的注解配置来处理数据库中的双向多对多关联关系。 首先,多对多关联在数据库设计中是指两个实体之间存在多个对应关系,...

    Hibernate Annotation 基于外键的一对多双向关联

    本文将深入探讨如何使用Hibernate注解实现基于外键的一对多双向关联。我们将通过具体实例来解析这个主题,并结合源码分析其工作原理。 首先,我们要明白一对多关联意味着一个实体可以拥有多个关联的实体。在数据库...

Global site tag (gtag.js) - Google Analytics