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

提问

执行这些步骤时,我正在获取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抛出上述异常,因为该帐户已存在于会话中.