【问题标题】:Hibernate/JPA: Update then delete in one transactionHibernate/JPA:在一个事务中更新然后删除
【发布时间】:2018-08-09 16:01:41
【问题描述】:

是否可以在同一事务中的更新后立即执行更新查询然后执行删除查询?我正在尝试根据令牌的哈希激活帐户,然后在同一事务中删除该令牌。

transaction.begin();
entityManager
.createNativeQuery(
                      "UPDATE accounts AS ac "
                    + "INNER JOIN account_tokens AS ak ON ac.id = ak.account_id "
                    + "SET ac.account_state = "
                    + "CASE "
                    + "WHEN ac.account_state = 'AWAITING_ACTIVATION' THEN 'ACTIVATED' "
                    + "END "
                    + "WHERE ak.token_hash = :tokenHash")
                    .setParameter()
                    .executeUpdate();
em.createNativeQuery(
                      "DELETE FROM account_tokens AS ak "
                    + "WHERE ak.token_hash = :tokenHash")
                    .setParameter()
                    .executeUpdate(); // delete
transaction.commit();

【问题讨论】:

  • 逻辑上可行。您正在更新和删除不同的表,这很好。在同一张表上做可能会导致数据不一致。
  • 逻辑上没问题。我没有发现任何问题。你具体的困惑是什么?您对任何场景有任何问题吗?
  • @ShafinMahmud 事情是我在执行更新查询后删除了第一个实体 - 我正在使用内部连接并更新其外键上的表,之后,我想删除实体。也许我应该在问题中提到这一点,我的错。这样可以吗?-- 我不会有任何数据不一致,因为这是一次性的事情
  • 您可以随时更新您的问题。您能否提及您正在处理的 updatedelete 查询?你已经描述了,我知道。但是看到查询会更简洁地清除图片。请使用这些详细信息更新您的问题。
  • @ShafinMahmud 完成。谢谢。

标签: java hibernate jpa


【解决方案1】:

是的,使用 PL/SQL 过程。

您无法减少查询的数量 - 它们都做不同的事情 - 但您可以通过将其全部包装为 PLSQL 函数来减少到数据库的往返次数和解析次数。

   CREATE PROCEDURE s_u_d(a)
    BEGIN

    UPDATE tab_x SET tab_x.avalue=1 WHERE tab_x.another=a;

    DELETE FROM tab_y WHERE tab_y.avalue=a;

    SELECT * 
    FROM tab_x
    WHERE tab_x.another=a;

    END;

【讨论】:

  • 感谢您的回答。但是,不幸的是,我使用的是 MySQL。
猜你喜欢
  • 2021-11-30
  • 1970-01-01
  • 2013-12-17
  • 1970-01-01
  • 2023-03-25
  • 2019-12-20
  • 1970-01-01
  • 2014-09-14
  • 2021-05-07
相关资源
最近更新 更多