【问题标题】:Detached entity exception when persisting object持久化对象时分离实体异常
【发布时间】:2014-04-07 05:17:16
【问题描述】:

我对传递给持久性的分离实体有疑问。我以为我知道分离实体是什么,但显然这对我来说太多了......所以无论如何我正在尝试创建一个 Person 对象,该对象具有一个带有 Office 对象的 Interviewer 对象,并且每次我尝试坚持 Person 我得到例外(在这种情况下,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 的辅助方法已经设置了它的 office,但这用于其他测试,并且由于具有相同属性的 office 存储在测试数据库中,我使用 officeDao 获取它并将其设置为面试官办公室。我尝试了多种组合我在这里发布的内容,但到目前为止我没有得到积极的结果。我不明白为什么它抱怨 Office 被分离,因为即使我没有从 db 获取它,它也会这样做——换句话说,所有三个对象都是新的,并且它们与持久性上下文无关。我已经阅读了http://java.boot.by/scbcd5-guide/ch06.html,但仍然无法解决。我在这里做错了什么?

【问题讨论】:

    标签: java hibernate jpa entity


    【解决方案1】:

    此异常背后的基本原因是您要传递的实体与 EntityManager 对象没有关联。无论如何,如果您使用的是 entityManager.persist(entity),那么请尝试使用 entityManager.merge(entity)

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

    例如。 entityManager.flush();

    【讨论】:

      【解决方案2】:

      你在哪里打开交易?

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

      理想情况下,您的事务管理应该由您的辅助方法或服务层处理。

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

      【讨论】:

      • 谢谢,这是我自己的小错误——我有一个为 InterviewerHelper 类使用的实体的辅导员,它设置了带有“@Id”和“@”注释的 id生成值'...
      猜你喜欢
      • 2021-02-02
      • 1970-01-01
      • 2019-03-02
      • 1970-01-01
      • 2013-11-05
      • 2018-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多