[Seasar-user:3439] Re: S2Dao+MySQLでIDアノテーションが設定できない

G [E-MAIL ADDRESS DELETED]
2006年 3月 29日 (水) 03:49:46 JST


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