3

これらの手順を実行しているときに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());、コードは正常に機能するか、上記の例外がスローされます。足りないものはありますか?

4

2 に答える 2

3

段階的に何が起こっているかを次に示します。

  • オブジェクト ( ID 1の) をセッションにsession.saveOrUpdate(te.getAccount());アタッチする行Account
  • の行session.delete(te.getTransaction());で、削除する前に、hibernate はTransactionEntryオブジェクトのコレクションをロードしようとします (カスケードのため、コレクション内のオブジェクトも削除する必要があります)。
  • ただしTransactionEntry、コレクションからオブジェクトをロードしている間、hibernate はメンバーAccountオブジェクトもロードします。これは、 EAGERデフォルト フェッチを持つ@ManyToOneアノテーションでマップされているためです。
  • TransactionEntryID 1に対応するオブジェクトに到達すると、セッションに既に存在するAccountため、hibernate は上記の例外をスローします。Account
于 2012-09-02T21:27:47.573 に答える
1

session.delete(te)-- それは理由TransactionEntryとしても 削除されます。TransactionTablecascade = CascadeType.ALLsession.delete(te.getTransaction()) with this line you wont have any thingNonUniqueObjectException

于 2012-09-02T19:50:03.297 に答える