理解 JPA 和 Hibernate 中 Persist() 和 Merge() 之间的区别
在 JPA 和 Hibernate 中, persist() 和 merge() () 方法在管理实体和处理数据持久性方面发挥着关键作用。但是,它们的行为有明显的差异。
Persist()
JPA 规范定义的 persist() 方法的操作如下:
- 如果实体是新的且不受管理,则在提交或刷新事务时,它将变为受管理并将保存到数据库。
- 如果实体已被管理或删除,则操作被忽略。
- 如果实体被分离,可能会抛出异常,或者持久化操作可能在刷新或提交期间失败。
- 级联操作应用于任何引用的实体cascade=PERSIST 或cascade=ALL 注释。
Merge()
另一方面,merge() 方法具有一组不同的语义:
- 如果实体已分离,则其状态将复制到具有相同标识的预先存在的托管实体,或者创建新的托管副本。
- 如果实体是新实体,创建一个新的托管实体,并从传入实体复制其状态。
- 如果删除该实体,则会引发异常。
- 如果该实体是托管的,则忽略该操作,但如果使用cascade=MERGE或cascade=ALL注释,级联操作仍然应用于引用的实体。
- 合并实体引用使用cascade=MERGE或cascade=ALL注释的所有关系的托管实体。
- 如果实体与对非级联关系的引用合并,则合并实体的关联将返回对具有相同标识的托管对象的引用。
当使用 Persist() 或 Merge()
基于这些差异,以下指南可以帮助您选择合适的方法:
- 在需要时使用 persist()创建一个新的或更新尚未由持久化上下文管理的现有实体。
- 当您想要更新已被管理但已在持久化上下文之外修改的现有实体时,请使用 merge() .
以上是## 在 JPA 和 Hibernate 中我什么时候应该使用 `persist()` 与 `merge()`?的详细内容。更多信息请关注PHP中文网其他相关文章!