JPA是否不保留调用em.persist()的顺序?

时间:2018-05-14 06:38:02

标签: java

刚才注意到了一些有趣的事情。如果我运行以下代码,通过仅在列表末尾调用flush,JPA似乎是以随机顺序将对象插入数据库。我可以告诉的原因是因为我有数据库来创建标识列。并且对象序列id不对应于标识列的顺序。

public void persistList(List<Object> objectList) {
for (Object object : objectList) {
    em.persist(object);
}        
    em.flush()
}

但是,如果我运行以下代码就行了。我所做的就是在em.flush()之后立即添加em.persist()。有没有人遇到过这个问题?

public void persistList(List<Object> objectList) {
for (Object object : objectList) {
    em.persist(object);
    em.flush();


  }        

}

例如,objectList有object1,objec2,object3。因此从理论上讲,插入数据库的序列应该是object1,然后是object2,然后是object3。但是,有时却没有。

1 个答案:

答案 0 :(得分:3)

当您致电em.persist()时,您告诉JPA确保在时机成熟时保留该实体。如果您致电flush(),提交交易或JPA实施可能有其他可能的原因,时间是正确的。

规范没有对订单提供任何保证,因此只要实体最终持久化,实现就可以自由地执行。

这允许JPA优化与数据库的通信,并在数据进入数据库级别之前执行许多其他操作(即使这样,您也可以打开可以回滚的事务)。

我不明白你的意思是“对象序列id与标识列的顺序不对应”,但听起来你应该重构你的代码,因此它不依赖于JPA插入顺序。

如果你正在使用Hibernate,你可以尝试启用order_inserts属性,看看它是否能解决你的问题。我会认为这是一个设计问题,因为如果你想要显式值,你应该用这种方式显式编码。现在你在不同的地方生成id并抱怨得到“错误的”。