Jos*_*zka 11 java spring hibernate transactions
我需要在事务成功或回滚后调用一些方法.我用的是
<bean name="openSessionInViewInterceptor" class="org.springframework.orm.hibernate3.support.OpenSessionInViewInterceptor">
<property name="sessionFactory">
<ref local="mysessionFactory"/>
</property>
</bean>
<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="mysessionFactory"/>
</property>
</bean>
<tx:annotation-driven transaction-manager="txManager" proxy-target-class="true"/>
Run Code Online (Sandbox Code Playgroud)
应用程序使用一些外部Web服务,当内部事务被回滚时需要"清理".有没有办法如何在不使用声明式事务管理的情况下实现此目的.
Jos*_*tin 25
从休眠状态,您可以延伸EmptyInterceptor和覆盖
afterTransactionCompletion()方法,并在其注册
SessionFactoryBean或HibernateTransactionManager.
从Spring开始,您可以在适当的时候扩展TransactionSynchronizationAdapter和覆盖afterCompletion()并注册
TransactionSynchronizationManager#registerSynchronization().
编辑
使用Spring Aop向所有使用注释的方法添加同步的示例 @Transactional
@Aspect
class TransactionAspect extends TransactionSynchronizationAdapter {
@Before("@annotation(org.springframework.transaction.annotation.Transactional)")
public void registerTransactionSyncrhonization() {
TransactionSynchronizationManager.registerSynchronization(this);
}
@Override
public void afterCompletion(int status) {
// code
}
}
Run Code Online (Sandbox Code Playgroud)
Ala*_*Hay 18
Spring有各种各样的课程可能会引起关注:
这里有一些示例代码:
http://azagorneanu.blogspot.co.uk/2013/06/transaction-synchronization-callbacks.html
Spring 4.2中引入的事件处理基础结构使这更加简单.
看到:
另一种流行的改进是将事件的监听器绑定到事务阶段的能力.典型示例是在事务成功完成时处理事件
@Component
public class MyComponent {
@TransactionalEventListener(condition = "#creationEvent.awesome")
public void handleOrderCreatedEvent(CreationEvent<Order> creationEvent) {
...
}
}
Run Code Online (Sandbox Code Playgroud)
@TransactionalEventListener是常规的@EventListener并且还公开了TransactionPhase,默认为AFTER_COMMIT.您还可以挂钩事务的其他阶段(BEFORE_COMMIT,AFTER_ROLLBACK和AFTER_COMPLETION,它们只是AFTER_COMMIT和AFTER_ROLLBACK的别名).
Mic*_*dis 10
使用Spring 4+:不使用全局方面和配置的最简单/最干净的方法是基于我的答案:https://stackoverflow.com/a/43322052/986160
如果@Transactional在成功提交后需要对方法进行回调,只需在方法的开头添加:
@Service
public class OneService {
@Autowired
OneDao dao;
@Transactional
public void a transactionalMethod() {
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter(){
public void afterCommit(){
//do stuff right after commit
System.out.println("commit!!!");
}
});
//do db stuff
dao.save();
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
15877 次 |
| 最近记录: |