`
jiangduxi
  • 浏览: 443822 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

JPA之ManyToMany的处理

阅读更多
  在处理关系中,最为麻烦的可能是多对多的关系处理,因为多对多的关系要要一个中间表来进行维护。但是实际上多对多的关系也是我们比较常见的一种关系。

业务需求:在学校的选课系统中老师和学生的关系则是一种多对多的关系
首先还是将老师和学生的实体类编写出来。
import java.util.HashSet;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;

@Entity
public class Student {

	private Integer id;
	private String name;
	private Set<Teacher> teachers = new HashSet<Teacher>();//用集合类来存放teacher
	
	public Student(){}
	
	public Student(String name) {
		this.name = name;
	}

	@Id
	@GeneratedValue
	public Integer getId() {
		return id;
	}

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

	@Column(length = 10, nullable = false)
	public String getName() {
		return name;
	}

	@ManyToMany(cascade = CascadeType.REFRESH)
	@JoinTable(name = "student_teacher", inverseJoinColumns = @JoinColumn(name = "teacher_id"), joinColumns = @JoinColumn(name = "student_id")) //JoinTable就是定义中间表的名字以及关联字段名
	public Set<Teacher> getTeacher() {
		return teachers;
	}
	public void setTeacher(Set<Teacher> teacher) {
		this.teachers = teacher;
	}

	public void setName(String name) {
		this.name = name;
	}
	
         
	public void addTeacher(Teacher teacher){
		this.teachers.add(teacher);
	}
	
	public void removeTeacher(Teacher teacher){
		 if(this.teachers.contains(teacher)){//判断该学生是否包含了这个老师,如果存在就删除。这里要重新Teacher类中的hashCode和equals方法
			 this.teachers.remove(teacher);
		 }
	}
}



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

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToMany;


@Entity
public class Teacher {
	private Integer id;
	private String name;
    private Set<Student> student = new HashSet<Student>();
    

    public Teacher(){}
	public Teacher(String name) {
		this.name = name;
	}

	@Id
	@GeneratedValue
	public Integer getId() {
		return id;
	}

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

	@Column(length = 10, nullable = false)
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
	
    @ManyToMany(cascade=CascadeType.REFRESH,mappedBy="teacher")//这里说明了关系维护端是student,teacher是关系被维护端
	public Set<Student> getStudent() {
		return student;
	}

	public void setStudent(Set<Student> student) {
		this.student = student;
	}
	
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((id == null) ? 0 : id.hashCode());
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Teacher other = (Teacher) obj;
		if (id == null) {
			if (other.id != null)
				return false;
		} else if (!id.equals(other.id))
			return false;
		return true;
	}
}


测试类
package junit.test;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

import org.junit.BeforeClass;
import org.junit.Test;

import cn.itcast.bean.Student;
import cn.itcast.bean.Teacher;

public class ManyToManyTest {

	@BeforeClass
	public static void setUpBeforeClass() throws Exception {

	}

	@Test
	public void save() {
		EntityManagerFactory factory = Persistence
				.createEntityManagerFactory("test");
		EntityManager em = factory.createEntityManager();
		em.getTransaction().begin();
		em.persist(new Student("Twe"));
		em.persist(new Teacher("蒋老师"));
		em.getTransaction().commit();
		em.close();
		factory.close();
	}

	/**
	 * 建立学生和老师的关系
	 */
	@Test
	public void buildTS() {
		EntityManagerFactory factory = Persistence
				.createEntityManagerFactory("test");
		EntityManager em = factory.createEntityManager();
		em.getTransaction().begin();
		Student student = em.find(Student.class, 1);
		student.addTeacher(em.getReference(Teacher.class, 1));

		em.getTransaction().commit();
		em.close();
		factory.close();
	}

	/**
	 * 解除学生和老师的关系
	 */
	@Test
	public void deleteTS() {
		EntityManagerFactory factory = Persistence
				.createEntityManagerFactory("test");
		EntityManager em = factory.createEntityManager();
		em.getTransaction().begin();
		Student student = em.find(Student.class, 1);
		student.removeTeacher(em.getReference(Teacher.class, 1));
		em.getTransaction().commit();
		em.close();
		factory.close();
	}

	/**
	 * 删除老师
	 */
	@Test
	public void deleteTeacher() {
		EntityManagerFactory factory = Persistence
				.createEntityManagerFactory("test");
		EntityManager em = factory.createEntityManager();
		em.getTransaction().begin();
		Student student = em.find(Student.class, 1);
		Teacher teacher = em.getReference(Teacher.class, 1);
		student.removeTeacher(teacher);
		em.remove(em.getReference(Teacher.class, 1));
		em.getTransaction().commit();
		em.close();
		factory.close();
	}

	/**
	 * 删除学生
	 */
	@Test
	public void deleteStudent() {
		EntityManagerFactory factory = Persistence
				.createEntityManagerFactory("test");
		EntityManager em = factory.createEntityManager();
		em.getTransaction().begin();
		Student student = em.getReference(Student.class, 1);
		em.remove(student);
		em.getTransaction().commit();
		em.close();
		factory.close();
	}
}


总结:这里更要注意关系维护端和关系被维护端。
分享到:
评论

相关推荐

    JPA课程manyToMany OneToMany 等全部测试

    JPA课程manyToMany OneToMany 等全部测试 注解, 有注释

    springboot 1.5.2 jpa ManyToMany Demo

    趟坑 ManyToMany 循环引用 死循环 栈内存溢出问题

    spring jpa ManyToMany原理及用法详解

    主要介绍了spring jpa ManyToMany原理及用法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    JPA学习总结(四)--JPAManyToMany双向关联

    NULL 博文链接:https://lc2586.iteye.com/blog/722671

    jpa-day3-manytomany.zip

    spring data jpa 的多表联查 多对多操作 案例:用户和角色(多对多关系) 用户: 角色:

    Spring Boot JPA中关联表的使用

    Spring Boot JPA中关联表的使用 本文中,我们会将会通过一个Book和Category的关联关系,来讲解如何在JPA中使用。 添加依赖 我们还是使用H2内存数据库来做测试: org.springframework.boot spring-boot-starter-...

    JPA 标注 JPA标签手册

    这是JPA标签配置手册,从ORACLE官方得到的资料,里面对JPA所有的标签都进行详细的说明。 Index of Annotations • A o @AssociationOverride o @AssociationOverrides o @AttributeOverride o @AttributeOverrides ...

    BOS 技术整理

    @ManyToMany 一方写 mappedBy 放弃外键维护、另一方 @JoinTable 维护中间表 收派标准修添加能实现 html 请求 后台处理 服务器端Service和DAO编写整合springdatajpa 业务层接口 修改 Action 代码调用 ...

    医院管理::医院系统

    医院预约系统End-End Java Spring Boot应用程序和重新检查... 这个微型项目的概念介绍:1.Hibernate继承2.Spring数据JPA关联1.ManyToMany 2.OneToMany 3.ManyToOne 3.组件继承4.Java 8新概念1.Funtional接口2.Streams

    sd-project-2018-initiativesplatform:GitHub Classroom创建的sd-project-2018-initiativesplatform

    伊利亚米亚·维奥雷尔(Ieremias Viorel)和瓦拉迪·罗伯特 分层架构+ MVC +客户端-服务器; DP:构建器(User.java)+过滤器(WebSecurityConfig.... SpringBoot + JPA + Thymeleaf + JavaScript / jQuery; Gradle。

    Hibernate注释大全收藏

    @Inheritance 注解来定义所选的之类策略。 每个类一张表 @Entity @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) public class Flight implements Serializable { 有缺点,如多态查询或关联。...

Global site tag (gtag.js) - Google Analytics