2016-12-17 3 views
2

У меня есть сопоставление, похожее на следующее, и кажется, что столбец index не заполняется во время операции DB INSERT, потому что DB жалуется на index, являющийся NULL. Однако, если я делаю столбец 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 в то время как индекс назначается через оператора UPDATE в CollectionRecreateAction.

Хотя я согласен с тем, что было бы гораздо эффективнее удалить инструкцию UPDATE и заполнить индекс списка INSERT, я думаю, что для этого изменения потребуется значительная работа по рефакторингу. Вы можете открыть для него проблему JIRA и отметить ее как улучшение.

+0

Спасибо за подробное объяснение. Очень удивительно, что они взяли эту дорогу, учитывая, насколько важно избегать DB NULL. Если бы я забыл отобразить индекс, который я никогда не узнаю, пока не пойму это позже. – plalx

Смежные вопросы