持久化对象时的分离实体异常

时间:2014-03-05 08:55:55

标签: java hibernate jpa entity

我遇到了传递给持久性的分离实体的问题。我以为我知道什么是分离的实体,但显然这对我来说太多了......所以无论如何我试图创建一个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但仍无法解决问题。我在这里做错了什么?

2 个答案:

答案 0 :(得分:2)

此异常背后的基本原因是您希望传递给持久的实体与EntityManager对象无关。无论如何,如果您使用的是 entityManager.persist(entity),请尝试使用 entityManager.merge(entity)

还有一件事是你应该检查你的实体是否已更新,因为你可以使用EntityManager类的flush()方法。

实施例。的 entityManager.flush();

答案 1 :(得分:1)

您在哪里开启交易?

如果您的事务管理处于DAO级别,这意味着您的Office对象已加载到OfficeDao打开的事务中,并且在personDao打开的下一个事务中被视为已分离。

理想情况下,您的交易管理应由您的帮助方法或服务层处理。

否则,要解决此问题,您必须加载Office对象或将其合并到personDao.create()方法中。