`

JPA 多对多实例配置

    博客分类:
  • JPA
JPA 
阅读更多
@Entity
public class Student {

	private Integer s_id;

	private String s_name;

	private Set<Teacher> teachers = new HashSet<Teacher>();

	public Student() {
		
	}

	public Student(String s_name) {
		this.s_name = s_name;
	}

	@Id
	@GeneratedValue
	public Integer getS_id() {
		return s_id;
	}

	public void setS_id(Integer s_id) {
		this.s_id = s_id;
	}

	@Column(nullable = false, length = 20)
	public String getS_name() {
		return s_name;
	}

	public void setS_name(String s_name) {
		this.s_name = s_name;
	}

	@ManyToMany(mappedBy = "students")
	public Set<Teacher> getTeachers() {
		return teachers;
	}

	public void setTeachers(Set<Teacher> teachers) {
		this.teachers = teachers;
	}

	@Override
	public int hashCode() {
		final int PRIME = 31;
		int result = 1;
		result = PRIME * result + ((s_id == null) ? 0 : s_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;
		final Student other = (Student) obj;
		if (s_id == null) {
			if (other.s_id != null)
				return false;
		} else if (!s_id.equals(other.s_id))
			return false;
		return true;
	}

}

 

@Entity
public class Teacher {

	private Integer t_id;

	private String t_name;

	private Set<Student> students = new HashSet<Student>();

	public Teacher() {

	}

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

	@Id
	@GeneratedValue
	public Integer getT_id() {
		return t_id;
	}

	public void setT_id(Integer t_id) {
		this.t_id = t_id;
	}

	@Column(nullable = false, length = 20)
	public String getT_name() {
		return t_name;
	}

	public void setT_name(String t_name) {
		this.t_name = t_name;
	}

	@ManyToMany()
	@JoinTable(name = "student_teacher", inverseJoinColumns = @JoinColumn(name = "student_id"), joinColumns = @JoinColumn(name = "teacher_id"))
	public Set<Student> getStudents() {
		return students;
	}

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

	/**
	 * 添加学生
	 * 
	 * @param stu
	 */
	public void addStudent(Student stu) {
		this.students.add(stu);
	}

	/**
	 * 删除学生
	 * @param stu
	 */
	public void removeStudent(Student stu) {
		if(this.students.contains(stu)){
			this.students.remove(stu);
		}
	}
}

测试如下:

public class JPA_ManyToManyTest {
	@Test
	public void manyTomany() throws Exception {
		EntityManagerFactory factory = Persistence
				.createEntityManagerFactory("mengya");
		factory.close();
	}

	/**
	 * 保存数据并建立关系
	 * 
	 * @throws Exception
	 */
	@Test
	public void save() throws Exception {
		EntityManagerFactory factory = Persistence
				.createEntityManagerFactory("mengya");
		EntityManager em = factory.createEntityManager();
		em.getTransaction().begin();
		Teacher teacher = new Teacher("梦娅");
		Student stu = new Student("张明学");
		// 建立关系
		teacher.addStudent(stu);
		em.persist(stu);
		em.persist(teacher);
		em.getTransaction().commit();
		em.close();
		factory.close();
	}

	/**
	 * 解除关系
	 * 
	 */
	@Test
	public void removeTeacherStudent() {
		EntityManagerFactory factory = Persistence
				.createEntityManagerFactory("mengya");
		EntityManager em = factory.createEntityManager();
		em.getTransaction().begin();
		Teacher t = em.find(Teacher.class, 1);
		t.removeStudent(em.getReference(Student.class, 1));
		em.getTransaction().commit();
		em.close();
		factory.close();
	}

	@Test
	public void deleteStudentTeacher() {
		EntityManagerFactory factory = Persistence
				.createEntityManagerFactory("mengya");
		EntityManager em = factory.createEntityManager();
		em.getTransaction().begin();
		em.remove(em.getReference(Student.class, 1));
		em.remove(em.getReference(Teacher.class, 1));
		em.getTransaction().commit();
		em.close();
		factory.close();
	}

	// 操作成功

	@Test
	public void deleteTeacherStudent() {
		EntityManagerFactory factory = Persistence
				.createEntityManagerFactory("mengya");
		EntityManager em = factory.createEntityManager();
		em.getTransaction().begin();
		em.remove(em.getReference(Teacher.class, 2));
		em.remove(em.getReference(Student.class, 2));
		em.getTransaction().commit();
		em.close();
		factory.close();
	}

	// 操作成功

	/**
	 * 删除失败,学生是关系被维护端无权更新外键
	 * 
	 */
	@Test
	public void deleteStudent() {
		EntityManagerFactory factory = Persistence
				.createEntityManagerFactory("mengya");
		EntityManager em = factory.createEntityManager();
		em.getTransaction().begin();
		em.remove(em.getReference(Student.class, 3));
		em.getTransaction().commit();
		em.close();
		factory.close();
	}

	/**
	 * 删除成功,老师是关系维护端有权更新外键
	 * 
	 */
	@Test
	public void deleteTeacher() {
		EntityManagerFactory factory = Persistence
				.createEntityManagerFactory("mengya");
		EntityManager em = factory.createEntityManager();
		em.getTransaction().begin();
		em.remove(em.getReference(Teacher.class, 3));
		em.getTransaction().commit();
		em.close();
		factory.close();
	}

}

 

分享到:
评论

相关推荐

    JPA一对一关系实例配置

    本实例将详细探讨JPA中的一对一(OneToOne)关系配置,以及如何在实际项目中实现。 一对一关系在数据库设计中意味着两个实体之间存在一个实体对应另一个实体的唯一关系。例如,一个人可能只有一个护照,或者一个...

    JPA双向一对多实例配置

    JPA中双向一对多实体Bean的属性配置,包括延迟加载,级联删除等

    jpa例子jpajpa

    2. **实体管理工厂(EntityManagerFactory)**: 这是创建和配置JPA的入口点,通过它我们可以获取到`EntityManager`实例。一般在应用启动时创建,然后在整个应用生命周期内复用。 3. **实体管理器(EntityManager)*...

    JPA多对多Demo

    综上所述,“JPA多对多Demo”是一个全面展示多对多关联关系及其操作的实例。它涵盖了实体的配置、关联关系的建立、查询、持久化操作和事务管理等多个方面,对于理解JPA的多对多关联有很好的学习价值。通过这个示例,...

    JPA 一对一实例配置

    本篇文章将聚焦于JPA中的一对一(OneToOne)关联映射的实例配置,这在处理两个实体之间一对一关系时非常有用。 在一对一关联中,一个实体对应另一个实体的唯一实例。这种关系可以通过在实体类中定义注解来实现。JPA...

    JPA一对多双向配置实例

    **JPA一对多双向配置实例详解** 在Java Persistence API (JPA)中,"一对多"关系是数据库中常见的关联类型,它表示一个实体(如用户)可以与多个其他实体(如订单)相关联。本实例将深入探讨如何在JPA中配置一对多的...

    Spring Boot+Jpa多数据源配置Demo(支持不同数据库)

    在Spring Boot中,我们可以通过创建不同的`DataSource` bean来配置多个数据源。每个数据源通常会有一个对应的`JdbcTemplate`或`JpaEntityManagerFactory`。首先,我们需要在`application.yml`或`application....

    JPA一对一,一对多,多对多关系映射

    本篇将深入探讨JPA中的一对一(OneToOne)、一对多(OneToMany)以及多对多(ManyToMany)关系映射。 ### 1. JPA 一对一(OneToOne)关系映射 **概念**:一对一关系意味着两个实体之间存在唯一的关联,一个实体...

    Spring+Hibernate+Jpa+Struts2整合实例

    标题 "Spring+Hibernate+Jpa+Struts2整合实例" 描述的是一个综合性的Web开发教程,它将四个关键的Java技术框架集成在一起,用于构建高效的企业级应用程序。这个实例涵盖了Spring作为整体应用的管理框架,Hibernate...

    springjpa 和 spring多视图配置实例

    本实例探讨的是如何在Spring环境中整合Spring MVC、Spring Data JPA以及使用Freemarker或JSON作为多视图配置。让我们深入理解这些技术及其相互作用。 首先,Spring MVC是Spring框架的一部分,专门用于构建Web应用...

    jpa开发实例和文档

    **JPA文档**通常会详细讲解这些概念,包括如何配置JPA,如何创建和使用实体,如何执行查询,以及如何处理关联(如一对一、一对多、多对多)等。快速入门JPA的步骤可能包括安装和配置JPA供应商(如Hibernate、Eclipse...

    JPA中的多对多双向关联实体定义与注解设置

    在这个主题中,我们将深入探讨如何在JPA中定义和配置双向多对多关联实体,并通过注解进行设置。 首先,我们需要了解JPA中的几个关键注解: 1. `@Entity`:标记一个类作为JPA的实体类,使得该类可以被JPA管理并映射...

    spring整合jpa简单实例

    **Spring 整合 JPA 简单实例** 在现代的Java开发中,Spring框架与JPA(Java Persistence API)的结合使用已经成为了一个常见的实践,它简化了数据库操作,提供了对象关系映射(ORM)的功能。JPA是Java EE的一部分,...

    JPA环境搭建及JPA实例与JPA主键生成策略

    **JPA实例** 创建JPA实体类通常是一个Java类,通过使用`@Entity`注解来标识。例如: ```java import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence....

    spring Data JPA框架实例

    此外,Spring Data JPA还集成了Hibernate验证,可以对实体属性进行约束,比如`@NotNull`, `@Size`, `@Email`等,这些验证规则在保存或更新实体时会自动检查。 在实际开发中,我们还需要考虑异常处理,如`...

    spring 整合 hibernate jpa2 实例

    Spring Data JPA是Spring的一个模块,它提供了对JPA的高级抽象,使得我们可以很容易地实现CRUD操作和复杂查询。 在项目结构中,创建一个名为`persistence.xml`的文件,这是JPA的配置文件,位于`src/main/resources/...

    springBoot Jpa多数据源配置.rar

    下面将详细解释如何在Spring Boot中设置JPA的多数据源配置。 首先,我们需要理解数据源是什么。数据源是连接到数据库的桥梁,它封装了数据库连接池,提供获取数据库连接的方法。在Spring Boot中,我们可以使用`...

    JPA实例 经典

    **Java Persistence API (JPA) 实例 - 经典篇** ...通过学习和实践这些JPA实例,开发者可以深入了解JPA的工作原理,从而更好地在实际项目中利用其优势,简化数据库操作,提高代码的可维护性和可扩展性。

    spring2.5 + jpa(hibernate3) 实例源码

    这个实例提供了如何在Spring环境中配置和使用JPA进行数据库操作的源代码。 【描述】提到的关键点是,此实例不包含运行所需的JAR文件,用户需要自己从互联网上下载相关依赖并添加到项目的LIB目录。这表明了在实际...

    JPA教程 JPA pdf文档,实例解析

    7. **关系映射**: JPA支持多种关系类型,如一对一(@OneToOne)、一对多(@OneToMany)、多对一(@ManyToOne)和多对多(@ManyToMany)。通过`@JoinColumn`和`@JoinTable`注解可以指定关联表的细节。 8. **懒加载...

Global site tag (gtag.js) - Google Analytics