当前位置: 首页 > 面试题库 >

PersistentObjectException:由JPA和Hibernate传递以持久保留的分离实体

田向荣
2023-03-14
问题内容

我有一个JPA持久对象模型,其中包含多对一关系:一个Account具有许多Transactions。A
Transaction有一个Account

这是一段代码:

@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正确地持久保存该对象。但是,当我 使用现有的已经持久化的Account
创建一个事务并持久化 该Transaction时 ,出现一个异常:

引起原因:org.hibernate.PersistentObjectException:传递给持久对象的分离实体:com.paulsanwald.Account,位于org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:141)

因此,我能够保留Account包含交易的,但不能保留包含的交易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);

如何正确保存Transaction与已经存在的Account对象关联的?


问题答案:

这是一个典型的双向一致性问题。在此链接以及此链接中都进行了很好的讨论。

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

此链接中提供了很多方面的示例设置器。

在更正了设置者之后,您想要将实体访问类型声明为“属性”。声明“属性”访问类型的最佳实践是将所有注释从成员属性移至相应的getter。一个大的警告是不要在实体类中混合使用“字段”和“属性”访问类型,否则JSR-317规范未定义其行为。



 类似资料:
  • 我有一个JPA持久化的对象模型,它包含多对一的关系:一个有许多。一个有一个。 下面是代码片段: 我能够创建对象,向其添加事务,并正确地持久化对象。但是,当我创建一个事务,使用一个现有的已经持久化的帐户,并持久化该事务时,我会得到一个异常: 原因:org.hibernate.PersistentObjectException:已分离的实体传递给Persist:com.PaulSanwald.Acco

  • 我正试图实现与hibernate的许多单向关系。问题是,当我试图向数据库中添加一些值时,我遇到了以下错误: 运行时发生异常。null:InvocationTargetException:未能执行ApplicationRunner:传递给persist:dnd35cg的分离实体。模型DND类;嵌套的异常是org。冬眠PersistentObjectException:传递给persist:dnd35

  • 这个网站上没有一个类似的问题能够解决我的问题。 错误:org.hibernate.persistentobjectexception:传递给persist:healthcheckapi.model.checks的分离实体 示例JSON健康对象: 请注意,这两个对象的ID都是自动生成的,我认为这是问题的一部分。

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

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

  • 我正在使用springboot jpa存储库保存方法 这是完整的错误:2020-06-09 15:49:02.371[nio-8080-exec-4]。M.M.A.ExceptionHandlerExceptionResolver:由处理程序执行导致的解析异常:org.springframework.dao.invalidDataAccessapiusageException:传递给persist