为什么 Hibernate 要求列表索引可以为空?
Why does Hibernate require the list-index to be nullable?
我有一个类似于下面的映射,似乎在 DB INSERT
语句期间未填充 index
列,因为 DB 抱怨 index
是 NULL
.但是,如果我使 index
列可为空,它会按预期工作。
<list name="someList">
<key column="someFk"/>
<list-index column="index"/>
<one-to-many class="SomeClass"/>
</list>
有没有办法强制 Hibernate 在插入时填充 index
?我确定一定有办法,但我查看了文档但找不到任何东西。
这个行为可以通过 Hibernate flush
操作顺序的棱镜来解释。如果您查看 ActionQueue
class,您将看到实体状态转换按以下顺序执行:
- 孤儿移除行动
- AbstractEntityInsertAction
- 实体更新操作
- QueuedOperationCollectionAction
- CollectionRemoveAction
- 集合更新操作
- CollectionRecreateAction
- 实体删除操作
现在,SQL INSERT 语句由 AbstractEntityInsertAction
执行,而索引由 CollectionRecreateAction
.
通过 UPDATE 语句分配。
虽然我同意删除 UPDATE 语句并在 INSERT 上填充列表索引会更有效,但我认为此更改将需要大量的重构工作。您可以为此打开一个 JIRA 问题,并将其标记为改进。
我有一个类似于下面的映射,似乎在 DB INSERT
语句期间未填充 index
列,因为 DB 抱怨 index
是 NULL
.但是,如果我使 index
列可为空,它会按预期工作。
<list name="someList">
<key column="someFk"/>
<list-index column="index"/>
<one-to-many class="SomeClass"/>
</list>
有没有办法强制 Hibernate 在插入时填充 index
?我确定一定有办法,但我查看了文档但找不到任何东西。
这个行为可以通过 Hibernate flush
操作顺序的棱镜来解释。如果您查看 ActionQueue
class,您将看到实体状态转换按以下顺序执行:
- 孤儿移除行动
- AbstractEntityInsertAction
- 实体更新操作
- QueuedOperationCollectionAction
- CollectionRemoveAction
- 集合更新操作
- CollectionRecreateAction
- 实体删除操作
现在,SQL INSERT 语句由 AbstractEntityInsertAction
执行,而索引由 CollectionRecreateAction
.
虽然我同意删除 UPDATE 语句并在 INSERT 上填充列表索引会更有效,但我认为此更改将需要大量的重构工作。您可以为此打开一个 JIRA 问题,并将其标记为改进。