执行这些步骤时,我收到了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());
语句,那么代码工作正常,否则它会引发上述异常。我有什么遗失的东西。
答案 0 :(得分:3)
以下是一步一步发生的事情:
session.saveOrUpdate(te.getAccount());
将Account
对象( ID为)附加到会话session.delete(te.getTransaction());
中,在删除之前,hibernate尝试加载TransactionEntry
个对象的集合(由于级联,集合中的对象也需要删除)。TransactionEntry
个对象时,hibernate也会加载成员Account
对象,因为它使用@ManyToOne注释进行映射,其中 {{3} } 默认提取。TransactionEntry
对象时,id为1的hibernate会抛出上述异常,因为会话中已存在Account
。答案 1 :(得分:1)
session.delete(te)
- 由于TransactionEntry
,它会删除TransactionTable
以及cascade = CascadeType.ALL
所以session.delete(te.getTransaction()) with this line you wont have any thing
就是为什么它会说NonUniqueObjectException