Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.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 Entitymanager.flush()与Entitymanager.getTransaction().commit-我更喜欢什么?_Java_Jpa_Eclipselink - Fatal编程技术网

Java Entitymanager.flush()与Entitymanager.getTransaction().commit-我更喜欢什么?

Java Entitymanager.flush()与Entitymanager.getTransaction().commit-我更喜欢什么?,java,jpa,eclipselink,Java,Jpa,Eclipselink,更新数据库时,我应该选择什么?这两种方法的优点和缺点是什么?我什么时候应该使用这两种方法 public void disemployEmployee(Integer employeeId, Date endDate) { Employee employee = (Employee)em.find("Employee", employeeId); employee.getPeriod().setEndDate(endDate); em.flush(); } public

更新数据库时,我应该选择什么?这两种方法的优点和缺点是什么?我什么时候应该使用这两种方法

public void disemployEmployee(Integer employeeId, Date endDate) {
    Employee employee = (Employee)em.find("Employee", employeeId);
    employee.getPeriod().setEndDate(endDate);
    em.flush();
}

public void disemployEmployee(Integer employeeId, Date endDate) {
    Employee employee = (Employee)em.find("Employee", employeeId);
    em.getTransaction().begin();
    employee.getPeriod().setEndDate(endDate);
    em.getTransaction().commit();
}

您阅读了javadoc中的flush和commit,知道flush只在事务中使用?它刷新(但不提交),而提交提交数据(显然)。它们是不同的;没有“偏好”。第一个示例是错误的,在调用flush(TransactionRequiredException)时会导致异常。

您的两个代码示例都不会持久化或合并要写入DB的实体状态

我认为比较
EntityManager.flush()
EnityManager.EntityTransaction.commit()
是不合适的

flush()必须包含在事务上下文中,除非EntityTransaction.commit()为您执行此操作,否则您不必显式执行此操作(在极少数情况下)

请参阅此链接


有关使用flush()的场景,请参阅此链接。

在第一个示例中,遇到flush后,对数据的更改会反映在数据库中,但它仍在事务中

但在第二个示例中,您正在立即提交事务。因此,对数据库进行了更改&事务也在那里结束


有时候,flush可能有助于在正在进行的事务之间持久化数据,然后最终提交更改。因此,如果以后出现问题,您也可以回滚以前的更改,例如批插入/更新。

我会尽可能使用容器管理事务。由于可能出现异常,Bean管理的事务通常需要大量代码。而且,它更容易出错(回滚、资源管理)


也就是说,我将在容器管理模式下的提交之后使用刷新。这样,我就可以捕获存储模块中可能出现的PersistenceException,并将其转换为对用例模块更有意义的异常。这是因为我不想在这里处理特定于存储的异常,因为我可能会将存储模块换成不使用JPA的东西。。。这在我身上从未发生过:)

我认为缺少的部分是,flush()只需添加到数据源中即可提交,提供实际的ID,但默认情况下不会持久化

因此,如果需要flush()作为commit()工作,则需要通过以下方式在EntityManager中将flush模式设置为commit:

void setFlushMode(FlushModeType flushMode)
Set the flush mode that applies to all objects contained in the persistence context.
请注意,FlushModeType是具有以下两个值的枚举:

FlushModeType在查询执行时自动(默认)刷新。 自:JPA 1.0 FlushModeType提交刷新将在事务时发生 犯罪提供程序可以在其他时间刷新,但不要求刷新。 自:JPA1.0


我希望这有助于

使用flush()我能做什么?如果不使用flush(),我不能做什么?flush将数据放入数据存储中,没有它,数据就不存在,因此查询可以返回过时的数据。也许读过flush()上的JPA规范吧,API关于flush()的所有内容都是“将持久性上下文同步到基础数据库”,我以前从未使用过它,但在调用
EntityManager.getTransaction.commit()时,我的事务仍然将数据放入数据库。我还没有调用EntityManager.flush()!因此,我无法理解flush()的用法,即使没有它也可以完成它所做的一切。是的,确实提交了数据(如前所述),为此,如果数据尚未刷新到数据存储,那么它将执行刷新。flush()只提供了将其放在前面的选项。flush()的一个用例是强制生成可以在同一事务中使用的ID。例如,当您想要创建日志(在数据库中)或历史记录条目(基本上是副本)时。不使用这些条目和实际实体之间的关系的原因是,在这种情况下,您不必为ID操心,因为这样您就无法删除实体,而不会由于外键而丢失日志/历史记录条目。正如我问DataNucleus的那样:我可以使用flush()做什么?更新了我的答案。希望该链接能回答您的问题。@AhamedMustafaM
您的两个代码示例都不会保留或合并要写入DB的实体状态。
否,如果实体被管理,更改将在数据库中隐式同步。@NayanWadekar感谢您提供的新信息。让我分析并删除它在第一个示例中没有事务,因此在flush()上引发了一个异常。@DataNucleus我认为在CMT中,我们不必手动启动/结束事务。当然,但他在CMT中吗?在他的另一个例子中,他启动txn,所以这是我唯一能做的假设make@NayanWadekar我认为数据没有被发送到数据库。它只在缓存中。您需要“提交”才能发送数据。@程序员:否,更改会在刷新时立即反映出来,请参阅文档-&这里有一些解释-