我有一个这样的实体:
@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;
}
问题:
乐观锁会在这里出现吗?在上述情况下(运行HQL且没有会话),Hibernate是否自动照顾乐观锁定?
如果以上情况都不成立,我需要自己实现:阅读Hibernate文档中说,我需要使用
@Version
注释字段。但是我应该为此专门在表中添加这个新字段吗?还是可以为@Version
注释指定任何现有字段?这里有什么特殊处理吗?乐观锁定期间抛出的异常是
StaleObjectStateException
?因此,当引发异常时,可以确定它是乐观锁异常吗?任何其他用例。原因是,我需要相应地通知用户。 最佳答案
如果您没有用@Version注释的任何字段,则Hibernate无法进行乐观锁定。
拥有@Version字段的目的恰恰是避免实现自己的乐观锁定。 Hibernate将使用带@Version注释的字段来实现乐观锁定。它的工作方式是described in the documentation。请注意,更新查询将完全绕过乐观锁验证。他们可以更新版本字段,但仅当使用versioned update时。
exception javadoc解释何时引发此类异常。