2013-07-10 143 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專門創建一個字段..呵呵! –