2016-12-17 12 views
2

次のようなマッピングがあります。indexの列には、が約NULLというDB文句があるため、DB INSERTの文中にデータが入力されていないようです。しかし、index列をnullにすると、期待どおりに機能します。なぜHibernateはリストインデックスをヌル可能にする必要がありますか?

<list name="someList"> 
    <key column="someFk"/> 
    <list-index column="index"/> 
    <one-to-many class="SomeClass"/> 
</list> 

挿入しながらindexを移入するためにHibernateを強制する方法はありますか?私は方法があるに違いないと確信していますが、私はドキュメントを調べて何も見つけることができませんでした。

答えて

1

私の本で説明したように、High-Performance Java Persistenceのように、この現象はプリズムHibernate flush operation orderで説明できます。あなたはActionQueueクラスを見てみる場合は、entity state transitions次の順序で実行されていることがわかります:

  1. OrphanRemovalAction
  2. AbstractEntityInsertAction
  3. EntityUpdateAction
  4. QueuedOperationCollectionAction
  5. CollectionRemoveAction
  6. CollectionUpdateAction
  7. CollectionRecreateAcインデックスはCollectionRecreateActionでUPDATEステートメントを使用して割り当てられている間ション
  8. EntityDeleteAction今

は、SQLのINSERT文はAbstractEntityInsertActionによって実行されます。

UPDATEステートメントを削除してINSERTのリストインデックスを設定する方がはるかに効率的であると私は同意しますが、この変更はかなりの量のリファクタリング作業を必要とすると思います。このためにJIRAの問題を開いて、それを改善とマークすることができます。

+0

ありがとうございました。 DB NULLを避けることがいかに重要であるかを考慮して、彼らがその道を取ったことは非常に驚くべきことです。もし私が後でそれを理解するまで私は決して知らないだろう、私はインデックスをマップすることを忘れてしまった。 – plalx

関連する問題