[Seasar-user:10428] Re: [S2Dao]VersionNoによる排他制御が2回目の更新以降、正しく行われない。
JUNDU
[E-MAIL ADDRESS DELETED]
2007年 9月 10日 (月) 12:38:49 JST
JUNDUです。
排他制御の処理では、Daoに引数として渡したEntityの値がデータベースと同期して
インクリメントされており、それを使えば問題ないように思えます。
やりたいことが排他制御なのか、VersionNoをインクリメントしたいだけなのか分か
りませんでしたが、S2Daoで提供されている機能は排他制御のための機能です。そのた
め、渡したEntityのVersionNoとデータベース上の値が一致しないと更新できずエラー
になります。
排他制御を正しく使うのであれば、渡したEntityを2回目以降で使うか、以下のよう
にEntityのVersionNoをDtoに書き戻す処理が必要だと思います。
public class HogeLogicImpl implements HogeLogic {
public void update(HogeDto dto) {
HogeTable entity = convertDtoToTableEntity(dto);
dao.update(entity);
dto.setVersionNo(entity.getVersionNo());
}
nobu wrote:
> 近藤(nobu)です。
>
> VersionNoによる排他制御の機能を実装したのですが、同レコードに2回目の
> updateを行うと例外が発生しています。
>
> ※私の中ではVersionNoの排他制御は、updateを行うたびにテーブルのversionno
> (またはアノテーションで指定されたVersionNoProperty項目)の数値がカウント
> アップしていくものという認識です。この時点で間違えていたら、御指摘願いま
> す。
>
> テーブルのversionnoの値は、insert,update(1回目),update(2回目)で、次のよ
> うに変化していくと思っています。
>
> insert versionno 0
> update(1回目) versionno 0 -> 1
> update(2回目) versionno 1 -> 2 ※ここのupdateでエラー
>
> 実際、update(1回目)を実行後、versionnoの値は1になっていました。
> ところが、2回目のupdate文の中身を見てみると、
>
> UPDATE ・・・ versionno = 1 WHERE id = 2 AND versionno = 0
>
> となっています。2回目なので、
>
> UPDATE ・・・ versionno = 2 WHERE id = 2 AND versionno = 1
>
> と、ならなければならないとおもうのですが、うまくいきません。
> Dtoの設定が悪いのでしょうか?以下ソースです。
>
>
> == ソース ===========================================================
> ■メイン処理
> public class HogeLogicImpl implements HogeLogic {
>
> private HogeTableDao dao;
>
> public HogeDao getHogeDao() {
> return dao;
> }
>
> public void setHogeDao(HogeTableDao dao) {
> this.dao = dao;
> }
>
> public void update(HogeDto dto) {
> dao.update(convertDtoToTableEntity(dto));
> }
>
> private HogeTable convertDtoToTableEntity(HogeDto dto)
> {
> HogeTable ent = new HogeTable();
>
> ent.setId(dto.getId());
>
> ・
> ・
> ・
>
> ent.setVersionno(dto.getVersionno());
>
> return ent;
> }
> }
>
>
>
> ■Dao
>
> package hoge.dao;
>
> import org.seasar.dao.annotation.tiger.Arguments;
> import org.seasar.dao.annotation.tiger.S2Dao;
>
> import hoge.entity.HogeTable;
>
> @S2Dao(bean=HogeTable.class)
> public interface HogeTableDao {
>
> public HogeTable[] selectAll();
>
> @Arguments("ID")
> public HogeTable selectById(Long id);
>
> public int insert(HogeTable hoge);
>
> public int update(HogeTable hoge);
>
> public int delete(HogeTable hoge);
>
> }
>
>
>
> ■Entity
>
> package hoge.entity;
>
> import java.util.Date;
>
> import org.seasar.dao.annotation.tiger.Bean;
> import org.seasar.dao.annotation.tiger.Column;
> import org.seasar.dao.annotation.tiger.Id;
> import org.seasar.dao.annotation.tiger.IdType;
>
> @Bean(table="HOGE_TABLE",versionNoProperty="versionno")
> public class HogeTable {
>
> private Long id;
>
> ・
> ・
> ・
>
> private int versionno;
>
>
>
>
> @Id(value=IdType.SEQUENCE,sequenceName="SEQ$HOGE_TABLE")
> public Long getId() {
> return id;
> }
>
> public void setId(Long id) {
> this.id = id;
> }
>
> ・
> ・
> ・
>
> public int getVersionno() {
> return versionno;
> }
>
> public void setVersionno(int versionno) {
> this.versionno = versionno;
> }
> }
> =====================================================================
>
> ■環境
> J2SDK 1.5.0_11
> Oracle 10g
> s2-framework-2.4.10
> s2-tiger-2.4.10
> s2-extension-2.4.10
> s2-dao-1.0.41-SNAPSHOT
> s2-dao-tiger-1.0.41-SNAPSHOT
>
> テーブル上のversionnoは、Number(6) で定義しています。
>
>
> 以上、何か御存じの方、アドバイスをお願い致します。
> _______________________________________________
> Seasar-user mailing list
> [E-MAIL ADDRESS DELETED]
>
> https://ml.seasar.org/mailman/listinfo/seasar-user
>
>
Seasar-user メーリングリストの案内