这几天在学习了一下传智播客的jpa视频,觉得里面老师讲的一个知识点很重要,需要理解透彻:
关系维护端负责外键记录的更新,关系被维护端是没有权利更新外键记录的.
一个例子就是在manytomany关系映射中 student - teacher 把sutdent一端作为关系维护端,teacher作为关系被维护端,(mappedby 了student).他们之间的关系存储在了中间表中.
数据库中有老师和学生,并且关系已经维护上了,现在假如说要删除一个老师:
em.remove(em.getReference(Teacher.class, 1))
这样写是错误的 因为:需要先删除关系 再删除老师 老师有外键约束 并且老师不是关系维护端 ,所以删除老师不能同时删除关系(关系被维护端没有权利更新字段(crud)).正确的方法应该是这样的:
Student s = em.find(Student.class, 1);
Teacher t = em.getReference(Teacher.class, 1);
s.deleteTeacher(t); //先删除关系
em.remove(t);
另外 当要删除一个学生的时候可以直接:
em.remove(em.getReference(Student.class, 1))
因为学生是关系维护端 可以对字段进行维护,在删除学生的同时,能够把关系删除.
关系维护端负责外键记录的更新,关系被维护端是没有权利更新外键记录的.