当前位置: 首页 > 知识库问答 >
问题:

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

孟正志
2023-03-14

我有一个问题,分离实体传递到持久性。我以为我知道什么是超然的实体,但显然这对我来说太多了...因此,无论如何,我试图创建一个Person对象,该对象具有一个Interviewer对象,而Interviewer对象具有一个Office对象,每次尝试持久化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;
}
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;
}

您可能会注意到创建面试官的helper方法已经设置了它的office,但这是用于其他测试的,并且由于具有相同属性的office存储在测试数据库中,所以我使用officeDAO获取它并将它设置为面试官的office。我尝试了我在这里发布的内容的多个组合,但我没有得到积极的结果到目前为止。我不明白它为什么抱怨Office被分离,因为即使我不是从db获取它,它也会这样做--换句话说,所有三个对象都是新的,它们与持久性上下文没有关联。我读过http://java.boot.by/scbcd5-guide/ch06.html,但仍然无法理解。我在这里做错了什么?

共有1个答案

邓赤岩
2023-03-14

你在哪里开交易?

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

理想情况下,您的事务管理应该由您的helper方法或一个服务层来处理。

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

 类似资料:
  • 我有一个类通知,它包含一个对象MessengerData:

  • 我用的是JPA。 在数据库中,有建筑表和房间表。它们有一个OneTo多连接。 我可以将数据添加到建筑中,但当我尝试将数据添加到房间中时,会出现错误: 我的建筑模型: 我的房间模型: 我的主应用。在这里,我获取建筑对象并将其传递到房间: 请帮忙。

  • 问题内容: 结合使用JPA和Hibernate,运行以下代码时出现异常。第一次运行它时,一切正常,数据已插入数据库中。第二次,当应更新数据时,它失败: boutiqueDao.persist()只需调用EntityManager.persist()方法。 这是我的精品班: 最后,我的堆栈跟踪: 我正在Tomcat 7.0.32服务器上运行Java 7.0.11。 任何的想法? 问题答案: 用于全新

  • 问题内容: 我正在尝试使用Hibernate EntityManagerpersist方法将个人pojo插入mysql db, 得到这个例外 还有更多.. 我的Person.java类是, 然后是pojo的getter setter方法。 引发TitleType类的错误是“公共静态最终”标题类型定义提供程序, 我正在为人员设置标题类型类, 不可能将公共静态最终类型定义的类传递给Hibernate?

  • 我得到了异常org.hibernate.持久性对象异常:分离实体传递到持久性。从这个论坛和其他地方的许多帖子中,我知道这种情况发生在两种情况下(不考虑一对一注释等), 交易超出范围存在问题 在自动生成id的位置设置id 我在代码中没有看到这两种情况。我无法重现错误,因为我没有最初触发它的数据。在其他数据上,它运行得非常好。我提供了下面的SCCE: MyImportEJB。爪哇: 我的班级。JAVA

  • 问题内容: 我已经成功用hibernate写了我的第一个主要的孩子例子。几天后,我再次使用它并升级了一些库。不知道我做了什么,但是我再也无法使它运行了。有人可以帮助我找出返回以下错误消息的代码中的错误吗: hibernate映射: 编辑: InvoiceManager.java 发票.java InvoiceItem.java 编辑: 从客户端发送的JSON对象: 编辑: 一些详细信息: 我试图通