java.util.List在.add(position,item)之后被Hibernate无序存储



我有一个使用Java类的JBPM案例文件应用程序,其中工作流有阶段,数据由Hibernate持久化到SQL Server数据库中:

@javax.persistence.Entity
@javax.persistence.Table(name = "WORKFLOW")
public class Workflow implements java.io.Serializable {
@javax.persistence.OneToMany(cascade = {javax.persistence.CascadeType.ALL})
@org.hibernate.annotations.LazyCollection(org.hibernate.annotations.LazyCollectionOption.FALSE)
private java.util.List<Stage> stages;
...

当我执行工作流.add(职位,阶段(时,阶段将作为职位+1条目添加到列表中(如预期(。Hibernate使用一个名为WORKFLOW_STAGES的联接表将java.util.List持久化到我们的SQL Server数据库中,该联接表的列为工作流id和阶段id。添加了元素的列表始终保持为最后一个元素,因此即使添加的元素添加在位置1,检索到的工作流也会将其放在列表的末尾。也就是说,如果我存储Integers而不是Stage 的实例

original workflow.getStages() = 10, 5, 8
workflow.getStage().add(1, 4) => 10, 4, 5, 8 in memory but
when retrieved from the DB (using Hibernate) the new element has been moved to the end => 10, 5, 8, 4

日志看起来WORKFLOW_STAGES是在应用程序持久化时重新生成的,所以我很惊讶它没有按正确的顺序持久化阶段。

2021-11-16 12:26:37,253 INFO  [stdout] (default task-164) Hibernate: delete from WORKFLOW_STAGES where Workflow_ID=?
2021-11-16 12:26:37,260 INFO  [stdout] (default task-164) Hibernate: insert into WORKFLOW_STAGES (Workflow_ID, stages_ID) values (?, ?)
2021-11-16 12:26:37,261 INFO  [stdout] (default task-164) Hibernate: insert into WORKFLOW_STAGES (Workflow_ID, stages_ID) values (?, ?)
2021-11-16 12:26:37,261 INFO  [stdout] (default task-164) Hibernate: insert into WORKFLOW_STAGES (Workflow_ID, stages_ID) values (?, ?)
2021-11-16 12:26:37,262 INFO  [stdout] (default task-164) Hibernate: insert into WORKFLOW_STAGES (Workflow_ID, stages_ID) values (?, ?)
2021-11-16 12:26:37,262 INFO  [stdout] (default task-164) Hibernate: insert into WORKFLOW_STAGES (Workflow_ID, stages_ID) values (?, ?)
2021-11-16 12:26:37,262 INFO  [stdout] (default task-164) Hibernate: insert into WORKFLOW_STAGES (Workflow_ID, stages_ID) values (?, ?)
2021-11-16 12:26:37,262 INFO  [stdout] (default task-164) Hibernate: insert into WORKFLOW_STAGES (Workflow_ID, stages_ID) values (?, ?)
2021-11-16 12:26:37,262 INFO  [stdout] (default task-164) Hibernate: insert into WORKFLOW_STAGES (Workflow_ID, stages_ID) values (?, ?)
2021-11-16 12:26:37,262 INFO  [stdout] (default task-164) Hibernate: insert into WORKFLOW_STAGES (Workflow_ID, stages_ID) values (?, ?)

我如何更改我的Hibernate标记以正确地保持List,即在添加(position,element(后按正确顺序显示元素?

我能够通过在Stage上添加一个位置字段和注释@javax.persistence.OrderBy("position"(来解决这个问题。

最新更新