3

システムには次の 2 つのエンティティがあります。

  • @IdClassInvoice: [InvoiceID, OrgID] は、Bean として表され、アノテーションを使用して Invoice に関連付けられた主キーです。

  • WorkflowStates:は、アノテーションWorkflowStateIdを使用して定義された主キー列です。@Id

両方のエンティティで、ID フィールド (InvoiceID、WorkflowStateId) は DB シーケンスを使用して自動生成されます。

新しく作成された Invoice のインスタンスで persist を呼び出すときに、InvoiceID を に設定する-1と、インスタンスが保持され、ID が適切に生成されます。

ただし、WorkflowStateID が に設定された WorkflowStates の新しく作成されたインスタンスで永続化を呼び出すと-1persist()例外がスローされます。

 org.hibernate.PersistentObjectException: detached entity passed to persist: <Entity Class>

persist()メソッドが PK として単一の列を持つエンティティと複合 PK を持つエンティティで機能する方法に違いがある場合、検索で多くを見つけることができませんでした。誰かこれについてもっと知っていますか?

4

2 に答える 2

1

id を永続的に割り当て、同時にマッピングで id が自動生成されるように指定したため、この例外が発生したと思います。

persist() を実行すると、休止状態は、このオブジェクトが既に DB に存在するという仮定を行います (オブジェクトが既に ID を持っているという事実に基づいて)...しかし、そうではありません。そのため、例外が発生します。

したがって、setId(-1) をすべて削除することをお勧めします。(オブジェクトを永続化する前に id を null のままにします)

編集

エンティティが単一 Id 列または複合 Id を持つ場合は常に、エンティティが永続的かどうかを hibernate が検出する方法にいくつかの違いがあります。(私はコードを見ているので知っていますが、ドキュメントには何も見つかりませんでした)。

ブレークポイントを設定して、何が起こっているかを確認することをお勧めしますDefaultPersistEventListener.onPersist。または、休止状態のデバッグ ログを有効にして分析します。

于 2012-12-21T12:36:31.317 に答える
0

@IdClass実際、請求書には「id列」がないため、違いが生じると思います。複合キーがあるため、InvoiceId は生成されません。InvoiceId として指定した値は、永続操作中に使用されます (この場合は -1)。したがって、Invoice の「Id」は、指定した 2 つの値 (invoiceId と orgId) の組み合わせになり、hibernate は生成された値でそれらをオーバーライドせず、指定された値を使用するだけです。

私はコードを知らないので、これ以上何かを言うのは難しいです. コード例を提供できれば、大いに役立ちます。

于 2012-12-21T13:46:18.683 に答える