【问题标题】:Hibernate Transaction Advice in Spring MVCSpring MVC 中的 Hibernate 事务建议
【发布时间】: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();
        }
    }
  1. 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());
    }
    

    }

  2. 道:

    @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{
}
  1. 服务:

    @服务 公共类 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


【解决方案1】:

我发现了问题。我的配置没有错。 问题是“只有未检查的异常(即 java.lang.RuntimeException 的子类)默认回滚。对于这种情况,抛出检查的异常,事务将被提交”。 我用 NullPointerException 错误测试了我的代码,因此事务没有回滚。

参考:https://www.catalysts.cc/wissenswertes/spring-transactional-rollback-on-checked-exceptions/

【讨论】:

    【解决方案2】:

    你试过@Transactional注解吗?

    【讨论】:

    • 我不想在每个服务上都使用@Transactional注解。
    • 我的项目有很多服务。有时我们忘记了添加@Transactional注解,所以出现了错误
    • 我的想法是使用spring框架的advice拦截器来自动打开/回滚事务,而不是@Transactional注解。
    • 我找到了这个,请搜索标题9.6.2。在此链接上使用 PlatformTransactionManager:docs.spring.io/spring/docs/2.5.x/reference/…
    • 我不明白在这种情况下如何使用 PlatformTransactionManager。请您为我解释更多细节好​​吗?
    猜你喜欢
    • 2014-03-19
    • 1970-01-01
    • 2015-03-26
    • 2011-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-13
    • 1970-01-01
    相关资源
    最近更新 更多