JPA学习---第十一节:JPA中的多对多双向关联实体定义与注解设置及操作

1、定义实体类,代码如下:

(1)、学生实体类:

package learn.jpa.entity;

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.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.JoinColumn;

/**
 * @doc 多对多关系是对等的,认为决定谁是维护段,谁是被维护段
 *       通过中间表(中间表)来关联它们之间的关系
 */
@Entity
public class Student {

    private int id;
    private String name;
    private Set<Teacher> teacher = new HashSet<Teacher>();

    public Student() {
        super();
    }

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

    @Id
    @GeneratedValue
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    @Column(length=10,nullable=false)
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    /**
     * inverseJoinColumns 与被维护端关联外键
     * joinColumns 与维护段关联外键
     */
    @ManyToMany(cascade=CascadeType.REFRESH)
    @JoinTable(name="student_teacher",[email protected](name="teacher_id"),[email protected](name="student_id"))
    public Set<Teacher> getTeacher() {
        return teacher;
    }
    public void setTeacher(Set<Teacher> teacher) {
        this.teacher = teacher;
    }

    // 建立老师和学生的关系
    public void addTeacher(Teacher teachers){
        this.teacher.add(teachers);
    }

    // 解除老师和学生的关系
    // 删除 teacher 是根据 id来删除的,所有在 Teacher 类中要重写 equals() 和 hashCode()
    public void removeTeacher(Teacher teachers){
        if(this.teacher.contains(teachers)){
            this.teacher.remove(teachers);
        }
    }
}

(2)、老师实体类:

package learn.jpa.entity;

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 int id;
    private String name;
    private Set<Student> student = new HashSet<Student>();

    // 如果声明了有参数的构造函数,那么一定要声明无参构造函数
    public Teacher(){}

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

    @Id
    @GeneratedValue
    public int getId() {
        return id;
    }
    public void setId(int 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")
    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;
        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 != other.id)
            return false;
        return true;
    }

}

2、相关操作类,代码如下:

package learn.jpa.test;

import static org.junit.Assert.*;

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

import learn.jpa.entity.Student;
import learn.jpa.entity.Teacher;

import org.junit.Test;

public class ManyToManyTest {

    /**
     * 测试数据库是否可以生成表
     */
    @Test
    public void test() {
        EntityManagerFactory factory = Persistence.createEntityManagerFactory("learn_jpa");
        factory.close();
    }

    @Test
    public void save(){
        EntityManagerFactory factory = Persistence.createEntityManagerFactory("learn_jpa");
        EntityManager em = factory.createEntityManager();
        em.getTransaction().begin();   // 开启事务
        em.persist(new Student("xx"));
        em.persist(new Teacher("xiuliu"));
        em.getTransaction().commit();
        em.close();
        factory.close();
    }

    /**
     * 建立老师和学生的关系(将关联的字段数据保存到中间表中)
     */
    @Test
    public void buildTS(){
        EntityManagerFactory factory = Persistence.createEntityManagerFactory("learn_jpa");
        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("learn_jpa");
        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("learn_jpa");
        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(teacher);
        em.getTransaction().commit();
        em.close();
        factory.close();
    }

    // 删除学生
    @Test
    public void deleteStudent(){
        EntityManagerFactory factory = Persistence.createEntityManagerFactory("learn_jpa");
        EntityManager em = factory.createEntityManager();
        em.getTransaction().begin();   // 开启事务
        Student student = em.getReference(Student.class, 1);
        em.remove(student);
        em.getTransaction().commit();
        em.close();
        factory.close();
    }
}
时间: 2024-08-11 21:56:10

JPA学习---第十一节:JPA中的多对多双向关联实体定义与注解设置及操作的相关文章

JPA学习---第十节:JPA中的一对一双向关联

1.创建实体类,代码如下: 代码清单1: package learn.jpa.entity; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Join

JPA学习---第五节:日期和枚举等字段类型的JPA映射

1.在上一节可在数据库中看到创建出来的表和字段,是通过 Entity bean 来创建的,而创建表名和字段名的规则是怎样的? 有类,代码如下: package learn.jpa.bean; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; @Entity public class Person { @Id @GeneratedValue p

JPA学习---第十二节:JPA中的联合主键

1.定义实体类,代码如下: (1).将联合主键放到一个类中,代码如下: package learn.jpa.entity; import java.io.Serializable; import javax.persistence.Column; import javax.persistence.Embeddable; /** * * 1.必须要有无擦得构造函数 * 2.必须要实现序列接口 * 3.必须重写 equals() 和 hashCode() 方法 * @Embeddable 告诉 jp

JPA学习---第七节:使用JPA加载_更新_删除对象

1.添加数据,代码如下: @Test public void save(){ EntityManagerFactory factory = Persistence.createEntityManagerFactory("learn_jpa"); EntityManager em = factory.createEntityManager(); em.getTransaction().begin(); // 开启事务 em.persist(new Person("hwl&quo

JPA学习---第四节:JPA实例与JPA主键生成策略

1.编写实体类,代码如下: package learn.jpa.bean; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; @Entity public class Person { @Id @GeneratedValue private Integer id; private String name; public Person(){}

[ExtJS5学习笔记]第二十一节 Extjs5中使用config配置给ext.widget或者create方法传递参数

本文地址:http://blog.csdn.net/sushengmiyan/article/details/39252805 官方例子:http://docs.sencha.com/extjs/5.0/apidocs/#!/api/Ext.Class-cfg-config 本文作者:sushengmiyan ----------------------------------------------------------------------------------------------

JPA学习笔记-Spring整合JPA

Spring 整合 JPA 三种整合方式: -LocalEntityManagerFactoryBean:适用于那些仅使用 JPA 进行数据访问的项目,该 FactoryBean 将根据JPA PersistenceProvider 自动检测配置文件进行工作,一般从"META-INF/persistence.xml"读取配置信息,这种方式最简单,但不能设置 Spring 中定义的DataSource,且不支持 Spring 管理的全局事务 -从JNDI中获取:用于从 Java EE 服

Hibernate学习---第十一节:Hibernate之数据抓取策略&amp;批量抓取

1.hibernate 也可以通过标准的 SQL 进行查询 (1).将SQL查询写在 java 代码中 /** * 查询所有 */ @Test public void testQuery(){ // 基于标准的 sql 语句查询 String sql = "select * from t_person"; // 通过 createSQLQuery 获取 SQLQuery,而 SQLQuer 是 Query的子类 SQLQuery query = session.createSQLQue

算法学习(十一)数组中出现次数超过长度一半的数

数组中出现次数超过数组长度一半的 数字 题目描述: 给定 一个数组,找到数组中出现次数超过数组长度一半的数字,如数组 a[]= {0,1,2,1,1},输出为1 分析: 1,可以使用伴随数组b,遍历数组a,将值作为数组b的下标,将次数作为值,然后遍历数组b,找到次数超过一半的值,然后输出.时间复杂度为O(N),不过要增加空间复杂度. 2,我们可以先对数组进行排序,因为某个数字出现次数超过一半,所以在数组的N/2处,就一定是那个数字.时间复杂主要为排序的时间,使用快排O (N*logN). 3,有