jpa多对多映射案例
学生和老师就是多对多的关系。一个学生有多个老师,一个老师教多个学生。多对多映射采取中间表连接的映射策略,建立的中间表将分别引入两边的主键作为外键。jpa对于中间表的元数据提供了可配置的方式,用户可以自定义中间表的表名,列名。
下面就以学生和老师为例介绍多对多映射关系的实例开发
Student实体类
复制代码
packagecom.ljq.entity;
importjava.util.HashSet;
importjava.util.Set;
importjavax.persistence.Column;
importjavax.persistence.Entity;
importjavax.persistence.GeneratedValue;
importjavax.persistence.Id;
importjavax.persistence.ManyToMany;
@SuppressWarnings("serial")
@Entity
publicclassStudentimplementsjava.io.Serializable{
/学生ID/
privateIntegerstudentid;
/学生姓名/
privateStringname;
privateSetteachers=newHashSet();
publicStudent(){
super();
}
publicStudent(Stringname){
super();
this.name=name;
}
@Id
@GeneratedValue
publicIntegergetStudentid(){
returnstudentid;
}
publicvoidsetStudentid(Integerstudentid){
this.studentid=studentid;
}
@Column(nullable=false,length=32)
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
//@ManyToMany注释表示Student是多对多关系的一边,mappedBy属性定义了Student为双向关系的维护端
//Teacher表是关系的维护者,ownerside,有主导权,它有个外键指向Student表。
@ManyToMany(mappedBy="students")
publicSetgetTeachers(){
returnteachers;
}
publicvoidsetTeachers(Setteachers){
this.teachers=teachers;
}
}
复制代码
Teacher实体类
复制代码
packagecom.ljq.entity;
importjava.util.HashSet;
importjava.util.Set;
importjavax.persistence.CascadeType;
importjavax.persistence.Column;
importjavax.persistence.Entity;
importjavax.persistence.FetchType;
importjavax.persistence.GeneratedValue;
importjavax.persistence.Id;
importjavax.persistence.JoinColumn;
importjavax.persistence.JoinTable;
importjavax.persistence.ManyToMany;
@SuppressWarnings("serial")
@Entity
publicclassTeacherimplementsjava.io.Serializable{
/教师ID/
privateIntegerteacherid;
/教师姓名/
privateStringname;
privateSetstudents=newHashSet();
publicTeacher(){
super();
}
publicTeacher(Stringname){
super();
this.name=name;
}
@Id
@GeneratedValue
publicIntegergetTeacherid(){
returnteacherid;
}
publicvoidsetTeacherid(Integerteacherid){
this.teacherid=teacherid;
}
@Column(nullable=false,length=32)
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
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")})
publicSetgetStudents(){
returnstudents;
}
publicvoidsetStudents(Setstudents){
this.students=students;
}
/
添加学生
@paramstudent
/
publicvoidaddStudent(Studentstudent){
if(!this.students.contains(student)){
this.students.add(student);
student.setTeacher(this);
}
}
/
删除学生
@paramstudent
/
publicvoidremoveStudent(Studentstudent){
if(this.students.contains(student)){
student.setTeacher(null);
//this.students.remove(student);
}
}
}
复制代码
ManyToManyTest测试类
复制代码
packagecom.ljq.test;
importjavax.persistence.EntityManager;
importjavax.persistence.EntityManagerFactory;
importjavax.persistence.Persistence;
importorg.junit.Test;
importcom.ljq.entity.Student;
importcom.ljq.entity.Teacher;
publicclassManyToManyTest{
@Test
publicvoidsave(){
EntityManagerFactoryfactory=Persistence.createEntityManagerFactory("ljq");
EntityManagerem=factory.createEntityManager();
em.getTransaction().begin();
em.persist(newTeacher("张老师"));
em.persist(newStudent("小张"));
em.getTransaction().commit();
em.close();
factory.close();
}
/
为老师添加一个学生
/
@Test
publicvoidbuild(){
EntityManagerFactoryfactory=Persistence.createEntityManagerFactory("ljq");
EntityManagerem=factory.createEntityManager();
em.www.wang027.comgetTransaction().begin();
Teacherteacher=em.find(Teacher.class,2);
teacher.addStudent(em.getReference(Student.class,2));
em.getTransaction().commit();
em.close();
factory.close();
}
/
解除学生跟老师的关系
/
@Test
publicvoidremove(){
EntityManagerFactoryfactory=Persistence.createEntityManagerFactory("ljq");
EntityManagerem=factory.createEntityManager();
em.getTransaction().begin();
Teacherteacher=em.find(Teacher.class,2);
teacher.removeStudent(em.getReference(Student.class,2));
em.getTransaction().commit();
em.close();
factory.close();
}
/
删除学生,因为学生不是关系维护者,所以需要先手工解除老师与学生的关联,然后再删除学生
/
@Test
publicvoiddeleteStudent(){
EntityManagerFactoryfactory=Persistence.createEntityManagerFactory("ljq");
EntityManagerem=factory.createEntityManager();
em.getTransaction().begin();
Teacherteacher=em.find(Teacher.class,2);
Studentstudent=em.getReference(Student.class,2);
teacher.removeStudent(student);//手工解除老师与学生的关系
em.remove(student);//删除学生
em.getTransaction().commit();
em.close();
factory.close();
}
/
删除老师,因为老师是关系维护者,所以可以直接解除老师与学生的关系,不用我们手工解除
/
@Test
publicvoiddeleteTeacher(){
EntityManagerFactoryfactory=Persistence.createEntityManagerFactory("ljq");
EntityManagerem=factory.createEntityManager();
em.getTransaction().begin();
em.remove(em.getReference(Teacher.class,3));
em.getTransaction().commit();
em.close();
factory.close();
}
/
用来判断映射是否成功
/
@Test
publicvoidtest(){
EntityManagerFactoryfactory=Persistence.createEntityManagerFactory("ljq");
factory.close();
}
}
|
|