配色: 字号:
jpa多对多映射案例
2016-09-01 | 阅:  转:  |  分享 
  
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();

}



}

献花(0)
+1
(本文系thedust79首藏)