[Seasar-user:7174] Re: EntityManager によるクエリ実行で例外

[E-MAIL ADDRESS DELETED] [E-MAIL ADDRESS DELETED]
2007年 4月 11日 (水) 12:55:46 JST


お世話になっております。
後藤と申します。

[Seasar-user:7163] EntityManager によるクエリ実行で例外 の件についてですが、

S2Dao 1.0.41-RC1 から 1.0.41 にバージョンUPしたところ
こちらでも同じ事象が発生しています。

S2Container 2.4.11
S2Dao 1.0.41
j2ee.dicon, dao.dicon ともjarファイル内のものを使用しています。
なお、RDBは Oracle9i R2 です。

Daoのメソッドから同じDao内の別メソッドを呼ぶと発生するようです。
このような処理は 本来、Daoを使用するクラスで行うべきなのかもしれませんが。

このような Dao を
[Daoソース]
@S2Dao(bean=TestTable.class)
public abstract class TestTableDaoImpl extends AbstractDao implements TestTableDao {

    public TestTableDaoImpl(DaoMetaDataFactory daoMetaDataFactory) {
        super(daoMetaDataFactory);
    }
    
    public abstract TestTable[] selectAll();

    @Arguments("ID")
    public abstract TestTable selectById(Integer id);

    @Sql("select count(*) from test_table")
    public abstract int selectCount();
    
    public boolean isCountZero() {
        int count = selectCount();
        if (count > 0) {
            return false;
        }
        return true;
    }

    public abstract int insert(TestTable table);

    public abstract int update(TestTable table);

    public abstract int delete(TestTable table);
    
    @Sql("delete from test_table")
    public abstract int deleteAll();
}

以下のようなテストクラスで実行すると
testInsertFailTx は失敗し、testInsertTx は成功します。

[DaoTestソース]
public class TestTableDaoTest extends S2DaoTestCase {
    private TestTableDao testTableDao;
    
    public TestTableDaoTest(String arg0) {
        super(arg0);
    }

    public void setUp() {
        include("TestTableDao.dicon");
    }
    
    public void testInsertFailTx() {
        if (testTableDao.isCountZero()) {
            TestTable entity = new TestTable();
            entity.setId(1);
            entity.setName("Test1");
            testTableDao.insert(entity);
        } else {
            TestTable entity = new TestTable();
            entity.setId(2);
            entity.setName("Test2");
            testTableDao.insert(entity);
        }
    }
    
    public void testInsertTx() {
        if (testTableDao.selectCount() > 0) {
            TestTable entity = new TestTable();
            entity.setId(2);
            entity.setName("Test2");
            testTableDao.insert(entity);
        } else {
            TestTable entity = new TestTable();
            entity.setId(1);
            entity.setName("Test1");
            testTableDao.insert(entity);
        }
    }
}


事象が発生するソースまた、テストテーブル作成用のDDLを添付します。
お手数おかけしますが、ご確認よろしくお願いします。
-------------- next part --------------
テキスト形式以外の添付ファイルを保管しました...
ファイル名: s2dao1_0_41_error.zip
型:         application/zip
サイズ:     5747 バイト
説明:       無し
URL:        http://ml.seasar.org/archives/seasar-user/attachments/20070411/0dde0db9/attachment.zip 


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