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——duoduo,teacher——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
- EclipseLink学习(四) --- 多对多映射
- EclipseLink学习(三)--- 一对多映射
- EclipseLink学习(二)--- 一对一映射
- hibernate 学习之四 (多对多映射)
- 跟我上“云”端(四)使用eclipselink构建企业级多租户应用
- 多租户--EclipseLink实现
- EclipseLink学习(五) --- 缓存
- hibernate映射(四)——多对多
- hibernate 四 多对多的映射
- (经典)Hibernate多对一关系映射(四)
- (经典)Hibernate多对一关系映射(四)
- hibernate进阶之路之一对多映射(四)
- 【SSH进阶之路】Hibernate映射——多对一单向关联映射(四)
- 【SSH进阶之路】Hibernate映射——多对一单向关联映射(四)
- 【SSH进阶之路】Hibernate映射——多对一单向关联映射(四)
- 【SSH进阶之路】Hibernate映射——多对一单向关联映射(四)
- 【SSH进阶之路】Hibernate映射——多对一单向关联映射(四)
- 【SSH进阶之路】Hibernate映射——多对一单向关联映射(四)
- Magento 2 创建或扩展配置类型
- 经典.NET面试题目
- 20170528学习笔记整理
- 一段比较坑的求职经历-from android little guy.
- 116. Populating Next Right Pointers in Each Node
- EclipseLink学习(四) --- 多对多映射
- java 同步与死锁
- 51Nod-1008 N的阶乘 mod P【模除】
- 如何取数据二 bean模式
- 【LeetCode】69. Sqrt(x)
- js数组
- 如何取数据三 servlet模式
- Python 装饰器
- IGMP各版本之间的差异,IGMP Snooping和Proxy的区别