java - hibernate/JPA : Update then delete in one transaction

标签 java hibernate jpa

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

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();

最佳答案

是的,使用 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;

关于java - hibernate/JPA : Update then delete in one transaction,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51771506/

相关文章:

java - NoSuchBeanDefinitionException : No qualifying bean of type 'org.springframework.boot.web.reactive.error.ErrorAttributes' available:

java - 如果 java 中的文本太长,则对其进行压缩

Java 或 Scala RFC5987

java - Hibernate @Lob on byte[] 导致 "Bad value for type long"

java - 在Java中设置Actor系统的默认ExecutionContext

java - 在 DispatcherServlet 中未找到带有 URI 的 HTTP 请求的映射 - 上下文组件扫描不起作用

java - entitymanager 的正确使用方法是什么

Hibernate EntityManager + 查询缓存 - "join fetch"不起作用

java - 如何将实体分布在 Spring-data-jpa 和 eclipselink 中的不同模块上?

java - 将 JPA Criteria Builder 与表连接结合使用