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

时间:2012-09-02 19:37:52

标签: 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();

我的模型快照如下:

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());语句,那么代码工作正常,否则它会引发上述异常。我有什么遗失的东西。

2 个答案:

答案 0 :(得分:3)

以下是一步一步发生的事情:

  • session.saveOrUpdate(te.getAccount());Account对象( ID为)附加到会话
  • 在行session.delete(te.getTransaction());中,在删除之前,hibernate尝试加载TransactionEntry个对象的集合(由于级联,集合中的对象也需要删除)。
  • 但是在从集合中加载TransactionEntry个对象时,hibernate也会加载成员Account对象,因为它使用@ManyToOne注释进行映射,其中 {{3} } 默认提取。
  • 当到达与{1}}对应的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

相关问题