2

次のようなエンティティがあります。

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

1 に答える 1