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