JPA 多对多双向联系关系的各项关系操作
JPA多对多双向关联的各项关系操作???? 前两个类中的代码,与上一节的内容相同,本节重点是讲解怎样对实体与
JPA 多对多双向关联的各项关系操作
???? 前两个类中的代码,与上一节的内容相同,本节重点是讲解怎样对实体与实体之间关系操作!
Student.java
package?junit.test; ????import?javax.persistence.EntityManager; ??import?javax.persistence.EntityManagerFactory; ??import?javax.persistence.Persistence; ????import?org.junit.BeforeClass; ??import?org.junit.Test; ????import?cn.itcast.bean.Student; ??import?cn.itcast.bean.Teacher; ????public?class?ManyToManyTest?{ ????????@BeforeClass??????public?static?void?setUpBeforeClass()?throws?Exception?{ ??????} ????????@Test??????public?void?save()?{ ??????????EntityManagerFactory?factory?=?Persistence ??????????????????.createEntityManagerFactory("itcast"); ??????????EntityManager?em?=?factory.createEntityManager(); ??????????em.getTransaction().begin(); ????????????em.persist(new?Student("小星同学")); ??????????em.persist(new?Teacher("李老师")); ????????????em.getTransaction().commit(); ??????????em.close(); ??????????factory.close(); ??????} ????????/* ??????*?建立学生跟老师的关系 ??????*/??????@Test??????public?void?buildTS()?{ ??????????EntityManagerFactory?factory?=?Persistence ??????????????????.createEntityManagerFactory("itcast"); ??????????EntityManager?em?=?factory.createEntityManager(); ??????????em.getTransaction().begin(); ????????????Student?student?=?em.find(Student.class,?1);????//?首先要得到学生,因为学生是关系维护端,通过关系维护端来建立关系。 ??????????student.addTeacher(em.getReference(Teacher.class,?1));??//这方法在业务意义上,就代表建立跟老师的关系。 ??????????//所谓建立跟老师的关系,无非就是把老师加进集合里面去。 ??????????//建立关系,体现在JDBC上面,就是添加一条记录进中间表。 ????????????em.getTransaction().commit(); ??????????em.close(); ??????????factory.close(); ??????} ????????/* ??????*?解除学生跟老师的关系 ??????*/??????@Test??????public?void?deleteTS()?{ ??????????EntityManagerFactory?factory?=?Persistence ??????????.createEntityManagerFactory("itcast"); ??????????EntityManager?em?=?factory.createEntityManager(); ??????????em.getTransaction().begin(); ????????????Student?student?=?em.find(Student.class,?1);????//?首先要得到学生,因为学生是关系维护端,通过关系维护端来建立关系。 ??????????student.removeTeacher(em.getReference(Teacher.class,?1));???//这方法在业务意义上,就代表解除跟老师的关系。 ??????????//所谓解除跟老师的关系,无非就是把老师从集合里面删去。 ??????????//解除关系,体现在JDBC上面,就是在中间表删除一条记录。 ????????????em.getTransaction().commit(); ??????????em.close(); ??????????factory.close(); ??????} ????????/* ??????*?删除老师,老师已经跟学生建立起了关系(错误写法) ??????*/??????@Test??????public?void?deleteTeacher1()?{ ??????????EntityManagerFactory?factory?=?Persistence ??????????.createEntityManagerFactory("itcast"); ??????????EntityManager?em?=?factory.createEntityManager(); ??????????em.getTransaction().begin(); ??????????????em.remove(em.getReference(Teacher.class,?1)); ??????????//并不需要发生数据装载行为,只需要一个托管状态的实体,所以用getReference可以提供性能。 ????????????em.getTransaction().commit(); ??????????em.close(); ??????????factory.close(); ??????} ??????/* ??????该方法会出错,因为中间表中已经有记录了,会抛出以下错误: ?????Caused?by:?java.sql.BatchUpdateException: ?????????Cannot?delete?or?update?a?parent?row:?a?foreign?key?constraint?fails ?????????(`itcast/student_teacher`,?CONSTRAINT?`FKD4E389DE1D49449D`?FOREIGN?KEY?(`teacher_id`) ?????????REFERENCES?`teacher`?(`id`)) ?????关系被维护端没有权力更新外键,所以不会删除中间表的记录。 ??????*/????????/* ??????*?删除老师,老师已经跟学生建立起了关系(正确写法) ??????*/??????@Test??????public?void?deleteTeacher2()?{ ??????????EntityManagerFactory?factory?=?Persistence ??????????.createEntityManagerFactory("itcast"); ??????????EntityManager?em?=?factory.createEntityManager(); ??????????em.getTransaction().begin(); ????????????Student?student?=?em.find(Student.class,?1); ??????????Teacher?teacher?=?em.getReference(Teacher.class,?1); ??????????//并不需要发生数据装载行为,只需要一个托管状态的实体,所以用getReference可以提供性能。 ??????????student.removeTeacher(teacher); ??????????//student是关系维护端,有权利删除外键,只要在对象中删除了teacher,那么中间表中相关外键记录也就被删除了。 ??????????//想要删除teacher记录,必须先通过student解除关系才行。 ??????????em.remove(teacher); ????????????em.getTransaction().commit(); ??????????em.close(); ??????????factory.close(); ??????} ????????/* ??????*?删除学生,老师已经跟学生建立起了关系 ??????*/??????@Test??????public?void?deleteStudent()?{ ??????????EntityManagerFactory?factory?=?Persistence ??????????.createEntityManagerFactory("itcast"); ??????????EntityManager?em?=?factory.createEntityManager(); ??????????em.getTransaction().begin(); ????????????Student?student?=?em.getReference(Student.class,?1); ??????????em.remove(student);?//这样是可以删除学生的,尽管目前是有关系,中间表有关联记录,有外键约束。但是我们现在要删除的是关系维护端,关系维护端是有权力对外键进行增删改查操作的。删除的时候,Hibernate会判断student是关系维护端,然后去中间表把关联记录先删除掉。再删掉student对象。 ????????????em.getTransaction().commit(); ??????????em.close(); ??????????factory.close(); ??????} ??}??