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

nobu [E-MAIL ADDRESS DELETED]
2007年 9月 10日 (月) 12:08:28 JST


近藤(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 メーリングリストの案内