12.4.4. 事务管理
将事务管理纳入到Service操作的执行中,你可以使用Spring通用的声明式的事务管理功能,参加下面的例子:
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
注意,TopLink要求你必须在一个活跃的 工作单元(UnitOfWork)
中修改一个持久化对象(你通常不能修改由普通的TopLink的 Session
查询返回的对象,因为这些对象通常是一些从二级缓存中读出的只读对象)。与Hibernate相比,
在TopLink中并没有一种类似脱离事务刷出(non-transactional flush)的概念。基于这
种原因,TopLink需要被建立在特定的环境中,尤其是它需要为JTA同步做明确的创建,由此来
自行检测一个JTA事务以及暴露一个相应的活跃的 Session
和 UnitOfWork。这一点对于本地事务不是必要的,由于它已经被
Spring的 TopLinkTransactionManager 处理,但是对于
需要参与到JTA事务中的情况,是必须的(无论是由Spring的
JtaTransactionManager、EJB CMT或者普通的JTA所驱动的事务)。
在你的基于TopLink的DAO代码中,你可以使用 Session.getActiveUnitOfWork()
方法来访问当前的 UnitOfWork 并通过它来执行写操作。这将只在一个活跃的事务中有效
(在一个收到Spring管理的事务或者JTA事务中)。对于特殊的需求,你同样可以获取单独的
UnitOfWork 实例,它将不参与到当前的事务中去,不过这种情况非常少。
TopLinkTransactionManager 能够将一个TopLink事务暴露给
访问相同的JDBC DataSource 的JDBC访问代码。
前提条件是,TopLink在底层是以JDBC方式工作的并且能够暴露底层的JDBC Connection。
这种情况下,用于暴露事务的 DataSource 必须被明确指定,
它是无法被自动检测到的。