Hibernate/Springを使ってトランザクション処理を記述する
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
// 下階層用テンプレート
#topicpath
----
//ここにコンテンツを記述します。
#contents
**Hibernateとトランザクション管理に関する課題 [#f22766f1]
HibernateベースのDAOを作った場合に、トランザクション処理...
たとえば下記のような二つのテーブル
#ref(schema.png)
に対してそれぞれMemberDAOとWorkGroupDAOを作ると思います。...
#ref(bl.png)
なんてのが定義されると思います。
このとき、ある処理の場合はメソッド単位でトランザクション...
-addMemberはMemberを登録する
-addGroupはWorkGroupを登録する
-addはMemberをGroupに追加する。引数のメンバーがいなかった...
とした場合、
-メンバーを登録しようとしてaddMemberを呼び出した場合は、a...
-add内でサブルーチン(<-古っ)としてaddMemberが呼ばれる場合...
となります。一つめの例だとaddMember内でトランザクションの...
**実際にやってみる [#k1c52e83]
この辺を考えるために具体例で行きます。今回考えるクラス群...
UserBL->UserDao->データベース
という構成になっていて、UserBLのトランザクション指定をど...
#ref(before.png)
対応するテーブルは以下の通り作成しました。
create table MKINO.USER_ATTR (
USERID varchar2(100) not null,
NAME varchar2(1000), primary key (USERID)
);
確認してみます。
-bash-3.00$ sqlplus mkino/xxxx
SQL*Plus: Release 10.2.0.1.0 - Production on 木 5月 3 21...
Copyright (c) 1982, 2005, Oracle. All rights reserved.
Oracle Database 10g Express Edition Release 10.2.0.1.0 -...
に接続されました。
SQL> desc user_attr;
名前 NULL? 型
----------------------------------------- -------- ----...
USERID NOT NULL VARC...
NAME VARC...
SQL>
OKです。ちなみにこの辺のユーザは以下のように作ってます。...
-bash-3.00$ . /usr/lib/oracle/xe/app/oracle/product/10.2...
-bash-3.00$ sqlplus / as sysdba
Oracle Database 10g Express Edition Release 10.2.0.1.0 -...
に接続されました。
SQL> CREATE USER "MKINO" PROFILE "DEFAULT"
IDENTIFIED BY "xxxx" DEFAULT TABLESPACE "USERS"
TEMPORARY TABLESPACE "TEMP"
QUOTA UNLIMITED
ON "USERS"
ACCOUNT UNLOCK; 2 3 4 5 6
ユーザーが作成されました。
SQL> create role MKINO_ROLE;
ロールが作成されました。
SQL> GRANT
CREATE SESSION,
CREATE ANY INDEX,
CREATE ANY VIEW,
CREATE ANY SYNONYM,
CREATE ANY SEQUENCE,
CREATE ANY TABLE,
SELECT ANY TABLE,
INSERT ANY TABLE,
UPDATE ANY TABLE,
DELETE ANY TABLE
TO MKINO_ROLE; 2 3 4 5 6 7 8 9 ...
権限付与が成功しました。
SQL>
GRANT MKINO_ROLE TO MKINO;
SQL>
権限付与が成功しました。
SQL>
SQL> quit
Oracle Database 10g Express Edition Release 10.2.0.1.0 -...
-bash-3.00$
**Springを使ってトランザクション処理を記述する [#u9d330a3]
さて、SpringではBLのビジネスメソッドに対してトランザクシ...
まず、もとのBLの名前をuserBLからuserBLTargetに変更し、use...
そのProxyのタグ付けですが、トランザクション設定や、ターゲ...
さて処理の流れですが、実際BLを使うプログラムはuserBLとい...
BLを使うプログラム -> userBL
だったのが
BLを使うプログラム -> userBL -> userBLTarget
となります。
外部から見たら見た目は同じだけど、実際のBLの間に別のクラ...
#ref(bean.png)
間に挟まれたPOJOは以下のようにSpringでInjectionされていま...
<bean id="userBL"
class="org.springframework.transaction.interceptor.Tra...
<property name="transactionManager">
<ref local="transactionManager" />
</property>
<property name="target"> ↓ターゲットにするPOJOを指定
<ref bean="userBLTarget" />
</property>
<property name="transactionAttributes">
<props> ↓POJOのメソッドに対してトランザクションの...
<prop key="*">PROPAGATION_REQUIRED</prop>
<!-- <prop key="create">PROPAGATION_MANDATORY</pro...
</props>
</property>
</bean>
**トランザクション管理方法について [#l441b95e]
さて使用する側から見えるPOJOですが、もともとはUserBLクラ...
org.springframework.transaction.interceptor.TransactionP...
が挟まれている形となっています。このクラスを経由すること...
<property name="transactionAttributes">
<props> ↓POJOのメソッドに対してトランザクションの...
<prop key="*">PROPAGATION_REQUIRED</prop>
</props>
</property>
となっていて、全てのメソッドをPROPAGATION_REQUIREDにする...
**実際にBLのメソッドを呼び出してみる [#jff31b0d]
実際にやってみます。Spring経由でBLを取得し、BLのcreateメ...
public class SpringMain {
public static void main(String[] args) throws IOExcept...
DOMConfigurator.configure("log4j.xml");
ApplicationContext context = new FileSystemXmlApplic...
new String[] { "beans.xml", "hibernate-spring_te...
String name = getUniqueKey();
IUserBL bl = (IUserBL) context.getBean("userBL");
bl.create(new UserAttr(name, "サンプルユーザ1"));
}
/**
* PKを生成したいだけ。本質的な意味ナシ
*/
private static String getUniqueKey() throws IOExceptio...
File temp = File.createTempFile("abc", "");
temp.deleteOnExit();
String name = temp.getName();
return name;
}
}
実行結果は以下の通り
org.springframework.beans.factory.xml.XmlBeanDefinitionR...
definitions from file [T:\workspace_rad\SpringDBSample...
org.springframework.beans.factory.xml.XmlBeanDefinitionR...
definitions from file [T:\workspace_rad\SpringDBSample...
org.springframework.orm.hibernate3.LocalSessionFactoryBe...
org.hibernate.cfg.SettingsFactory - RDBMS: Oracle, versi...
Express Edition Release 10.2.0.1.0 - Production
org.hibernate.cfg.SettingsFactory - JDBC driver: Oracle ...
org.hibernate.dialect.Dialect - Using dialect: org.hiber...
org.hibernate.transaction.TransactionFactoryFactory - Us...
org.hibernate.transaction.TransactionManagerLookupFactor...
configured (in JTA environment, use of read-write or t...
org.springframework.orm.hibernate3.HibernateTransactionM...
[org.apache.commons.dbcp.BasicDataSource@6e1dec] of Hi...
org.springframework.orm.hibernate3.HibernateTransactionM...
object [org.springframework.orm.hibernate3.HibernateTr...
org.springframework.orm.hibernate3.HibernateTransactionM...
transaction with name [nu.mine.kino.bl.IUserBL.create]
org.springframework.orm.hibernate3.HibernateTransactionM...
Session [org.hibernate.impl.SessionImpl@e29820] for Hi...
org.springframework.orm.hibernate3.HibernateTransactionM...
Connection of Hibernate Session [org.hibernate.impl.Se...
-----------------------------afterTransactionBegin
org.springframework.orm.hibernate3.HibernateTransactionM...
as JDBC transaction [org.apache.commons.dbcp.PoolableC...
nu.mine.kino.bl.UserBL - create(UserAttr) - start
nu.mine.kino.bl.UserBL - create(UserAttr) - end
org.springframework.orm.hibernate3.HibernateTransactionM...
org.springframework.orm.hibernate3.HibernateTransactionM...
org.springframework.orm.hibernate3.HibernateTransactionM...
org.springframework.orm.hibernate3.HibernateTransactionM...
on Session [org.hibernate.impl.SessionImpl@e29820]
Hibernate: insert into MKINO.USER_ATTR (NAME, USERID) va...
-----------------------------beforeTransactionCompletion
-----------------------------afterTransactionCompletion
org.springframework.orm.hibernate3.HibernateTransactionM...
org.springframework.orm.hibernate3.HibernateTransactionM...
Session [org.hibernate.impl.SessionImpl@e29820] after t...
org.springframework.orm.hibernate3.SessionFactoryUtils -...
なんのこっちゃって感じですけど、BLのメソッドが開始される...
***Runtime例外時は勝手にロールバック [#fdb59941]
次にメソッド内でわざとRuntime例外をスローした場合のログで...
nu.mine.kino.bl.UserBL - create(UserAttr) - start
org.springframework.orm.hibernate3.HibernateTransactionM...
org.springframework.orm.hibernate3.HibernateTransactionM...
org.springframework.orm.hibernate3.HibernateTransactionM...
transaction on Session [org.hibernate.impl.SessionImpl...
Exception in thread "main" java.lang.RuntimeException: ...
-----------------------------afterTransactionCompletion
org.springframework.orm.hibernate3.HibernateTransactionM...
org.springframework.orm.hibernate3.HibernateTransactionM...
Session [org.hibernate.impl.SessionImpl@e29820] after ...
org.springframework.orm.hibernate3.SessionFactoryUtils -...
Springが正しくロールバックしてくれています。自分たちでや...
ちなみにSpringではRuntime例外はロールバック、その他の普通...
***その他のトランザクション指定 [#ud816cca]
先のPROPAGATION_REQUIREDはあったらトランザクションに参加...
PROPAGATION_MANDATORYでしょうか。これは、すでに開始されて...
やってみます。先のxmlの指定に
<property name="transactionAttributes">
<props> ↓POJOのメソッドに対してトランザクションの...
<prop key="*">PROPAGATION_REQUIRED</prop>
<prop key="create">PROPAGATION_MANDATORY</prop>
↑createというメソッドだけは、PROPAGATION_MA...
</props>
</property>
を追加してやってみます。
Exception in thread "main" org.springframework.transacti...
Transaction propagation 'mandatory' but no existing ...
という例外がスローされました。
***トランザクション指定をしない場合は、、? [#f6054f49]
最後に
<property name="transactionAttributes">
<props>
</props>
</property>
などとしてトランザクション指定をしなかった場合はどうなる...
nu.mine.kino.bl.UserBL - create(UserAttr) - start
org.springframework.orm.hibernate3.SessionFactoryUtils -...
-----------------------------onSave
-----------------------------preFlush
Hibernate: insert into MKINO.USER_ATTR (NAME, USERID) va...
-----------------------------postFlush
org.springframework.orm.hibernate3.SessionFactoryUtils -...
nu.mine.kino.bl.UserBL - create(UserAttr) - end
当たり前ですが、トランザクションが開始されないで処理がな...
**関連情報 [#m25830b0]
-[[ソースコードへのリンク>http://www.masatom.in/cgi-bin/v...
-[[トランザクション管理Spring Framework-TECHSCORE->http:/...
----
この記事は
#vote(おもしろかった[53],そうでもない[22])
#comment
#topicpath
SIZE(10){現在のアクセス:&counter;}
終了行:
// 下階層用テンプレート
#topicpath
----
//ここにコンテンツを記述します。
#contents
**Hibernateとトランザクション管理に関する課題 [#f22766f1]
HibernateベースのDAOを作った場合に、トランザクション処理...
たとえば下記のような二つのテーブル
#ref(schema.png)
に対してそれぞれMemberDAOとWorkGroupDAOを作ると思います。...
#ref(bl.png)
なんてのが定義されると思います。
このとき、ある処理の場合はメソッド単位でトランザクション...
-addMemberはMemberを登録する
-addGroupはWorkGroupを登録する
-addはMemberをGroupに追加する。引数のメンバーがいなかった...
とした場合、
-メンバーを登録しようとしてaddMemberを呼び出した場合は、a...
-add内でサブルーチン(<-古っ)としてaddMemberが呼ばれる場合...
となります。一つめの例だとaddMember内でトランザクションの...
**実際にやってみる [#k1c52e83]
この辺を考えるために具体例で行きます。今回考えるクラス群...
UserBL->UserDao->データベース
という構成になっていて、UserBLのトランザクション指定をど...
#ref(before.png)
対応するテーブルは以下の通り作成しました。
create table MKINO.USER_ATTR (
USERID varchar2(100) not null,
NAME varchar2(1000), primary key (USERID)
);
確認してみます。
-bash-3.00$ sqlplus mkino/xxxx
SQL*Plus: Release 10.2.0.1.0 - Production on 木 5月 3 21...
Copyright (c) 1982, 2005, Oracle. All rights reserved.
Oracle Database 10g Express Edition Release 10.2.0.1.0 -...
に接続されました。
SQL> desc user_attr;
名前 NULL? 型
----------------------------------------- -------- ----...
USERID NOT NULL VARC...
NAME VARC...
SQL>
OKです。ちなみにこの辺のユーザは以下のように作ってます。...
-bash-3.00$ . /usr/lib/oracle/xe/app/oracle/product/10.2...
-bash-3.00$ sqlplus / as sysdba
Oracle Database 10g Express Edition Release 10.2.0.1.0 -...
に接続されました。
SQL> CREATE USER "MKINO" PROFILE "DEFAULT"
IDENTIFIED BY "xxxx" DEFAULT TABLESPACE "USERS"
TEMPORARY TABLESPACE "TEMP"
QUOTA UNLIMITED
ON "USERS"
ACCOUNT UNLOCK; 2 3 4 5 6
ユーザーが作成されました。
SQL> create role MKINO_ROLE;
ロールが作成されました。
SQL> GRANT
CREATE SESSION,
CREATE ANY INDEX,
CREATE ANY VIEW,
CREATE ANY SYNONYM,
CREATE ANY SEQUENCE,
CREATE ANY TABLE,
SELECT ANY TABLE,
INSERT ANY TABLE,
UPDATE ANY TABLE,
DELETE ANY TABLE
TO MKINO_ROLE; 2 3 4 5 6 7 8 9 ...
権限付与が成功しました。
SQL>
GRANT MKINO_ROLE TO MKINO;
SQL>
権限付与が成功しました。
SQL>
SQL> quit
Oracle Database 10g Express Edition Release 10.2.0.1.0 -...
-bash-3.00$
**Springを使ってトランザクション処理を記述する [#u9d330a3]
さて、SpringではBLのビジネスメソッドに対してトランザクシ...
まず、もとのBLの名前をuserBLからuserBLTargetに変更し、use...
そのProxyのタグ付けですが、トランザクション設定や、ターゲ...
さて処理の流れですが、実際BLを使うプログラムはuserBLとい...
BLを使うプログラム -> userBL
だったのが
BLを使うプログラム -> userBL -> userBLTarget
となります。
外部から見たら見た目は同じだけど、実際のBLの間に別のクラ...
#ref(bean.png)
間に挟まれたPOJOは以下のようにSpringでInjectionされていま...
<bean id="userBL"
class="org.springframework.transaction.interceptor.Tra...
<property name="transactionManager">
<ref local="transactionManager" />
</property>
<property name="target"> ↓ターゲットにするPOJOを指定
<ref bean="userBLTarget" />
</property>
<property name="transactionAttributes">
<props> ↓POJOのメソッドに対してトランザクションの...
<prop key="*">PROPAGATION_REQUIRED</prop>
<!-- <prop key="create">PROPAGATION_MANDATORY</pro...
</props>
</property>
</bean>
**トランザクション管理方法について [#l441b95e]
さて使用する側から見えるPOJOですが、もともとはUserBLクラ...
org.springframework.transaction.interceptor.TransactionP...
が挟まれている形となっています。このクラスを経由すること...
<property name="transactionAttributes">
<props> ↓POJOのメソッドに対してトランザクションの...
<prop key="*">PROPAGATION_REQUIRED</prop>
</props>
</property>
となっていて、全てのメソッドをPROPAGATION_REQUIREDにする...
**実際にBLのメソッドを呼び出してみる [#jff31b0d]
実際にやってみます。Spring経由でBLを取得し、BLのcreateメ...
public class SpringMain {
public static void main(String[] args) throws IOExcept...
DOMConfigurator.configure("log4j.xml");
ApplicationContext context = new FileSystemXmlApplic...
new String[] { "beans.xml", "hibernate-spring_te...
String name = getUniqueKey();
IUserBL bl = (IUserBL) context.getBean("userBL");
bl.create(new UserAttr(name, "サンプルユーザ1"));
}
/**
* PKを生成したいだけ。本質的な意味ナシ
*/
private static String getUniqueKey() throws IOExceptio...
File temp = File.createTempFile("abc", "");
temp.deleteOnExit();
String name = temp.getName();
return name;
}
}
実行結果は以下の通り
org.springframework.beans.factory.xml.XmlBeanDefinitionR...
definitions from file [T:\workspace_rad\SpringDBSample...
org.springframework.beans.factory.xml.XmlBeanDefinitionR...
definitions from file [T:\workspace_rad\SpringDBSample...
org.springframework.orm.hibernate3.LocalSessionFactoryBe...
org.hibernate.cfg.SettingsFactory - RDBMS: Oracle, versi...
Express Edition Release 10.2.0.1.0 - Production
org.hibernate.cfg.SettingsFactory - JDBC driver: Oracle ...
org.hibernate.dialect.Dialect - Using dialect: org.hiber...
org.hibernate.transaction.TransactionFactoryFactory - Us...
org.hibernate.transaction.TransactionManagerLookupFactor...
configured (in JTA environment, use of read-write or t...
org.springframework.orm.hibernate3.HibernateTransactionM...
[org.apache.commons.dbcp.BasicDataSource@6e1dec] of Hi...
org.springframework.orm.hibernate3.HibernateTransactionM...
object [org.springframework.orm.hibernate3.HibernateTr...
org.springframework.orm.hibernate3.HibernateTransactionM...
transaction with name [nu.mine.kino.bl.IUserBL.create]
org.springframework.orm.hibernate3.HibernateTransactionM...
Session [org.hibernate.impl.SessionImpl@e29820] for Hi...
org.springframework.orm.hibernate3.HibernateTransactionM...
Connection of Hibernate Session [org.hibernate.impl.Se...
-----------------------------afterTransactionBegin
org.springframework.orm.hibernate3.HibernateTransactionM...
as JDBC transaction [org.apache.commons.dbcp.PoolableC...
nu.mine.kino.bl.UserBL - create(UserAttr) - start
nu.mine.kino.bl.UserBL - create(UserAttr) - end
org.springframework.orm.hibernate3.HibernateTransactionM...
org.springframework.orm.hibernate3.HibernateTransactionM...
org.springframework.orm.hibernate3.HibernateTransactionM...
org.springframework.orm.hibernate3.HibernateTransactionM...
on Session [org.hibernate.impl.SessionImpl@e29820]
Hibernate: insert into MKINO.USER_ATTR (NAME, USERID) va...
-----------------------------beforeTransactionCompletion
-----------------------------afterTransactionCompletion
org.springframework.orm.hibernate3.HibernateTransactionM...
org.springframework.orm.hibernate3.HibernateTransactionM...
Session [org.hibernate.impl.SessionImpl@e29820] after t...
org.springframework.orm.hibernate3.SessionFactoryUtils -...
なんのこっちゃって感じですけど、BLのメソッドが開始される...
***Runtime例外時は勝手にロールバック [#fdb59941]
次にメソッド内でわざとRuntime例外をスローした場合のログで...
nu.mine.kino.bl.UserBL - create(UserAttr) - start
org.springframework.orm.hibernate3.HibernateTransactionM...
org.springframework.orm.hibernate3.HibernateTransactionM...
org.springframework.orm.hibernate3.HibernateTransactionM...
transaction on Session [org.hibernate.impl.SessionImpl...
Exception in thread "main" java.lang.RuntimeException: ...
-----------------------------afterTransactionCompletion
org.springframework.orm.hibernate3.HibernateTransactionM...
org.springframework.orm.hibernate3.HibernateTransactionM...
Session [org.hibernate.impl.SessionImpl@e29820] after ...
org.springframework.orm.hibernate3.SessionFactoryUtils -...
Springが正しくロールバックしてくれています。自分たちでや...
ちなみにSpringではRuntime例外はロールバック、その他の普通...
***その他のトランザクション指定 [#ud816cca]
先のPROPAGATION_REQUIREDはあったらトランザクションに参加...
PROPAGATION_MANDATORYでしょうか。これは、すでに開始されて...
やってみます。先のxmlの指定に
<property name="transactionAttributes">
<props> ↓POJOのメソッドに対してトランザクションの...
<prop key="*">PROPAGATION_REQUIRED</prop>
<prop key="create">PROPAGATION_MANDATORY</prop>
↑createというメソッドだけは、PROPAGATION_MA...
</props>
</property>
を追加してやってみます。
Exception in thread "main" org.springframework.transacti...
Transaction propagation 'mandatory' but no existing ...
という例外がスローされました。
***トランザクション指定をしない場合は、、? [#f6054f49]
最後に
<property name="transactionAttributes">
<props>
</props>
</property>
などとしてトランザクション指定をしなかった場合はどうなる...
nu.mine.kino.bl.UserBL - create(UserAttr) - start
org.springframework.orm.hibernate3.SessionFactoryUtils -...
-----------------------------onSave
-----------------------------preFlush
Hibernate: insert into MKINO.USER_ATTR (NAME, USERID) va...
-----------------------------postFlush
org.springframework.orm.hibernate3.SessionFactoryUtils -...
nu.mine.kino.bl.UserBL - create(UserAttr) - end
当たり前ですが、トランザクションが開始されないで処理がな...
**関連情報 [#m25830b0]
-[[ソースコードへのリンク>http://www.masatom.in/cgi-bin/v...
-[[トランザクション管理Spring Framework-TECHSCORE->http:/...
----
この記事は
#vote(おもしろかった[53],そうでもない[22])
#comment
#topicpath
SIZE(10){現在のアクセス:&counter;}
ページ名: