当前位置: 首页 > 面试题库 >

如何使用Hibernate模仿upsert行为?

朱季
2023-03-14
问题内容

我正在编写一个应用程序,用于将第三方数据源中的实体同步到我们自己的模式中,并在两者之间进行转换/映射。我正在使用Hibernate在我们自己的模式中表示和持久化实体。我遇到的一个问题是,我的一张桌子上有一个唯一的多列键。我想看到的行为类似于upsert:当Hibernate去持久化一个实体并检测到唯一的约束冲突时,它会执行更新。我们正在使用MySQL,它提供了INSERT … ON DUPLICATE KEY UPDATE语法,但是我不确定如何或是否可以使用Hibernate?

我想我总是可以尝试插入,如果遇到


问题答案:

我们正在使用MySQL,它提供了INSERT … ON DUPLICATE KEY UPDATE语法,但是我不确定如何或是否可以使用Hibernate?

好像有人通过重写Hibernate对该实体使用的语句来做到这sql-insert一点。如果您不介意不便于移植(可能使用存储过程),请看一看。

我想我总是可以尝试插入,如果遇到异常,请进行更新,但这似乎很hacky且不够理想。有什么干净的方法可以做到这一点吗?

另一种选择是:

  • 在唯一键上执行选择
  • 如果找到记录,请对其进行更新
  • 如果找不到记录,请创建

但是,除非您在此过程中锁定整个表,否则您可能会在多线程和分布式环境中面临某些竞争条件,并且第3步可能会失败。想象两个并发线程:

线程1:

  • 开始反式
  • 对键执行选择
  • 没有找到记录
  • 创建记录
  • 承诺

线程2:

  • 开始反式
  • 对同一键执行选择
  • 没有找到记录
  • 创建记录
  • 提交(失败!因为html" target="_blank">线程1更快,并且存在具有相同唯一键的记录)
    因此,无论如何,您都必须实现某种重试机制(锁定整个表不是IMO的好选择)。


 类似资料:
  • 问题内容: 我正在使用Elasticsearch python客户端作为http://elasticsearch- py.readthedocs.org/ 我尽力了,但仍然找不到带upsert的更新api。任何人都可以用ES python客户端upsert api给我一个例子。 问题答案: 示例代码如下: 如果没有它,则在id不存在时会引发异常。此外,请确保您的数据包装在doc {}中。

  • 我正在编写一个应用程序,并使用建立客户端呼叫到外部服务。我有定制的编码器和解码器,我正在注册像这样: 我正在为客户机调用编写单元测试,这样我就可以观察feign机器如何处理编码器/解码器覆盖和异常气泡。我现在对用假服务器编写集成测试不感兴趣(这是我看到人们为这种情况编写的最常见的测试类型)。 这应该是直截了当的。我想模拟发出请求的时间点,让它返回我的假响应。这意味着我应该模拟调用,这样当它向这个呼

  • 问题内容: 我是新来的冬眠。我需要了解以下问题: (1)休眠映射中的子选择是什么? (2)如何在hbm文件中映射子选择? (3)如果我使用subselect检索值,那么如何在java Action类中获取检索的值。 问题答案: 根据第5.1.3节中的描述,该元素用于定义一个只读/不可变的实体,该实体基于任意本机查询的结果。 在同一来源中,人们仅在元素内使用而不是属性,然后将查询中定义的列名称用作属

  • 问题内容: 如何将结果集限制为给定列的 n个 不同值,其中实际行数可能更高? 输入表: 所需的输出,其中limit different = 5个client_id的不同值: 该平台旨在用于MySQL。 问题答案: 您可以使用子选择

  • 问题内容: PostgreSQL 9.5的upsert的正确语法,下面的查询显示错误,为什么? 我尝试更改为 然后显示错误,但是 我不想将gallery_id或category_id设置为唯一, 因为我想确保两列都相同然后进行更新.... 如何正确地在postgres 9.5中进行upsert? 如果需要唯一列,我应该使用其他方法,怎么办? 我想确保多列都冲突然后进行更新,正确的用法是什么 表(c

  • 问题内容: 我在MySQL这样有两行 空字符串是空的。 现在,我想同时获得它们。我在两列上都使用和,但是它总是只返回一行。 代码是这样的 当我仅在上添加条件时,它将返回两行。但是对于,它仅返回第二个,它为空。 该javadoc的说,所以我会收到这个错误,还是应该以其他方式使用? 更新 : 对不起,我好粗心。该文件清楚地说明了这一点。此方法根据传递给它的方法工作,而不是存储在DB中的命名属性的实际值