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