【发布时间】:2018-02-15 05:55:52
【问题描述】:
我的项目使用的是 Spring MVC4、Hibernate 5。我已经使用 Advice Interceptor 配置了休眠事务,但它并没有按我的意愿回滚。请帮助我,我的配置有什么问题?
我所有的代码如下: 1。休眠配置:
@Configuration
@EnableTransactionManagement
public class DataSourceConfiguration {
@Autowired
private Environment env;
@Bean
public LocalSessionFactoryBean sessionFactory() {
LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
sessionFactory.setDataSource(dataSource());
sessionFactory.setPackagesToScan(
new String[] {env.getProperty("spring.hibernate.packagesToScan")});
sessionFactory.setHibernateProperties(hibernateProperties());
return sessionFactory;
}
@Bean
public DataSource dataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName(env.getProperty("spring.datasource.driver-class-name"));
dataSource.setUrl(env.getProperty("spring.datasource.url"));
dataSource.setUsername(env.getProperty("spring.datasource.username"));
dataSource.setPassword(env.getProperty("spring.datasource.password"));
return dataSource;
}
@Bean
@Autowired
public HibernateTransactionManager transactionManager(SessionFactory sessionFactory) {
HibernateTransactionManager txManager = new HibernateTransactionManager();
txManager.setSessionFactory(sessionFactory);
return txManager;
}
@Bean
public PersistenceExceptionTranslationPostProcessor exceptionTranslation() {
return new PersistenceExceptionTranslationPostProcessor();
}
}
-
Spring 建议拦截器:
@Aspect @配置 公共类 TxAdviceInterceptor {
private static final String TX_METHOD_NAME = "*"; @Value(value = "${tx-advice.timeout:-1}") private Integer txMethodTimeout = -1; private static final String AOP_POINTCUT_EXPRESSION = "execution(* com.ptg.service..*.*(..))"; @Autowired private PlatformTransactionManager transactionManager; @Bean public TransactionInterceptor txAdvice() { MatchAlwaysTransactionAttributeSource source = new MatchAlwaysTransactionAttributeSource(); RuleBasedTransactionAttribute transactionAttribute = new RuleBasedTransactionAttribute(); transactionAttribute.setName(TX_METHOD_NAME); transactionAttribute.setRollbackRules( Collections.singletonList(new RollbackRuleAttribute(Exception.class))); transactionAttribute.setTimeout(txMethodTimeout); source.setTransactionAttribute(transactionAttribute); return new TransactionInterceptor(transactionManager, source); } @Bean public Advisor txAdviceAdvisor() { AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut(); pointcut.setExpression(AOP_POINTCUT_EXPRESSION); return new DefaultPointcutAdvisor(pointcut, txAdvice()); }}
-
道:
@Repository 公共抽象类 GenericDaoImpl{
@Autowired private SessionFactory sessionFactory; @Override public void S save(S entity) { sessionFactory.save(entity); }}
DaoImpl:
@Repository
public class TagDaoImpl extends GenericDaoImpl{
}
@Repository
public class PostDaoImpl extends GenericDaoImpl{
}
-
服务:
@服务 公共类 PostServiceImpl{
@Autowired private PostDao postDao; @Autowired private TagDao tagDao; public void merge(Post post){ tagDao.save(); postDao.save(); }}
如上代码,我想如果postDao.save出错,tagDao也是回滚。
【问题讨论】:
-
您打算如何处理服务方法的事务可能需要不同传播或隔离级别的情况?如果服务方法不强制要求事务的必要性,该怎么办。请注意,在此处使用
"*"可能会很糟糕。
标签: spring hibernate spring-transactions