JPA无法保留具有多个外键关联的记录
EntityManager.find()方法和用于选择特定数据项的自定义查询之间有什么区别 我有一个学生实体,该实体通过School_ID对学校实体具有外键约束。当保留新的学生记录时,JPA尝试将现有的学校条目插入学校表,这会导致DB完整性异常。学校条目通过以下代码添加到学生记录中:JPA无法保留具有多个外键关联的记录,jpa,entitymanager,persist,Jpa,Entitymanager,Persist,EntityManager.find()方法和用于选择特定数据项的自定义查询之间有什么区别 我有一个学生实体,该实体通过School_ID对学校实体具有外键约束。当保留新的学生记录时,JPA尝试将现有的学校条目插入学校表,这会导致DB完整性异常。学校条目通过以下代码添加到学生记录中: student.setSchool(em.createNamedQuery("getSchoolByName", School.class).setParameter("name", schoolName).get
student.setSchool(em.createNamedQuery("getSchoolByName", School.class).setParameter("name", schoolName).getSingleResult());
问题是
@NamedQueries({@NamedQuery(name="getSchoolByName", query="SELECT sc FROM School sc WHERE ts.name = :name")})
学校名称字段上有一个唯一的约束,因此给定的名称肯定会产生一个结果
但是,如果我使用find()方法通过其id(主键)检索学校记录,就不会有这样的问题
student.setSchool(em.find(School.class, schoolId));
学生表和学校表都将id作为主键
学生实体类中的外键关联如下所示
//uni-directional many-to-one association to TestSuite
@ManyToOne(targetEntity=School.class,cascade={CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH})
@JoinColumn(name="SCHOOL_ID", referencedColumnName="SCHOOL_ID", nullable=false, insertable=false, updatable=false)
private School school;
结果证明这是一个持久性上下文问题。查询实际上是由一个新的实体管理器进行的,该实体管理器与处理持久化的实体管理器具有不同的上下文。一旦统一为一个实体管理器,就不再有问题了。find()和自定义查询产生相同的结果