Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA不保留调用em.persist()的顺序吗?_Java - Fatal编程技术网

Java JPA不保留调用em.persist()的顺序吗?

Java JPA不保留调用em.persist()的顺序吗?,java,Java,我注意到了一些有趣的事情。如果我运行下面的代码,只在列表末尾调用flush,那么JPA似乎是在将对象以随机顺序插入数据库。我之所以能说出来,是因为我拥有创建标识列的数据库。并且对象序列id与标识列的顺序不对应 public void persistList(List<Object> objectList) { for (Object object : objectList) { em.persist(object); } em.flush() } 例

我注意到了一些有趣的事情。如果我运行下面的代码,只在列表末尾调用flush,那么JPA似乎是在将对象以随机顺序插入数据库。我之所以能说出来,是因为我拥有创建标识列的数据库。并且对象序列id与标识列的顺序不对应

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

例如,objectList有object1、Object2和object3。所以理论上,插入数据库的序列应该是object1,然后是object2,然后是object3。但是,有时情况并非如此。

当您调用
em.persist()
时,您告诉JPA确保在适当的时候将实体持久化。如果调用
flush()
,事务已提交,或者JPA实现可能有其他可能的原因,那么现在正是时候

规范没有给出任何关于顺序的保证,因此只要实体最终被持久化,实现就可以自由地做它想要做的事情

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

我不明白你所说的“对象序列id不符合标识列的顺序”是什么意思,但听起来你应该重构代码,这样它就不依赖于JPA插入顺序


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

当您调用
em.persist()
时,您告诉JPA确保在适当的时间保存实体。如果调用
flush()
,事务已提交,或者JPA实现可能有其他可能的原因,那么现在正是时候

规范没有给出任何关于顺序的保证,因此只要实体最终被持久化,实现就可以自由地做它想要做的事情

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

我不明白你所说的“对象序列id不符合标识列的顺序”是什么意思,但听起来你应该重构代码,这样它就不依赖于JPA插入顺序


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

那么,如何确保序列正确?除了将em.flush()放在for循环中,因为我会导致一些性能问题。我没有使用hibernateWell,那么您可以查看您正在使用的实现(实际上应该被标记,因为单个
java
标记不能说明太多)是否具有类似的属性来排序插入,或者是时候开始考虑如何重构id生成以使其高效和正确。那么我如何确保序列正确呢?除了将em.flush()放在for循环中,因为我会导致一些性能问题。我没有使用hibernateWell,那么您可以查看您正在使用的实现(实际上应该被标记,因为单个
java
标记不能说明太多)是否具有类似的属性来排序插入,或者是时候开始考虑如何重构id生成,使其高效、正确。
public void persistList(List<Object> objectList) {
for (Object object : objectList) {
    em.persist(object);
    em.flush();


  }        

}