2013-07-10 103 views
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;  
    } 

问题:

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

回答

4
  1. 如果没有与@Version注解的任何领域,Hibernate无法做到乐观锁。
  2. 拥有@Version字段的目的正是为了避免实现自己的乐观锁定。 Hibernate将使用@Version注释的字段来实现乐观锁定。它的工作方式是described in the documentation。请注意,更新查询将完全绕过乐观锁定验证。他们可以更新版本字段,但只能在使用versioned update时使用。
  3. exception javadoc解释何时引发这样的异常。
+0

1.数据库中是否应该存在'@ Version'注释字段? 2.所以:对于版本更新,我只需要使用'Update versioned'而不是'update'? –

+1

1.是的,当然。否则,Hibernate会在何处找到它的值?花时间阅读文档。如果你阅读它是显而易见的。 2.是的,这是版本更新的定义。 –

+0

谢谢。嗯。我只需要在每个表格中为@Version专门创建一个字段..呵呵! –