我在执行这些步骤时遇到 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/