[Seasar-user:10435] Re: [S2Dao]VersionNo による排他制御が2回目の更新以降、正しく行われない。

Yasuo Higa [E-MAIL ADDRESS DELETED]
2007年 9月 10日 (月) 13:06:04 JST


ひがです。

> 近藤(nobu)です。
> 
> VersionNoによる排他制御の機能を実装したのですが、同レコードに2回目の
> updateを行うと例外が発生しています。
> 
> ※私の中ではVersionNoの排他制御は、updateを行うたびにテーブルのversionno
> (またはアノテーションで指定されたVersionNoProperty項目)の数値がカウント
> アップしていくものという認識です。この時点で間違えていたら、御指摘願いま
> す。
> 
versionNoPropertyを使うのではなく、プロパティ名をversionNoに
するとどうなるでしょうか。

後、convertDtoToTableEntityメソッドを自作するのではなく、
S2Dxoを使ったほうがコーディングしなくても良いので楽できます。

> テーブルの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
> 


--
Yasuo Higa
[E-MAIL ADDRESS DELETED]


Seasar-user メーリングリストの案内