Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JPA无法保留具有多个外键关联的记录_Jpa_Entitymanager_Persist - Fatal编程技术网

JPA无法保留具有多个外键关联的记录

JPA无法保留具有多个外键关联的记录,jpa,entitymanager,persist,Jpa,Entitymanager,Persist,EntityManager.find()方法和用于选择特定数据项的自定义查询之间有什么区别 我有一个学生实体,该实体通过School_ID对学校实体具有外键约束。当保留新的学生记录时,JPA尝试将现有的学校条目插入学校表,这会导致DB完整性异常。学校条目通过以下代码添加到学生记录中: student.setSchool(em.createNamedQuery("getSchoolByName", School.class).setParameter("name", schoolName).get

EntityManager.find()方法和用于选择特定数据项的自定义查询之间有什么区别

我有一个学生实体,该实体通过School_ID对学校实体具有外键约束。当保留新的学生记录时,JPA尝试将现有的学校条目插入学校表,这会导致DB完整性异常。学校条目通过以下代码添加到学生记录中:

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()和自定义查询产生相同的结果