刚才注意到了一些有趣的事情。如果我运行以下代码,通过仅在列表末尾调用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。但是,有时却没有。
答案 0 :(得分:3)
当您致电em.persist()
时,您告诉JPA确保在时机成熟时保留该实体。如果您致电flush()
,提交交易或JPA实施可能有其他可能的原因,时间是正确的。
规范没有对订单提供任何保证,因此只要实体最终持久化,实现就可以自由地执行。
这允许JPA优化与数据库的通信,并在数据进入数据库级别之前执行许多其他操作(即使这样,您也可以打开可以回滚的事务)。
我不明白你的意思是“对象序列id与标识列的顺序不对应”,但听起来你应该重构你的代码,因此它不依赖于JPA插入顺序。
如果你正在使用Hibernate,你可以尝试启用order_inserts属性,看看它是否能解决你的问题。我会认为这是一个设计问题,因为如果你想要显式值,你应该用这种方式显式编码。现在你在不同的地方生成id并抱怨得到“错误的”。