【问题标题】:Is there a way to conditionally insert using Hibernate?有没有办法使用 Hibernate 有条件地插入?
【发布时间】:2012-12-26 11:58:50
【问题描述】:

我们有一个表,其中包含每个更新值的新行。主键由 ID 和时间戳组成。还有一个状态栏。对于特定的 ID,我们将有一行表示每次更新该值时,我们使用具有最新时间戳的行来表示“当前”值。

我们有一个根据用户输入更新状态的流程。因此,当用户单击 UI 中的按钮时,将创建一个具有新状态和新用户 ID 的新行。

如果两个用户同时单击该按钮,我们只是插入了两条新记录,其中一个将获胜(具有最新时间戳的那个)。我们希望避免让两个用户同时单击此按钮,而一个用户可能会在不知道他们踩到其他人的状态更改的情况下创建一个新行。在 Oracle 中,我们只需执行类似的操作并检查是否插入了一行(其中 PREVIOUS_KNOWN_MAX_TS 是用户查看页面时“当前”记录的 TS):

INSERT INTO SOME_TABLE
   (ID, REVISION_TS, USER_ID, STATUS, ...)
SELECT 1, 'SOME_TIMESTAMP', 'user123', 'NEW_STATUS', ...
FROM DUAL
WHERE NOT EXISTS
   (SELECT *
   FROM SOME_TABLE
   WHERE USER_ID = 1
      AND REVISION_TS >= 'PREVIOUS_KNOWN_MAX_TS'));

如果在用户查看页面和插入用户更新信息的时间之间有插入,则不会发生插入,我们会通过知道插入了零行来检测到这一点。

有没有办法在 Hibernate 中执行此操作,或者我们是否应该尝试执行某种 SELECT FOR UPDATE?

【问题讨论】:

  • saveOrUpdatehibernate 方法呢?
  • 我一直想做一个插入,所以保存或更新不起作用。我遇到的问题是,有时我想确保如果数据库不在我认为的状态时插入不会发生。

标签: java oracle hibernate not-exists


【解决方案1】:

如果您使用 org.hibernate.annotations.SQLInsert 注释您的实体类,您可以覆盖 Hibernate 生成的插入。不过这有点棘手,因为您必须以与 Hibernate 通常插入使用它们的方式完全相同的方式使用绑定参数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-21
    • 2016-08-25
    • 1970-01-01
    • 2012-12-06
    • 2020-02-17
    • 1970-01-01
    • 2022-11-20
    • 1970-01-01
    相关资源
    最近更新 更多