2016-12-17 43 views
2

我有一個映射類似於以下內容,並且似乎index列未在DB INSERT聲明期間填充,因爲DB抱怨indexNULL。但是,如果我使index列可以爲空,則按預期工作。爲什麼Hibernate要求列表索引爲空?

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

有沒有辦法在插入時強制Hibernate填充index?我確信必須有辦法,但我已經查看了文檔並找不到任何內容。

回答

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重刑
  8. EntityDeleteAction

現在,SQL INSERT語句由AbstractEntityInsertAction而該指數是由CollectionRecreateAction通過UPDATE語句指定執行。

儘管我同意刪除UPDATE語句並在INSERT上填充列表索引會高效得多,但我認爲這種更改需要大量的重構工作。您可以爲此打開一個JIRA問題,並將其標記爲改進。

+0

感謝您的深入解釋。考慮到避免數據庫空值的重要性,他們採取這種方式是非常令人驚訝的。如果我忘了映射這個索引,那我以後再也不會知道了。 – plalx

相關問題