jpa多对多映射案例

学生和老师就是多对多的关系。一个学生有多个老师,一个老师教多个学生。多对多映射采取中间表连接的映射策略,建立的中间表将分别引入两边的主键作为外键。jpa 对于中间表的元数据提供了可配置的方式,用户可以自定义中间表的表名,列名。

下面就以学生和老师为例介绍多对多映射关系的实例开发

 

Student实体类 

复制代码
package com.ljq.entity;

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

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

@SuppressWarnings("serial")
@Entity
public class Student implements java.io.Serializable {
    /** 学生ID **/
    private Integer studentid;
    /** 学生姓名 **/
    private String name;
    private Set<Teacher> teachers=new HashSet<Teacher>();
    
    public Student() {
        super();
    }
    
    public Student(String name) {
        super();
        this.name = name;
    }
    
    @Id
    @GeneratedValue
    public Integer getStudentid() {
        return studentid;
    }

    public void setStudentid(Integer studentid) {
        this.studentid = studentid;
    }

    @Column(nullable=false,length=32)
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    
    //@ManyToMany注释表示Student是多对多关系的一边,mappedBy属性定义了Student为双向关系的维护端
    //Teacher表是关系的维护者,owner side,有主导权,它有个外键指向Student表。 
    @ManyToMany(mappedBy = "students")
    public Set<Teacher> getTeachers() {
        return teachers;
    }

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

Teacher实体类 

复制代码
    
    
package com.ljq.entity; import java.util.HashSet; import java.util.Set; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.JoinTable; import javax.persistence.ManyToMany; @SuppressWarnings("serial") @Entity public class Teacher implements java.io.Serializable { /** 教师ID * */ private Integer teacherid; /** 教师姓名 * */ private String name; private Set<Student> students= new HashSet<Student>(); public Teacher() { super(); } public Teacher(String name) { super(); this.name = name; } @Id @GeneratedValue public Integer getTeacherid() { return teacherid; } public void setTeacherid(Integer teacherid) { this.teacherid = teacherid; } @Column(nullable= false,length=32) public String getName() { return name; } public void setName(String name) { this.name = name; } // @ManyToMany注释表示Teacher是多对多关系的一端。 // @JoinTable描述了多对多关系的数据表关系。name属性指定中间表名称,joinColumns定义中间表与Teacher表的外键关系。 // 中间表Teacher_Student的Teacher_ID列是Teacher表的主键列对应的外键列,inverseJoinColumns属性定义了中间表与另外一端(Student)的外键关系。 @ManyToMany(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY) @JoinTable(name = "Teacher_Student", joinColumns = { @JoinColumn(name = "Teacher_ID", referencedColumnName = "teacherid") }, inverseJoinColumns = { @JoinColumn(name = "Student_ID", referencedColumnName = "studentid") }) public Set<Student> getStudents() { return students; } public void setStudents(Set<Student> students) { this.students = students; } /** * 添加学生 * * @param student */ public void addStudent(Student student) { if (! this.students.contains(student)) { this.students.add(student);
student.setTeacher(this); } } /** * 删除学生 * * @param student */ public void removeStudent(Student student) { if( this.students.contains(student)){
student.setTeacher(null); // this.students.remove(student); } } }
复制代码

ManyToManyTest测试类 

复制代码
package com.ljq.test;

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

import org.junit.Test;

import com.ljq.entity.Student;
import com.ljq.entity.Teacher;


public class ManyToManyTest {

    @Test
    public void save() {
        EntityManagerFactory factory = Persistence.createEntityManagerFactory("ljq");
        EntityManager em=factory.createEntityManager();
        em.getTransaction().begin();
        
        em.persist(new Teacher("张老师"));
        em.persist(new Student("小张"));
        
        em.getTransaction().commit();
        em.close();
        factory.close();
        
    }
    
    /**
     * 为老师添加一个学生
     *
     */
    @Test
    public void build() {
        EntityManagerFactory factory = Persistence.createEntityManagerFactory("ljq");
        EntityManager em=factory.createEntityManager();
        em.getTransaction().begin();
        
        Teacher teacher = em.find(Teacher.class, 2);
        teacher.addStudent(em.getReference(Student.class, 2));
        
        em.getTransaction().commit();
        em.close();
        factory.close();
    }
    
    /**
     * 解除学生跟老师的关系
     *
     */
    @Test
    public void  remove() {
        EntityManagerFactory factory = Persistence.createEntityManagerFactory("ljq");
        EntityManager em=factory.createEntityManager();
        em.getTransaction().begin();
        
        Teacher teacher = em.find(Teacher.class, 2);
        teacher.removeStudent(em.getReference(Student.class, 2));
        
        em.getTransaction().commit();
        em.close();
        factory.close();
        
    }
    
    /**
     * 删除学生,因为学生不是关系维护者,所以需要先手工解除老师与学生的关联,然后再删除学生
     *
     */
    @Test
    public void  deleteStudent() {
        EntityManagerFactory factory = Persistence.createEntityManagerFactory("ljq");
        EntityManager em=factory.createEntityManager();
        em.getTransaction().begin();
        
        Teacher teacher = em.find(Teacher.class, 2);
        Student student = em.getReference(Student.class, 2);
        teacher.removeStudent(student); //手工解除老师与学生的关系
        em.remove(student); //删除学生
        
        em.getTransaction().commit();
        em.close();
        factory.close();
    }
    
    /**
     * 删除老师,因为老师是关系维护者,所以可以直接解除老师与学生的关系,不用我们手工解除
     *
     */
    @Test
    public void deleteTeacher() {
        EntityManagerFactory factory = Persistence.createEntityManagerFactory("ljq");
        EntityManager em=factory.createEntityManager();
        em.getTransaction().begin();
        
        em.remove(em.getReference(Teacher.class, 3));
        
        em.getTransaction().commit();
        em.close();
        factory.close();

    }
    
    /**
     * 用来判断映射是否成功
     * 
     */
    @Test
    public void  test() {
        EntityManagerFactory factory = Persistence.createEntityManagerFactory("ljq");
        factory.close();
    }

}

 
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值