java - 在我的事务中获取 org.hibernate.NonUniqueObjectException

标签 java hibernate

我在执行这些步骤时遇到 org.hibernate.NonUniqueObjectException。

session.beginTransaction();
TransactionEntry te = (TransactionEntry)session.get(TransactionEntry.class, primaryKey);
session.getTransaction().commit();
.
.
.
session.beginTransaction();
session.saveOrUpdate(te.getAccount());
session.delete(te);
session.delete(te.getTransaction());
session.getTransaction().commit();

我的模型截图如下:

交易入口类

@Entity
public class TransactionEntry {
    @Id
    @GeneratedValue
    private long txnEntryId;

    @ManyToOne
    @JoinColumn(name = "account")
    private Account account;

    @ManyToOne
    @JoinColumn(name = "txnId")
    private TransactionTable transaction;
}

账户类别

@Entity
public class Account {
    @Id
    @GeneratedValue
    private long accountId;
}

事务表类

@Entity
public class TransactionTable {
    @Id
    @GeneratedValue
    private long txnId;

    @OneToMany(targetEntity = TransactionEntry.class, fetch = FetchType.LAZY,
            mappedBy = "transaction", cascade = CascadeType.ALL)
    private List<TransactionEntry> transactionEntries;
}

我收到以下异常:

org.hibernate.NonUniqueObjectException: a different object with the same
identifier value was already associated with the
session: [com.pratikabu.pem.model.Account#1]

如果我删除 session.delete(te.getTransaction()); 语句,那么代码可以正常工作,否则它会抛出上述异常。有什么我想念的吗。

最佳答案

这是一步一步发生的事情:

  • 专线session.saveOrUpdate(te.getAccount());附上 Account对象(ID 为 1)到 session
  • session.delete(te.getTransaction()); 行中,在删除之前,hibernate 尝试加载 TransactionEntry 的集合对象(因为级联,集合中的对象也需要删除)。
  • 但在加载 TransactionEntry 时集合中的对象,hibernate 将加载成员 Account对象也是因为它被映射为 @ManyToOne具有 EAGER 的注释 默认提取。
  • 到达TransactionEntry时对应于 Account 的对象id 为 1 的 hibernate 会抛出上述异常,因为 Account已存在于 session 中。

关于java - 在我的事务中获取 org.hibernate.NonUniqueObjectException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12239125/

相关文章:

具有动态宽度和精度的 Java 格式字符串

java - 使用测试实体管理器是合法的测试实践吗?

java - Hibernate DAO 将对象值设置为对象

java - 如何从java启动H2

java - JSF 富 :dataList rendered per row?

java - 添加新组件后刷新 JFrame

java - 使用 JSCH 从 Java 使用 "more"命令时删除特殊字符?

java - 如何使用 GSON 和 Retrofit2 反序列化多形状 JSON 响应?

java - 如何在 session 关闭后使用 hibernate 访问延迟加载的字段?

java - Spring 5 + hibernate 5 : How SessionFactory is getting Autowired with LocalSessionFactoryBean