EclipseLink学习(四) --- 多对多映射

来源:互联网 发布:dom的编程艺术 编辑:程序博客网 时间:2024/06/07 06:12

JPA规范:

    多对多关系,ManyToMany。一般会由一个关联表来维护。如果不设置关联表的表名,那么默认的表名是:主表名+下划线+从表名。这个关联表只有两个外键字段,分别指向主表ID和从表ID。(eclipseLink完全按照这个命名)

 

    比如教师和学生就是对应的多对多关系。

    如果教师和学生已经绑定了多对多的关系,并且由学生端绑定,那么就只能由学生端解绑,并且教师端要删除,就必须得让学生端解绑之后才可以删除。

 

 

学生实体如下:

package model;

 

import java.util.ArrayList;

import java.util.Collection;

 

import javax.persistence.Column;

import javax.persistence.Entity;

import javax.persistence.GeneratedValue;

import javax.persistence.GenerationType;

import javax.persistence.Id;

import javax.persistence.JoinTable;

import javax.persistence.ManyToMany;

import javax.persistence.JoinColumn; 

import javax.persistence.Table;

 

@Entity

@Table(name="StudentT")//给数据表命名成自己想要的名字,如果不命名,默认全是大写

public class StudentT {

@Id @GeneratedValue(strategy=GenerationType.IDENTITY) //定义主键为自增长

  @Column(name="id")//给字段命名成自己想要的名字,如果不命名,默认全是大写

  private int id; 

  @Column(name="name")

  private String name; 

@Column(name="sex")

private String sex;

 

 

  @ManyToMany  

  @JoinTable(name="Student_Tea",  

      joinColumns=@JoinColumn(name="Stut_ID"), 

      inverseJoinColumns=@JoinColumn(name="TEACHER_ID"))   

  //@JoinTable描述了多对多关系的数据表关系,name属性指定中间表名称。

  //其中的joinColumns定义中间表与Teacher表的外键关系,并定义了外键名称;

  //inverseJoinColumns属性定义了中间表与另外一端(StudentT)的外键关系,并定义了外键名称

  private Collection<Teacher> teachers; 

  public StudentT() { 

  teachers = new ArrayList<Teacher>(); 

  } 

  //为了实现对象的双向关联,需要将自己加入到Teacher对象的列表中

  public void addTeacher(Teacher teacher) { 

     //判断是否存在,再将教师加入教师表中

    if (!getTeachers().contains(teacher)) { 

            getTeachers().add(teacher); 

    } 

    //判断是否存在,将学生加入到与教师对应的学生表中

    if (!teacher.getStudentts().contains(this)) { 

            teacher.getStudentts().add(this); 

    } 

  }

 

public int getId() {

return id;

}

 

public void setId(int id) {

this.id = id;

}

 

public String getName() {

return name;

}

 

public void setName(String name) {

this.name = name;

}

 

public Collection<Teacher> getTeachers() {

return teachers;

}

 

public void setTeachers(Collection<Teacher> teachers) {

this.teachers = teachers;

}

 

public String getSex() {

return sex;

}

public void setSex(String sex) {

this.sex = sex;

}

}

 

教师实体

package model;

 

import java.util.ArrayList;

import java.util.Collection;

 

import javax.persistence.Column;

import javax.persistence.Entity;

import javax.persistence.GeneratedValue;

import javax.persistence.GenerationType;

import javax.persistence.Id;

import javax.persistence.ManyToMany;

import javax.persistence.Table;

 

@Entity

@Table(name="Teacher")//给数据表命名成自己想要的名字

public class Teacher {

@Id @GeneratedValue(strategy=GenerationType.IDENTITY)

@Column(name="id")

private int id; 

@Column(name="name")

    private String name; 

 

    @ManyToMany(mappedBy="teachers") 

    //mappedBy属性是指定studentts集合是映射到StudentT类里面的teachers列表的

    private Collection<StudentT> studentts;

   

    public Teacher(){ 

            studentts = new ArrayList<StudentT>(); 

    } 

    //为了实现对象的双向关联,需要将自己加入到StudentT对象的列表中

   public void addStudent(StudentT studentt) { 

           //判断该学生是否在教师对应的学生列表中,如果不存在就加入

    if (!getStudentts().contains(studentt)) { 

            getStudentts().add(studentt); 

    } 

//判断该教师是否在对应学生实体的教师列表中,如不存在,就加入

    if (!studentt.getTeachers().contains(this)) { 

            studentt.getTeachers().add(this); 

    } 

   }

 

public int getId() {

return id;

}

 

public void setId(int id) {

this.id = id;

}

 

public String getName() {

return name;

}

 

public void setName(String name) {

this.name = name;

}

 

public Collection<StudentT> getStudentts() {

return studentts;

}

 

public void setStudentts(Collection<StudentT> studentts) {

this.studentts = studentts;

     

     

     

}

 

不要忘了修改xml

<?xml version="1.0" encoding="UTF-8"?>

<persistence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 

    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence  

    http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" 

    version="2.0" xmlns="http://java.sun.com/xml/ns/persistence"> 

    <persistence-unit name="EmployeeService" transaction-type="RESOURCE_LOCAL"> 

        <!-- <class>model.PersonInformation</class>  -->

       <!--  <class>model.Person</class> -->

       <!-- <class>model.Employee2</class>

       <class>model.FamilyAddress2</class> -->

       <!-- <class>model.Student2</class>

       <class>model.Department2</class> -->

       <class>model.StudentT</class>

       <class>model.Teacher</class>

        <properties> 

            <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" /> 

            <property name="javax.persistence.jdbc.url" 

                value="jdbc:mysql://192.168.1.199:3306/simpleDb" /> 

            <property name="javax.persistence.jdbc.user" value="root" /> 

            <property name="javax.persistence.jdbc.password" value="root" /> 

 

            <!-- EclipseLink should create the database schema automatically --> 

            <property name="eclipselink.ddl-generation" value="create-tables" /> 

            <property name="eclipselink.ddl-generation.output-mode" 

                value="database" /> 

        </properties> 

    </persistence-unit> 

</persistence> 

 

测试类

package main;

 

import javax.persistence.EntityManager;

import javax.persistence.EntityManagerFactory;

import javax.persistence.Persistence;

 

import model.StudentT;

import model.Teacher;

 

public class Stu_TeaTest {

 

private static final String PERSISTENCE_UNIT_NAME = "EmployeeService"; 

    private static EntityManagerFactory factory; 

     

    public static void main(String[] args) { 

        factory = Persistence.createEntityManagerFactory( 

                PERSISTENCE_UNIT_NAME); 

        EntityManager em = factory.createEntityManager();

        //保证事务

        em.getTransaction().begin(); 

 

       //学生duoduo

        StudentT studentT =new StudentT();

        studentT.setName("duoduo");

        studentT.setSex("");

        em.persist(studentT);      

       

       //教师teacher——duoduo

      //给这个老师添加一个要教的学生duoduo

        Teacher teacher=new Teacher();

        teacher.setName("teacher——duoduo");

        teacher.addStudent(studentT);

        em.persist(teacher);

 

       //教师teacher——duoduo2

        Teacher teacher2 =new Teacher();

        teacher2.setName("teacher——duoduo2");

        em.persist(teacher2);

 

       //学生duoduo2

       //这个学生有两个老师教课,教师teacher——duoduoteacher——duoduo2

        StudentT studentT2 =new StudentT();

        studentT2.setName("duoduo2");

        studentT2.setSex("");

        studentT2.addTeacher(teacher);

        studentT2.addTeacher(teacher2);

        em.persist(studentT2);

 

       //教师teacher——duoduo3

        Teacher teacher3 =new Teacher();

        teacher3.setName("teacher——duoduo3");

        em.persist(teacher3);

       

       //学生duoduo3

        StudentT studentT3 =new StudentT();

        studentT3.setName("duoduo3");

        studentT3.setSex("");

        em.persist(studentT3);

       

        em.flush();

       

       

        em.getTransaction().commit(); 

        em.close(); 

    } 

}

 

运行结果如下:

教师:3个



学生:3个,大家注意name和id的对应

 

关系表:

 

 

可以看到:

  •        学生(duoduo2)有两个老师分别为:教师(teacher——duoduo)和教师(teacher——duoduo2
  •        学生(duoduo)只有1个老师教,就是教师(teacher——duoduo
  •        剩下的学生duoduo3没有人教,教师teacher——duoduo3没有可教的学生

 

       到这里,我们讲的是student实体作为绑定和解绑关系的那一方,如果你想用teacher实体作为绑定和解绑关系的那一方,就把student实体中设置的@JoinTable放置到teacheter实体中。

 

小总:

        多对多的关系,会产生一个关联表,维护起来很麻烦。而且它不是一个面向对象的很好的设计,所以我们很少用多对多关系。

    越来越感觉,我不是在学习eclipseLink,而是在学习JPA规范,o(╯□╰)o


 

阅读全文
0 0
原创粉丝点击