Man*_*yas 2 java spring hibernate liferay
下面是我做的,我需要实现回滚,使用@transactional注释,但没有按预期工作,还需要做什么才能正确回滚?我希望在执行代码时,db中的结果应该是"testingOne",目前它被设置为"notRollBacked".你能指出我的错误吗?
public Response deleteUser(Request argVO)throws Exception
{
Users users = UsersLocalServiceUtil.getUsers("sagar");
users.setUserName("testingOne");
UsersLocalServiceUtil.updateUsers(users);
try
{
testRollbackFunction();
}
catch (Exception ex)
{
}
return new Response();
}
@Transactional(isolation = Isolation.PORTAL, rollbackFor =
{PortalException.class, SystemException.class})
private void testRollbackFunction() throws Exception
{
Users users = UsersLocalServiceUtil.getUsers("sagar");
users.setUserName("notRollbacked");
UsersLocalServiceUtil.updateUsers(users);
throw new PortalException();
}
Run Code Online (Sandbox Code Playgroud)
****************编辑1 ************* 我做了答案中提到的内容:
我确实从上下文中获取了bean
并编写了一个类/ bean作为
@Transactional(isolation = Isolation.PORTAL, rollbackFor =
{PortalException.class, SystemException.class})
public class RollBack
{
@Transactional(isolation = Isolation.PORTAL, rollbackFor =
{PortalException.class, SystemException.class})
public void thisWillRollBack() throws Exception
{
Users users = UsersLocalServiceUtil.getUsers("sagar");
users.setBarringReason("notRollbacked");
UsersLocalServiceUtil.updateUsers(users);
throw new PortalException();
}
Run Code Online (Sandbox Code Playgroud)
}
spring xml file bean refrence设置为:
<bean id="rollBackBean" class="com.alepo.RollBack">
</bean>
public Response myMethod(Request argVO)throws Exception
{
Users users = UsersLocalServiceUtil.getUsers("sagar");
users.setBarringReason("testingOne");
UsersLocalServiceUtil.updateUsers(users);
try
{
Test test = new Test();
Object obj = test.getBean();
RollBack rollBack = (RollBack)obj;
rollBack.thisWillRollBack();
}
catch (Exception ex)
{
ex.printStackTrace();
}
return new Response();
}
Run Code Online (Sandbox Code Playgroud)
#################编辑4
现在调用rollback函数为:
RollBack rollBack = (RollBack)PortalBeanLocatorUtil.getBeanLocator().locate("rollBackBean");
rollBack.thisWillRollBack();
Run Code Online (Sandbox Code Playgroud)
现在没有测试类...没有新的任何地方......
还是行不通 .......
如果@Transactional在方法上有注释,Spring会使用处理事务的方面包装对此方法的调用.
所以:
1)只有公共方法可以包含在方面
2)只有在从Spring容器中取出/注入的bean上调用方法时,才调用包装代码.
在你的情况下:
1)代码不包含在事务方面,因为它不是公共方法
2)事件如果是,它是直接从类中调用的,所以你不会再调用包装版本.
因此解决方案是使用@Transactional方法创建单独的bean ,将其注入并从Response类中调用它.
当然,您需要<tx:annotation-driven/>在spring-xml中或指示Spring以其他方式处理@Transactional注释(请参阅参考资料).
| 归档时间: |
|
| 查看次数: |
5715 次 |
| 最近记录: |