2
批量更新我有一个这样的实体:乐观锁定 - Hibernate和EJB - 使用HQL
@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;
}
问题:
- 乐观锁进入图片吗? Hibernate是否会自动处理上述情况下的乐观锁定(运行HQL并且没有会话)?
- 如果以上情况并非如此,我需要自行实施:我读了Hibernate文档,说我需要用
@Version
注释一个字段。但是,我应该在表格中专门添加这个新字段吗?或者我可以指定@Version
注释的任何现有字段?这里有什么特别的处理 - 乐观锁定期间抛出的异常是
StaleObjectStateException
?所以当抛出一个异常时,我可以肯定它是一个乐观的锁异常?任何其他用例。原因是,我需要相应地通知用户。
1.数据库中是否应该存在'@ Version'注释字段? 2.所以:对于版本更新,我只需要使用'Update versioned'而不是'update'? –
1.是的,当然。否则,Hibernate会在何处找到它的值?花时间阅读文档。如果你阅读它是显而易见的。 2.是的,这是版本更新的定义。 –
谢谢。嗯。我只需要在每个表格中为@Version专门创建一个字段..呵呵! –