次のようなエンティティがあります。
@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 は楽観的ロックを自動的に処理しますか?
- 上記が当てはまらず、自分で実装する必要がある場合: フィールドに
@Version
. しかし、この新しいフィールドをテーブルに追加する必要がありますか?@Version
または、注釈用の既存のフィールドを指定できますか? ここで特別な取り扱いはありますか? - 楽観的ロック中にスローされる例外は
StaleObjectStateException
? 例外がスローされた場合、楽観的ロック例外であると確信できますか? その他の使用例。その理由は、それに応じてユーザーに通知する必要があるためです。