提问
执行这些步骤时,我正在获取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();
我的模型快照如下:
TransactionEntry类
@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;
}
TransactionTable类
@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.delete(te.getTransaction());行中,在删除之前,hibernate尝试加载TransactionEntry对象的集合(由于级联,集合中的对象也需要删除).
>,但是在从集合中加载TransactionEntry对象时,hibernate也将加载成员Account对象,因为它与@ManyToOne注释映射且默认注释为EAGER.
>当到达与ID为1的帐户对应的TransactionEntry对象时,hibernate抛出上述异常,因为该帐户已存在于会话中.