JPA EntityManager:为什么使用 persist() 而不是 merge()?

2023-11-26

EntityManager.merge()可以插入新对象并更新现有对象。

为什么要使用persist()(只能创建新对象)?


无论哪种方式都会将实体添加到 PersistenceContext 中,不同之处在于您随后对该实体执行的操作。

Persist 获取一个实体实例,将其添加到上下文中并使该实例受到管理(即,将跟踪该实体的未来更新)。

合并返回与状态合并的托管实例。它确实返回 PersistenceContext 中存在的内容或创建实体的新实例。在任何情况下,它都会从提供的实体复制状态,并返回托管副本。您传入的实例将不会被管理(您所做的任何更改都不会成为事务的一部分 - 除非您再次调用合并)。尽管您可以使用返回的实例(托管实例)。

也许代码示例会有所帮助。

MyEntity e = new MyEntity();

// scenario 1
// tran starts
em.persist(e); 
e.setSomeField(someValue); 
// tran ends, and the row for someField is updated in the database

// scenario 2
// tran starts
e = new MyEntity();
em.merge(e);
e.setSomeField(anotherValue); 
// tran ends but the row for someField is not updated in the database
// (you made the changes *after* merging)
      
// scenario 3
// tran starts
e = new MyEntity();
MyEntity e2 = em.merge(e);
e2.setSomeField(anotherValue); 
// tran ends and the row for someField is updated
// (the changes were made to e2, not e)

场景 1 和 3 大致相同,但在某些情况下您需要使用场景 2。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JPA EntityManager:为什么使用 persist() 而不是 merge()? 的相关文章

随机推荐

  • 如何在java中检查(未经检查的)强制转换?

    我有以下问题 我想编写一个使用java反射的框架 我 从某处 获得一个类的名称 我想加载该类并创建一个实例 作为侧面约束 所有有效的类都属于一个公共超类 为了保持简单和容易 我不会发布我所有的课程 相反 我编写了某种 MWE 见下文 我该怎
  • 从 TFS 签出时的 .partial 文件

    当我从 TFS 查看解决方案时 我在整个项目中得到了很多 partial 文件 它们不在 TFS 服务器上 而在我的 PC 上 遗憾的是 其中一些阻止我的解决方案运行 我总是必须手动删除它们 我能以某种方式阻止这种情况吗 他们来自哪里 这些
  • 如何通过 slack API 删除/禁用用户?

    我对此尝试了多种方法 首先尝试获取没有任何用户 ID 的用户 这仅返回我的用户 然后尝试获取具有其他 id 的用户 它也可以正确检索数据 但是 我似乎无法将用户属性设置为 已删除 我正在使用这种Python方法 slack client a
  • 本地存储库需要 Git LFS 吗?

    我创建了一个专门存储在本地的 Git 存储库 我问自己 我是否真的需要 Git LFS 来存储二进制文件 据我所知 gitattributes已正确配置 如下所示 psd binary 是的 文件落在 git objects 但它们被压缩并
  • 创建CSS全局变量:样式表主题管理[重复]

    这个问题在这里已经有答案了 有没有办法在 css 中设置全局变量 例如 Color1 fff Color2 b00 h1 color Color1 background Color2 最新更新 16 01 2020 CSS 自定义属性 变量
  • CSV 到关联数组

    我见过很多关于如何获取 CSV 文件 然后创建一个以标题为键的关联数组的示例 例如 Brand Model Part Test Honda Civic 123 244 Honda Civic 135 434 Toyota Supra 511
  • 将范围扩展为:“1-3,6,8-10”到 [1,2,3, 6, 8,9,10]

    我试图在我的程序中添加一个选项 允许用户选择他想要执行的程序步骤 我希望能够解析像这样的字符串 1 3 6 8 10 并得到 1 2 3 6 8 9 10 你知道 Python 中是否已经存在正在执行此操作的东西吗 该函数执行您所要求的操作
  • Solr 可以加载原始 Lucene 索引吗?

    我的一些同事有一个大型 Java Web 应用程序 该应用程序使用使用 Lucene Java 构建的搜索系统 我想做的是拥有一个基于 HTTP 的 API 来访问那些现有的搜索索引 我以前使用过 Nutch 并且非常喜欢 OpenSear
  • WordPress 自定义注册表

    我有一位客户需要定制注册表 我需要在此页面上进行自定义设计 我需要添加自定义字段 例如名字 公司 电话等 有人可以帮我解决这个问题吗 询问 WordPress 问题的更好地方可能是WordPress 答案 无论如何 如果你想在没有插件的情况
  • 在角度引导程序中设置初始静态选项卡

    我似乎无法在角度引导选项卡集中设置初始选项卡 它始终将最左侧的选项卡设置为活动状态 给定 html
  • 忽略不允许的属性 IISMAJORVERSION 和“EnableUserControl”?

    我的安装程序包在我的计算机上运行 但在我同事的计算机上失败 查看日志 我可以看到一些属性值在 ExecuteAction 短语期间没有保留 有几个Ignoring disallowed property安装程序日志文件中的行以及这些属性在
  • Django 模板中的 IsInstance 吗?

    有没有办法在 Django 模板中执行 isinstance issubclass 操作 我意识到我可以编写自己的模板标签 但令我惊讶的是这不可能 这让我觉得我要么做错了什么 要么遗漏了一些明显的东西 我希望显示两个不同的标记部分 具体取决
  • 带窥视功能的 UIPageViewController

    我正在尝试使用创建页面浏览器UIPageViewController在 Interface Builder 中 允许显示部分相邻页面 也称为查看 我一直在关注教程http www appcoda com uipageviewcontroll
  • 从不同的类访问 HashMap

    我的班级中有一个名为 DataStorage 的哈希图 HashMap
  • Tensorflow 2.0 自定义训练循环的学习率

    当我使用tensorflow 2 0自定义训练循环时 是否有任何函数或方法可以显示学习率 这是张量流指南的示例 def train step images labels with tf GradientTape as tape predic
  • 在 py2exe 构建中包含 PYD/DLL

    我的应用程序的模块之一使用 pyd 文件中的函数 有一个选项可以排除 dll exclude dlls 但是有一个选项可以包含它们吗 尽管复制了其余文件 py 但构建过程似乎并未复制我的模块中的 pyd 我还需要包含一个 dll 如何让 p
  • Solr 使用太多内存

    我们有一个在带有 Oracle Java 6 Hotspot JDK 的 Windows 2008 R2 上运行的 Solr 3 4 实例 该实例变得无响应 当我们查看机器时 我们注意到可用物理内存变为零 Tomcat7 exe 进程使用了
  • php paypal 快速结帐问题

    我正在尝试在我的网站上集成贝宝快速结帐 我试图使用沙箱进行检查 当我从我的网站提交数据时 生成的令牌没有错误 但当重定向到 PayPal 时 它不显示付款金额 顺便说一句 我正在使用贝宝快速结帐向导中的代码 如果有人指出我正确的方向 那将会
  • 选择日期后添加天数(周末和节假日除外)

    我有两个文本字段 在第一个文本字段中 我使用 jQueryUI Datepicker 添加了一个日历 当用户从日期选择器中选择日期时 它应该自动向该日期添加 30 天 并在第二个文本字段中设置该值 我已经完成了将日期添加 30 天的工作 但
  • JPA EntityManager:为什么使用 persist() 而不是 merge()?

    EntityManager merge 可以插入新对象并更新现有对象 为什么要使用persist 只能创建新对象 无论哪种方式都会将实体添加到 PersistenceContext 中 不同之处在于您随后对该实体执行的操作 Persist