我需要在liferay中使用Spring jdbc实现JTA事务管理。我有两个使用jndi在liferay中连接的数据库。在我的项目中,我正在使用jdbc Spring dao进行jdbc CRUD操作,对于Liferay,它是通过liferay内置的服务api。对于任何异常,回滚对于其他数据库都工作正常,但不适用于liferay。
下面是我的代码示例:在portal-ext.prop中,我定义了
transaction.management.impl= <JTATransactionmanager>
在我的项目上下文中.xml tomcat我定义了Liferay网站中提到的用户事务:context.xml
`<Resource name="UserTransaction" auth="Container" type="javax.transaction.UserTransaction" />
<Transaction factory="org.objectweb.jotm.UserTransactionFactory" jotm.timeout="600" /><br>
<Resource auth="Container" type="javax.sql.DataSource" factory="org.objectweb.jotm.datasource.DataSourceFactory" driverClassName="<postgresqldriver>" name="jdbc/LiferayPool" username="root" password="" url="jdbc:mysql://localhost/lportal?useUnicode=true&characterEncoding=UTF-8&useFastDateParsing=false" />}}}<br>
<Resource auth="Container" type="javax.sql.DataSource" factory="org.objectweb.jotm.datasource.DataSourceFactory" driverClassName="<postgresqldriver>" name="jdbc/test" username="root" password="" url="jdbc:mysql://localhost/test?useUnicode=true&characterEncoding=UTF-8&useFastDateParsing=false" />}}}
'在我的项目bean.xml:
<tx:annotation-driven transaction-manager="txManager"/>
<beans:bean id="dbDataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<beans:property name="jndiName" value="java:comp/env/jdbc/test"/>
</beans:bean>
<bean id="txManager" class="org.springframework.transaction.jta.JtaTransactionManager" />
在我的课堂上:
@Transactional(rollback{myexception.class})
public void test()
首先关注这个讨论。
您不会忘记的是,Liferay回滚PortalException或SystemException…但它仅回滚在当前事务上下文中注入的bean。
这意味着不应该使用XLocalServiceUtil,而是使用注入的xLocalServicebean。要获得它,您需要通过service.xml声明或在serviceImpl类中添加并引用以下内容来建议服务层:
@BeanReference(type=XArticleLocalService.class)
protected XArticleLocalService xArticleLocalService;
希望这能帮到你。
我相信您正在使用XXXServiceUtil.java.无论何时使用ServiceUtil,您调用的任何方法都会在不同的事务管理器下执行(无论当前线程事务状态如何),因为它是一个完全不同的类加载器。请记住,在Liferay中,每个portlet/插件都有自己的类加载器。