gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 07:15:35 25 4
gpt4 key购买 nike

我有这样一个实体:

  @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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com