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