我遇到了传递给持久性的分离实体的问题。我以为我知道什么是分离的实体,但显然这对我来说太多了......所以无论如何我试图创建一个Person对象,它有一个具有Office对象的Interviewer对象,每次我试图坚持我得到的人例外(在这种情况下,Office是分离的实体)。相关代码如下所示:
@Before
public void setup() {
Person person = PersontHelper.createPerson();
person.getInterviewer().setOffice(officeDao.find(1));
personDao.create(person);
interviewers = service.getAllInterviewers();
}
createPerson()
是辅助类的静态方法:
public static Person createPerson(){
Interviewer interviewer = Interviewer.createInterviewer();
Collection<Subject> skills = new HashSet<SubjectO>();
Person person = new Person();
person.setInterviewer(interviewer);
person.setSkills(skills);
return person;
}
最后createInterviewer()
:
public static Interviewer createInterviewer(){
Office office = new Office(1, 1, "Bristol");
Interviewer interviewer = new Interviewer();
interviewer.setFirstname("John");
interviewer.setSurname("Bloggs");
interviewer.setEmail("john.example.com");
interviewer.setJobTitle(30);
interviewer.setOffice(office);
interviewer.setInterviews(new HashSet<Interview>());
return interviewer;
}
您可能会注意到创建Interviewer的辅助方法已设置其办公室,但这用于其他测试,并且由于具有相同属性的办公室存储在测试数据库中,因此我使用officeDao
来获取并设置它作为访员的办公室。我试过我在这里发布的多个组合,但到目前为止我没有得到任何积极的结果。我不明白为什么它抱怨Office被分离,因为它甚至在我没有从db获取它时 - 换句话说,所有三个对象都是新的并且它们与持久性上下文无关。我读过http://java.boot.by/scbcd5-guide/ch06.html但仍无法解决问题。我在这里做错了什么?
答案 0 :(得分:2)
此异常背后的基本原因是您希望传递给持久的实体与EntityManager对象无关。无论如何,如果您使用的是 entityManager.persist(entity),请尝试使用 entityManager.merge(entity)。
还有一件事是你应该检查你的实体是否已更新,因为你可以使用EntityManager类的flush()方法。
实施例。的 entityManager.flush(); 强>
答案 1 :(得分:1)
您在哪里开启交易?
如果您的事务管理处于DAO级别,这意味着您的Office对象已加载到OfficeDao打开的事务中,并且在personDao打开的下一个事务中被视为已分离。
理想情况下,您的交易管理应由您的帮助方法或服务层处理。
否则,要解决此问题,您必须加载Office对象或将其合并到personDao.create()方法中。