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

PersistentObjectException:由JPA和Hibernate抛出的传递到persist的分离实体

傅增
2023-03-14

我有一个JPA持久化的对象模型,它包含多对一的关系:一个帐户有许多事务。一个事务有一个帐户

下面是代码片段:

@Entity
public class Transaction {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @ManyToOne(cascade = {CascadeType.ALL},fetch= FetchType.EAGER)
    private Account fromAccount;
....

@Entity
public class Account {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    @OneToMany(cascade = {CascadeType.ALL},fetch= FetchType.EAGER, mappedBy = "fromAccount")
    private Set<Transaction> transactions;

我能够创建account对象,向其添加事务,并正确地持久化account对象。但是,当我创建一个事务,使用一个现有的已经持久化的帐户,并持久化该事务时,我会得到一个异常:

原因:org.hibernate.PersistentObjectException:已分离的实体传递给Persist:com.PaulSanwald.Account(位于org.hibernate.event.internal.DefaultPersistEventListener.OnPersist)(DefaultPersistEventListener.java:141)

因此,我能够持久化包含事务的account,但不能持久化具有account的事务。我以为这是因为帐户可能没有附加,但这段代码仍然给了我同样的例外情况:

if (account.getId()!=null) {
    account = entityManager.merge(account);
}
Transaction transaction = new Transaction(account,"other stuff");
 // the below fails with a "detached entity" message. why?
entityManager.persist(transaction);

如何正确保存与已持久化的帐户对象关联的事务

共有2个答案

东门楚
2023-03-14

解决方案很简单,只需使用CascadeType.Merge而不是CascadeType.PersistCascadeType.All

我也遇到过同样的问题,cascadetype.merge对我有效。

我希望你没事。

曹光霁
2023-03-14

这是一个典型的双向一致性问题。在这个环节以及这个环节都讨论得很好。

根据前面2个链接中的文章,您需要在双向关系的两侧固定您的设置器。在此链接中有一个单面的示例设置器。

许多方面的示例设置器在此链接中。

更正setter后,您希望将实体访问类型声明为“property”。声明“property”访问类型的最佳实践是将所有注释从成员属性移动到相应的getter。需要注意的是,不要在实体类中混合“字段”和“属性”访问类型,否则JSR-317规范未定义该行为。

 类似资料:
  • 我使用的是Spring Boot 4、Hibernate和JPA注释。我遇到了这个错误 组织。冬眠PersistentObjectException:传递给persist的分离实体。 我试着在互联网上搜索,但没有找到正确的答案。我尝试使用而不是,但没有成功。此外,我认为在更新资源时使用。 这是我的代码: ` `积垢服务 ` ` 存储库 ` '抽象存储库 ` ` 工厂` '支持形式 ` ` 控制器

  • JPA和Hibernate的新手,所以请耐心等待,因为我试图绘制一整张图片。所以我有两个具有双向关系的Java对象。员工类是拥有类,部门类是关系的反面。一个部门可以有许多员工,一个员工只能有一个部门。我分配了employee_id作为员工实体的主键,department_id作为部门实体的主键。我还想在员工类中使用department_id作为外键。 员工类 部门类 我用来生成两个对象并将它们保存

  • 问题内容: 我有一个JPA持久对象模型,其中包含多对一关系:一个具有许多。A 有一个。 这是一段代码: 我能够创建一个对象,向其中添加事务,并正确地持久保存该对象。但是,当我 使用现有的已经持久化的Account 创建一个事务并持久化 该Transaction时 ,出现一个异常: 引起原因:org.hibernate.PersistentObjectException:传递给持久对象的分离实体:c

  • 我在尝试使用Spring Data JPA和Hibernate作为JPA提供程序执行批插入操作时遇到了问题。 我有以下方法在我的服务。这就是抛出异常的地方。 Institute是一个实例变量,并提前获取。 我还将实体设置为级联、持久和合并。 为什么这段代码起作用 而此代码不

  • 我是Hibernate的新手,我需要帮助。 我有一个名为Kasa的表,它有3个属性-id、address和account\u id。在我的表中有12行。我想使用Hibernate对此进行映射,并使用Java添加新的映射,所以我这样做了: 我也有能手和二传手,但不需要复制。 现在我想在我的数据库中添加新行,如下所示: 我得到这样的错误:javax.persistence.PeristenceExce

  • 我编写了第一个java应用程序来读取rss流,并使用,,。我的模特<代码>RssFeed: : 和: 我使用处理数据。如果不使用多对多功能保存RssFeed,则可以: 但当我加上一句话: 获取异常:。 我的RssFeedServiceImpl: } 和RssCategoryServiceImpl: 拯救多少对多少?