編程式的事務管理
另外,編程式事務提供了TransactionTemplate 模板類,該類可以大大減少事務操作的代碼。因此TransactionTemplate 采用Callback 避免讓開發者重復書寫其打開事務、提交事務及回滾事務等代碼,同時TransactionTemplate 無須書寫大量的try..catch 塊。
HibernateTemplate 必須提供PlatformTransactionManager 實例。該實例既可以在代碼中手動設置,也可以使用Spring 的依賴注入。總之,只要獲取了PlatformTransactionManager 引用, TransactionTemplate 就可以完成事務操作。
使用TransactionTemplate 不需要顯式地開始事務,甚至不需要顯式地提交事務。這些步驟都由模板完成。但出現異常時,應通過TransactionStatus 的setRollbackOnly 顯式回滾事務。
TransactionTemplate 的execute 方法接收一個TransactionCallback 實例。Callback 也是Spring 的經典設計,用于簡化用戶操作, TransactionCallback 包含如下方法。
? Object dolnTransaction(TransactionStatus status) 。
該方法的方法體就是事務的執行體。
如果事務的執行體沒有返回值,則可以使用TransactionCallbackWithoutResultl類的實例。這是個抽象類,不能直接實例化,只能用于創建匿名內部類。它也是TransactionCallback 接口的子接口,該抽象類包含一個抽象方法:
? void dolnTransactionWithoutResult(TransactionStatus status)該方法與dolnTransaction 的效果非常相似,區別在于該方法沒有返回值,即事務執行體無須返回值。
在下面的示例中, PlatformTransactionManager 實例采用適用于Hibernate 的事務管理器來實現類HibernateTransactionManager,該實現類是個局部事務管理器,容器中僅僅部署了該事務管理器bean ,因此應在代碼中于動為TransactionTemplate 注入事務管理器bean。下面是Hibernate 局部事務管理的配置文件的源代碼:?
<?
xml?version="1.0"?encoding="gb2312"
?>
<!
?--?Spring?配置文件的DTD?定義--
>
<!
DOCTYPE?beans?PUBL工C?"-//SPRING//DTD?BEAN//EN"
''http://www.springfrarnework.org/dtd/sp工rng-beans.dtd"
>
<!--
?Spring?配置文件的根元素是beans
-->
????
<
beans
>
????????
<!--
定義數據源,該bean?的ID?為dataSource-→
????????<bean?id="dataSource"?class="org.springfrarnework.jdbc.datasource.DriverManagerDataSource">
????????????<!--?指定數據庫驅動
-->
????????????
<
property?
narne
="driverClassNarne"
><
value
>
corn.rnysql.jdbc.Driver
</
value
></
property
>
????????????
<!--
?指定連接數據庫的URL
-->
????????????
<
property?
narne
="url"
><
value
>
jdbc:rnysql://wonder:3306/j2ee
</
value
></
property
>
????????????
<!--
root?為數據庫的用戶名
-->
????????????
<
property?
name
="username"
><
value
>
root
</
value
></
property
>
????????????
<!--
?pass?為數據庫密碼
-->
????????????
<
property?
name
="password"
><
value
>
pass
</
value
></
property
>
????????
</
bean
>
????????
<!--
定義Hibernate?的SessionFactory
-->
????????
<
bean?
id
="sessionFactory"
?class
="org.springframework.orm.hibernate3.LocalSessionFactoryBean"
>
????????????
<!--
依賴注入數據源,注入上文定義的dataSource
-->
????????????
<
property?
name
="dataSource"
><
ref?
local
="dataSource"
/></
property
>
????????????
<!--
mappingResouces屬性用來列出全部映射文件>
????????????<property?name="mappingResources">
????????????????<list>
????????????????????<!--以下用來列出所有的PO?映射文件
-->
????????????????????
<
value
>
lee/MyTest.hbm.xml
</
value
>
????????????????
</
list
>
????????????
</
property
>
????????
<!--
定義Hibernate?的SessionFactory的屬性
-->
????
????????????
<
property?
name
="hibernateProperties"
>
????????????????
<
props
>
????????????????????
<!--
?指定Hibernate?的連接方法
-->
????????????????????
<
prop?
key
="hibernate.dialect"
>
org.hibernate.dialect.MySQLDialect
</
prop
>
????????????????????
<!
?不同數據庫連接,啟動時選擇create?,?update?,?create-drop--
>
????????????????????
<
prop?
key
="hibernate.hbm2ddl.auto"
>
update
</
prop
>
????????????????
</
props
>
????????????
</
property
>
????????
</
bean
>
????????
<!--
配置Hibernate?的事務管理器一〉
????????<!--使用HibernateTransactionManager類,該類是PlatformTransactionManager?接口針對采用Hibernate持久化連接的特定實現。
-->
????????
<
bean?
id
="transactionManager"
????????class
="org.springframework.orm.hibernate3.HibernateTransactionManager"
>
????????
<!--
HibernateTransactionManager?bean?需要依賴注入一個SessionFactory?bean?的引用
-->
????????????
<
property?
name
="sessionFactory"
>
????????????????
<
ref?
local
="sessionFactory"
/>
????????????
</
property
>
????????
</
bean
>
</
beans
>
public
?
class
?TransactionTest
...
{
public
?
static
?
void
?main(String[]?args)
...
{
????
//
因為并未在web?應用中測試,故需要手動創建Spring?的上下文
????
final
?ApplicationContext?ctx?
=
?
new
?FileSystemXrnlApplicationContext(
"
bean.xml
"
);
????
//
獲得Spring?上下文的事務管理器
????PlatformTransactionManager?transactionManager
=
(PlatformTransactionManager)ctx.getBean(
"
transactionManager
"
);
????
final
?SessionFactory?sessionFactory?
=
????(SessionFactory)ctx.getBean(
"
sessionFactory
"
);
????
//
以事務管理器實例為參數,創建TransactionTemplate對象
????TransactionTemplate?tt?
=
?
new
?TransactionTemplate(transactionManager);
????
//
設置TransactionTemplate的事務傳播屬性
????tt.?setPropagationBehavior?(TransactionDefinition.PROPAGATION_REQUlRED);
????
//
執行TransactionTemplate的execute方法,該方法需要TransactionCallback實例
????tt.execute(
new
?TransactionCallbackWithoutResult()
????
//
采用TransactionCallbackWithoutResult匿名內部類的形式執行
????protectedvoid?dolnTransactionWithoutResult(TransactionStatus?ts)
????
try
????
...
{
????????
//
以SessionFactory?實例為參數創建HibernateTemplate
????????HibernateTemplate?hibernateTemplate?
=
????????
new
?HibernateTemplate(sessionFactory);
????????MyTestpl?
=
丑ew?MyTest?(
"
Jack
"
);
????????
//
保存第一個實例
????????hibernateTemplate.save(pl);
????????
//
讓下面的數據庫操作拋出異常即可看出事務效果。前面的操作也
????????
//
不會生效
????????MyTestp2?
=
?
new
?MyTest?(
"
Jack
"
);
????????
//
保存第二個實例,可將Person?的name?屬性設為標識屬性,并
????????
//
引起主鍵重復的異常,可看出前一條記錄也不會加入數據庫中
????????hibernateTemplate.save(p2);
????}
????
catch
?(Exception?e)
????
...
{
????????ts.setRollbackOnly();
????????}
????????}
????????}
);
????????}
????????}
另外,編程式事務提供了TransactionTemplate 模板類,該類可以大大減少事務操作的代碼。因此TransactionTemplate 采用Callback 避免讓開發者重復書寫其打開事務、提交事務及回滾事務等代碼,同時TransactionTemplate 無須書寫大量的try..catch 塊。
HibernateTemplate 必須提供PlatformTransactionManager 實例。該實例既可以在代碼中手動設置,也可以使用Spring 的依賴注入。總之,只要獲取了PlatformTransactionManager 引用, TransactionTemplate 就可以完成事務操作。
使用TransactionTemplate 不需要顯式地開始事務,甚至不需要顯式地提交事務。這些步驟都由模板完成。但出現異常時,應通過TransactionStatus 的setRollbackOnly 顯式回滾事務。
TransactionTemplate 的execute 方法接收一個TransactionCallback 實例。Callback 也是Spring 的經典設計,用于簡化用戶操作, TransactionCallback 包含如下方法。
? Object dolnTransaction(TransactionStatus status) 。
該方法的方法體就是事務的執行體。
如果事務的執行體沒有返回值,則可以使用TransactionCallbackWithoutResultl類的實例。這是個抽象類,不能直接實例化,只能用于創建匿名內部類。它也是TransactionCallback 接口的子接口,該抽象類包含一個抽象方法:
? void dolnTransactionWithoutResult(TransactionStatus status)該方法與dolnTransaction 的效果非常相似,區別在于該方法沒有返回值,即事務執行體無須返回值。
在下面的示例中, PlatformTransactionManager 實例采用適用于Hibernate 的事務管理器來實現類HibernateTransactionManager,該實現類是個局部事務管理器,容器中僅僅部署了該事務管理器bean ,因此應在代碼中于動為TransactionTemplate 注入事務管理器bean。下面是Hibernate 局部事務管理的配置文件的源代碼:?















































?
下面是采用TransactionTemplate和HibemateTemplate的事務操作代碼:












































更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
