当前位置: 首页 > 知识库问答 >
问题:

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

宇文元明
2023-03-14

我有一个这样的实体:

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

共有1个答案

袁文景
2023-03-14
  1. 如果您没有任何用@Version注释的字段,HiberNate无法进行乐观锁定。
  2. 拥有@Version字段的意义正是为了避免实现自己的乐观锁定。HiberNate将使用带有@Version注释的字段来实现乐观锁定。它的工作方式在留档中进行了描述。请注意,更新查询将完全绕过乐观锁验证。它们可以更新版本字段,但仅限于使用版本化更新时。
  3. javadoc解释了何时抛出这样的异常。
 类似资料:
  • 我有一个带有和的微服务。我使用注释对中的表执行操作。我遇到的问题是保存操作花费了太多的时间,所以我希望读取操作不被它阻塞。注意,保存是通过持久化实体来执行的。 当前,在所有并发保存操作完成之前,所有读取操作都不会返回结果,这意味着表被锁定。相反,我希望实现乐观锁定。我怎样才能做到呢?

  • 问题内容: 我试图按顺序实施乐观锁定,以避免丢失更新情况。在我的应用程序中,当两个用户获取相同的记录,而第一个用户通过一些更改对其进行更新时。查看相同记录的第二个用户看不到此更改,并且他自己进行了一些更改并更新了该记录。因此,第一人称更改丢失。为了防止这种情况,我写了以下内容,但问题仍然存在。我是这个概念的新手,无法发现问题。 我试图通过阅读doc 11.3.4 来实现这一目标。自定义自动版本控制

  • 问题内容: 我对Hibernate和Spring完全陌生,在尝试学习Spring,Hibernate,Maven等时,我只知道如何使用这三个方法来运行helloworld示例。根据我的基本理解,我被分配了执行乐观锁定的任务。就我用谷歌搜索,我只能看到它不是很困难,我所需要的只是在我的xml中添加一个版本标签,并在我的映射类中添加整数变量版本。 我的xml应该是这样的 当第二个用户保存时,hiber

  • 我们有一个系统,我们偶尔会得到一个乐观的锁定异常。我们在代码中已经解决了这个问题,但现在我正在查看JPA 2,并看到它有一个用于处理这个问题的注释(@版本) 我们的问题是,一个表上有多个事务,如果表锁已满,则即使未对相同的记录进行更改,也会导致乐观锁定异常。 我们在JBoss 4.2服务器上使用hibernate,数据库可以是MySQL或SQL服务器。 如果改为使用@Version,这会在两个数据

  • 当我试图理解基于版本的乐观锁定如何防止“最后提交获胜”问题和适当的覆盖时,我遇到了困难。 为了使问题更具体,让我们考虑以下使用 JDBC 的伪代码: 这里,如果其他事务会在更新和提交之间提交其更改呢?如果事务是并发的,那么第一个事务所做的更新尚未提交,因此第二个事务不可见(具有适当的隔离级别),因此第一个事务提交将覆盖第二个交易的更改,而不会出现任何通知或错误。 乐观锁定只是降低了问题发生的概率,

  • 我不确定方法的设计是否恰当。 我们使用乐观锁定,将增量版本放置在每个实体上。这种实体的每次更新都是通过比较和交换算法执行的,该算法的成功与否取决于其他客户端是否同时更新实体。经典的乐观锁定,如hibernate。 我们还需要采取重新尝试的方法。我们使用基于< code>http的存储(etcd ),某些更新请求可能会超时。 这就是问题所在。如何结合乐观锁定和重试?这是我面临的具体问题。 假设我有一