`
jiangduxi
  • 浏览: 456575 次
  • 性别: 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(Java ...`@ManyToMany`和`@OneToMany`注解是JPA中处理复杂关系的重要工具,通过测试可以确保这些关系正确地映射和持久化。在实际项目中,理解并熟练运用这些概念对于提升开发效率和代码质量至关重要。

    springboot 1.5.2 jpa ManyToMany Demo

    总结起来,Spring Boot 1.5.2结合JPA处理ManyToMany关联时,需要注意双向引用可能导致的无限递归问题,通过`@JsonManagedReference`和`@JsonBackReference`来解决序列化问题,并合理管理事务和级联操作,以确保数据...

    spring jpa ManyToMany原理及用法详解

    Spring JPA ManyToMany 原理及用法详解 Spring JPA 中的 ManyToMany 关系是一种复杂的关系,它允许一个实体与多个其他实体发生关系。在本文中,我们将详细介绍 Spring JPA ManyToMany 关系的原理及用法。 首先,...

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

    总之,JPA的`@ManyToMany`注解为我们处理多对多关联提供了便利,但在实际应用中需要注意关联的维护和删除操作,以确保数据的完整性和一致性。通过理解和熟练运用这一特性,开发者能够更好地在Java应用中管理复杂的...

    jpa-day3-manytomany.zip

    在这个“jpa-day3-manytomany.zip”压缩包中,我们很可能会找到一个关于如何在Spring Data JPA中处理多对多关系的示例或教程。下面,我们将深入探讨多对多关联的概念以及如何在实际应用中使用它。 首先,让我们理解...

    JPA大全之经典全集

    **JPA(Java Persistence API)**是...总之,"JPA大全之经典全集"这个资源集合对于学习和掌握JPA有着重要的价值,无论是初学者还是经验丰富的开发者,都能从中受益,深入理解JPA的各个方面,提升自己的数据库编程能力。

    JPA源文件/jpa学习

    JPA 2.0引入了许多增强功能,比如支持@OneToMany和@ManyToMany关系的双向映射,新增了@Temporal注解以处理日期和时间,增强了Criteria API,引入了@SecondaryTable注解以支持多表映射,还引入了Entity Graph来优化...

    JPA中文解释,JPA的API

    在JPA中,注解如`@Entity`用于标记实体类,`@Table`指定对应的数据库表,`@Id`定义主键,`@Column`定义字段属性,`@OneToMany`、`@ManyToOne`、`@OneToOne`和`@ManyToMany`处理关联关系等。针对Oracle,可能还会涉及...

    JPA教程,包括TOPLink JPA,Hibernate JPA,Open Jpa,jpa批注

    Hibernate是最早的ORM框架之一,后来成为了JPA的一个实现。Hibernate JPA提供了JPA规范的全部功能,并且在JPA的基础上扩展了一些特性,如更强大的 Criteria 查询、HQL(Hibernate Query Language)等。Hibernate JPA...

    SpringBoot-SpringData-ManyToMany

    在Spring Boot项目中,`ManyToMany`关系的实现主要依赖于Spring Data JPA,它是Spring Data的一个模块,简化了与JPA(Java Persistence API)的交互。下面将详细介绍如何在Spring Boot中配置和使用`ManyToMany`关系...

    jpa之使用hibernate示例代码

    在"jpa之使用hibernate示例代码"中,我们可能会涉及以下关键知识点: 1. **实体类(Entity)**:在JPA中,实体类是Java类,代表数据库中的表。它需要使用`@Entity`注解标记,并且通常有一个主键字段,用`@Id`注解...

    学习hibernate必读,JPA2新特征和JPA2映射的神秘之旅。

    "JavaOne2009-JPA2映射的神秘之旅.pdf" 和 "JavaOne2009-JPA2新特征.pdf" 这两个文档,显然涵盖了JPA2的重要概念和新特性,特别是关于映射和框架的最新发展。以下是这两个主题的主要知识点: 1. **JPA2新特性**: ...

    JPA 黎活明JPA视频代码

    在JPA中,使用`@ManyToMany`注解来定义这种关系,并通常需要一个中间表来存储关联信息。 4. **JPAOneToOne**:这里演示的是JPA中一对一关联的实现。一对一关联是指一个实体只与另一个实体的一个实例相关联。使用`@...

    JPA 标注 JPA标签手册

    - `@ManyToMany`:表示多对多关系,一方可以有多个另一方实例,反之亦然。 - `@JoinColumn` 和 `@JoinTable`:定义关联的列或表。 4. **扩展和特殊功能**: - `@Temporal`:处理日期和时间类型的存储。 - `@Lob...

    JPA映射关系详解javax JPA JPA映射关系 JPA映射

    JPA 提供了一种对象关系映射 (ORM) 方法来处理数据库,允许开发者以面向对象的方式操作数据库。本文将详细介绍 JPA 中四种常见的映射关系:一对一(One-to-One)、一对多(One-to-Many)、多对一(Many-to-One)以及...

    JPA

    JPA允许开发人员将数据库表映射到Java对象,从而在应用程序中以面向对象的方式处理数据,而无需直接操作SQL语句。 ### JPA的核心概念 在深入细节之前,了解JPA的基本概念至关重要: - **实体(Entity)**:这是...

    manytomany注解模式.rar

    `@ManyToMany`注解是Java Persistence API (JPA) 和Hibernate中的一个关键元素,它允许开发者定义两个实体类之间的多对多关联。 描述中提到的"manytomany注解模式.rar"进一步确认了这个压缩包内容的核心是围绕多对...

    jpa经典文档呀

    8. **关联映射**:JPA支持一对一、一对多、多对一和多对多的关系映射,通过@OneToOne、@OneToMany、@ManyToOne和@ManyToMany注解实现。 9. **懒加载和级联操作**:懒加载可以延迟加载关联的对象,直到真正需要时才...

    JPA讲解视频

    Hibernate是一个流行的开源对象关系映射(ORM)框架,它完全支持JPA规范,使得开发者可以利用Hibernate的强大功能来处理JPA的持久化操作。 **JPA的主要概念和功能包括:** 1. **实体(Entities)**:在JPA中,实体...

    JPA详细文档(JPA 批注参考)

    Java 持续性API(JPA)是Java ...此外,JPA支持事务管理和事件处理,进一步完善了Java应用程序与数据库的集成。总的来说,JPA为Java开发者提供了强大的工具,降低了数据库编程的复杂性,提高了代码的可读性和可维护性。

Global site tag (gtag.js) - Google Analytics