首页 > Java > java教程 > 正文

## 在 JPA 和 Hibernate 中我什么时候应该使用 `persist()` 与 `merge()`?

Susan Sarandon
发布: 2024-10-26 12:38:03
原创
673 人浏览过

## When Should I Use `persist()` vs. `merge()` in JPA and Hibernate?

理解 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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!