[Seasar-user:3442] Re: S2Dao+MySQLでIDアノテーションが設定できない
服部 晃雄
[E-MAIL ADDRESS DELETED]
2006年 3月 29日 (水) 10:24:25 JST
お世話になっております。Teruです
G 様の検証コードをみながら再度設定を見直したところ、原因となっている
部分がみつかりました。ありがとうございました。
結論としては、Daoを定義するdiconファイル内でS2DaoIntesepterをアスペクト
指定したあとに書いたトランザクションは無視されてしまうようです。
※開始されていたトランザクションは呼び出しクラスにかけていたものでした。
<component name="hogedao" class="com.example.HogeDao">
<aspect>dao.interceptor</aspect>
<aspect>j2ee.requiredTx</aspect>←無視される
</component>
On Wed, 29 Mar 2006 03:49:46 +0900
"G" <[E-MAIL ADDRESS DELETED]> wrote:
> Teru様
> >S2DaoとMySQLの組み合わせでDBアクセスのテストを行っています。
> >IDアノテーションを使用して、IDの取得を試みていますがうまく
> >取得できません。
>
> こんばんは。
> 当方の環境では再現しませんでした。つまりIDが取得できています。
> 以下に試験に用いた環境とコード、設定ファイルを示します。
>
> *版数
> -S2.3.7
> -S2Dao1.0.31
> -MySQL5.0.18
> --jdbc driverはmysql-connector-java-3.1.12-bin.jar
> -Windows XP SP2
>
> *検証コード
> **ビーン (Hoge.java)
> package com.example;
> import java.io.Serializable;
> public class Hoge implements Serializable {
> public static final String TABLE = "HOGE";
> public static final String id_ID = "identity";
> private int id;
> private String name;
> public int getId() { return id; }
> public void setId(int id) { this.id = id; }
> public String getName() { return name; }
> public void setName(String name) { this.name = name; }
> }
>
> **データアクセスオブジェクト (HogeDao.java)
> package com.example;
> public interface HogeDao {
> public static final Class BEAN = Hoge.class;
> public int insert(Hoge hoge);
> }
>
> **駆動用クラス (Main.java)
> package com.example;
> import org.seasar.framework.container.S2Container;
> import org.seasar.framework.container.factory.S2ContainerFactory;
> public class Main {
> public static final String PATH = "trial.dicon";
> public static void main(String[] args) {
> S2Container container = S2ContainerFactory.create(PATH);
> Hoge hoge = (Hoge) container.getComponent(Hoge.class);
> HogeDao dao = (HogeDao) container.getComponent(HogeDao.class);
> hoge.setName("beer");
> dao.insert(hoge);
> hoge.setName("wine");
> dao.insert(hoge);
> System.out.println(hoge.getId());
> }
> }
>
> *設定ファイル
> **アプリケーション大根 (trial.dicon)
> <?xml version="1.0" encoding="Shift_JIS"?>
> <!DOCTYPE components PUBLIC
> "-//SEASAR//DTD S2Container 2.3//EN"
> "http://www.seasar.org/dtd/components23.dtd">
> <components>
> <include path="j2ee.dicon"/>
> <include path="dao.dicon"/>
> <component name="hoge" class="com.example.Hoge"/>
> <component name="hogedao" class="com.example.HogeDao">
> <aspect>j2ee.requiredTx</aspect>
> <aspect>dao.interceptor</aspect>
> </component>
> </components>
>
> **J2EE大根 (j2ee.dicon)
> <?xml version="1.0" encoding="Shift_JIS"?>
> <!DOCTYPE components PUBLIC "-//SEASAR2.1//DTD S2Container//EN"
> "http://www.seasar.org/dtd/components21.dtd">
> <components namespace="j2ee">
> <component name="transactionManager"
> class="org.seasar.extension.jta.TransactionManagerImpl"/>
> <component name="requiredTx"
> class="org.seasar.extension.tx.RequiredInterceptor"/>
> <component name="requiresNewTx"
> class="org.seasar.extension.tx.RequiresNewInterceptor"/>
> <component name="mandatoryTx"
> class="org.seasar.extension.tx.MandatoryInterceptor"/>
> <component name="notSupportedTx"
> class="org.seasar.extension.tx.NotSupportedInterceptor"/>
>
> <component class="org.seasar.extension.jdbc.impl.BasicResultSetFactory"/>
> <component class="org.seasar.extension.jdbc.impl.BasicStatementFactory"/>
>
> <component name="xaDataSource"
> class="org.seasar.extension.dbcp.impl.XADataSourceImpl">
> <property name="driverClassName">
> "com.mysql.jdbc.Driver"
> </property>
> <property name="URL">
> "jdbc:mysql://localhost/fugadb"
> </property>
> <property name="user">"me"</property>
> <property name="password">"mine"</property>
> </component>
>
> <component name="connectionPool"
> class="org.seasar.extension.dbcp.impl.ConnectionPoolImpl">
> <property name="timeout">600</property>
> <property name="maxPoolSize">10</property>
> <!-- JTAトランザクションが開始されていない場合にコネクションを
> 取得できないようにするには次のプロパティをfalseにしてください.-->
> <property name="allowLocalTx">true</property>
> <destroyMethod name="close"/>
> </component>
> <component name="dataSource"
> class="org.seasar.extension.dbcp.impl.DataSourceImpl"/>
> </components>
>
> **dao大根 (dao.dicon)
> <?xml version="1.0" encoding="Shift_JIS"?>
> <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container//EN"
> "http://www.seasar.org/dtd/components.dtd">
> <components namespace="dao">
> <include path="j2ee.dicon"/>
> <component
> class="org.seasar.dao.impl.FieldAnnotationReaderFactory"/>
> <component
> class="org.seasar.dao.impl.DaoMetaDataFactoryImpl"/>
> <component name="interceptor"
> class="org.seasar.dao.interceptors.S2DaoInterceptor"/>
> </components>
>
> **ひとこと
> なお、dicon毎にDTDが違いますがこれは単に手持ちのものを使いまわしてい
> ることからこうなったもので、特に意味はありません。
>
> *データベース
> **テーブル定義
> create table hoge
> (
> id int not null auto_increment,
> name varchar(50) not null,
> primary key(id)
> );
>
> *実行結果
> ** テーブル内容
> mysql> select * from hoge;
> +----+------+
> | id | name |
> +----+------+
> | 1 | beer |
> | 2 | wine |
> +----+------+
> 2 rows in set (0.00 sec)
>
> ** ログと標準出力
> [main] トランザクションを開始しました
> [main] 物理的なコネクションを取得しました
> [main] 論理的なコネクションを取得しました
> [main] 論理的なコネクションを閉じました
> [main] 論理的なコネクションを取得しました
> [main] INSERT INTO HOGE (name) VALUES ('beer')
> [main] SELECT LAST_INSERT_ID()
> [main] 論理的なコネクションを取得しました
> [main] 論理的なコネクションを閉じました
> [main] 論理的なコネクションを閉じました
> [main] トランザクションをコミットしました
> [main] トランザクションを開始しました
> [main] 論理的なコネクションを取得しました
> [main] INSERT INTO HOGE (name) VALUES ('wine')
> [main] SELECT LAST_INSERT_ID()
> [main] 論理的なコネクションを取得しました
> [main] 論理的なコネクションを閉じました
> [main] 論理的なコネクションを閉じました
> [main] トランザクションをコミットしました
> 2
>
> *まとめ
> IDの取得に成功している(ように見える)。
> --
> G.
> _______________________________________________
> Seasar-user mailing list
> [E-MAIL ADDRESS DELETED]
> https://www.seasar.org/mailman/listinfo/seasar-user
Seasar-user メーリングリストの案内