为什么 Hibernate 要求列表索引可以为空?

Why does Hibernate require the list-index to be nullable?

我有一个类似于下面的映射,似乎在 DB INSERT 语句期间未填充 index 列,因为 DB 抱怨 indexNULL.但是,如果我使 index 列可为空,它会按预期工作。

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

有没有办法强制 Hibernate 在插入时填充 index?我确定一定有办法,但我查看了文档但找不到任何东西。

这个行为可以通过 Hibernate flush 操作顺序的棱镜来解释。如果您查看 ActionQueue class,您将看到实体状态转换按以下顺序执行:

  1. 孤儿移除行动
  2. AbstractEntityInsertAction
  3. 实体更新操作
  4. QueuedOperationCollectionAction
  5. CollectionRemoveAction
  6. 集合更新操作
  7. CollectionRecreateAction
  8. 实体删除操作

现在,SQL INSERT 语句由 AbstractEntityInsertAction 执行,而索引由 CollectionRecreateAction.

通过 UPDATE 语句分配。

虽然我同意删除 UPDATE 语句并在 INSERT 上填充列表索引会更有效,但我认为此更改将需要大量的重构工作。您可以为此打开一个 JIRA 问题,并将其标记为改进。