java - 何时需要以及何时不需要手动将更新保存到 JPA 实体

标签 java jpa

我有一个 java.persistence.Entity 类,我使用 java.persistence.EntityManager.persist 对其进行实例化和持久化。为了安全起见,我确保它已合并到持久性上下文中并且我很好。

现在,我知道当我从头开始创建实体时,我需要通过 EntityManager 手动持久化它,但是如果我只是检索一个已经存在的记录作为一个实体呢?我的测试表明,只需对该实体调用 setter 就会导致更新进入数据库,但我正在寻找可以依赖的明确内容。因此,任何人都可以阐明或来源说明何时(可靠地)对附加实体进行更新以获得写入磁盘。此时,我别无选择,只能在进行更改后手动保留实体,但我更清楚何时何地不必这样做。

更新:(感谢 Yusuf)根据下面提到的接受的答案,我的问题得到了回答。 JPA EntityManager: Why use persist() over merge()? .

根据那个答案,persist 本身除了将实体添加到持久性上下文之外什么都不做。合并将一个新对象添加到上下文中。这意味着持久性只是作为持久性上下文的一部分的功能,并且由于通过实体管理器获取实体,实体附加到上下文,因此根本不需要呼吁坚持

最佳答案

如您所说,如果您从头开始创建对象,则需要调用 persist。

如果您使用 EntityManager 访问 JPA 实体,你永远不需要调用 persist 方法,因为当事务结束时(大部分时间是在返回事务方法时),它会自动持久化。如果您不想在事务方法返回时自动持久化,则必须使用 EntityManager 的分离方法.

还有 this answer可能会给你更多信息

关于java - 何时需要以及何时不需要手动将更新保存到 JPA 实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35637657/

相关文章:

java - JPA 更改不会保留在数据库中

JSF 和 JPA 最佳实践

java - 如何在 JPA 中对结果查询进行分页?

java - 使用 wicket-guice 时出现无限循环

java - Exoplayer 的 Ooyala SDK - NoClassDefFoundError : com. ooyala.android.player.exoplayer.ExoStreamPlayer

java - 如何在java中使用ExtentReports监听器打印日志?

java - EJB3 映射的?谁拥有 OR 映射?

java - 使用 Jpa 将相同的实体保存在不同的表(相同的架构)中

Java 可能的有损转换 Double 到 Int

java - HashMap - 插入新的相等对象后,先前的键仍然存在