java - 乐观锁定 - Hibernate 和 EJB - 使用 HQL 批量更新

标签 java hibernate ejb entity optimistic-locking

我有一个这样的实体:

  @Entity
  @Table(name = "PERSON_TB") {
  public class Person implements Serializable {

         private static final long serialVersionUID = 3433ba34234aL;

         @Id
         @Column(name = "ID")
         private Long personId;

         @Column(name = "NAME")
         private String name;

         @Column(name = "UPDATE_DATE")
         private Date updatedDate;

         //getters and setters
  }

我有一个生成 HQL 的代码:

  Update Person p set p.updatedDate = :dt_1 where p.personId = :pid_1,
                      p.updatedDate = :dt_2 where p.personId = :pid_2
                      ....

执行更新的代码:

    @SuppressWarnings("unchecked")
    @TransactionAttribute(TransactionAttributeType.MANDATORY)
    public int executeUpdate(String sql, Map<String, Object> params) {

       Query query = getEntityManager().createQuery(sql);

       for (Entry<String, Object> entry : params.entrySet()) {
          query.setParameter(entry.getKey(), entry.getValue());
       }

       int rows = query.executeUpdate();
       return rows;     
    }

问题:

  1. 这里会用到乐观锁吗?在上述情况下(运行 HQL 并且没有 session ),Hibernate 是否会自动处理乐观锁定?
  2. 如果上述情况不正确,并且我需要自己实现:我阅读了 Hibernate 文档,其中说,我需要使用 @Version 注释字段。但是我应该专门为此在表中添加这个新字段吗?或者我可以为 @Version 注释指定任何现有字段?这里有什么特殊处理吗?
  3. 乐观锁期间抛出的异常是StaleObjectStateException?那么当抛出异常时,我可以确定它是乐观锁异常吗?任何其他用例。原因是,我需要相应地通知用户。

最佳答案

  1. 如果没有任何用 @Version 注解的字段,Hibernate 就无法执行乐观锁定。
  2. 拥有 @Version 字段的目的正是为了避免实现您自己的乐观锁定。 Hibernate会使用@Version注解的字段来实现乐观锁。它的工作方式是described in the documentation 。请注意,更新查询将完全绕过乐观锁验证。他们可以更新版本字段,但仅限于使用 versioned update 时.
  3. exception javadoc解释何时抛出此类异常。

关于java - 乐观锁定 - Hibernate 和 EJB - 使用 HQL 批量更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17577324/

相关文章:

java - 如何使用 java.sql 包连接到 Docker 上的 Postgres?

java - 后台线程的 JDBC 连接在 Websphere 中关闭访问

hibernate - Hibernate/GORM-处理多 session 域对象更新

jakarta-ee - 何时在无状态 session bean 上使用有状态 session bean?

java - 如何使用 EJB 实体 bean 连接到 mysql 数据库?

Java EJB 接口(interface)

Java 进程在 CRON 后仍保持 Activity 状态

java - 无法访问在特定机器上运行的Web应用程序

java - 有谁知道如何使用 Base64 解码和编码 Base64 中的字符串?

java - 在 Hibernate 中映射集合的简单值类型时出现异常