当前位置: 首页 > 知识库问答 >
问题:

Spring MVC中的Hibernate事务通知

养枫涟
2023-03-14

我的项目使用的是Spring MVC4、Hibernate5。我已经用通知拦截器配置了hibernate事务,但它没有像我希望的那样回滚。请帮帮我,我的配置有什么问题?

    @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();
        }
    }

@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());
}

}

道:

@Autowired
private SessionFactory sessionFactory;

@Override
public void S save(S entity) {
    sessionFactory.save(entity);
}
@Repository
public class TagDaoImpl extends GenericDaoImpl{
}

@Repository
public class PostDaoImpl extends GenericDaoImpl{
}
@Autowired
private PostDao postDao;

@Autowired
private TagDao tagDao;

public void merge(Post post){
    tagDao.save();
    postDao.save();
}    

}

正如上面的代码,我想如果postdao.save是error,tagDao也是rollback。

共有1个答案

薛英卫
2023-03-14

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

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

 类似资料:
  • 在以下代码中: 无论我是否注释/取消注释事务,它们都工作正常,即没有事务也保存操作成功执行。但是当我检查留档时,他们总是在插入更新删除之前使用事务。有什么具体原因吗?我错过了什么吗? 请告诉我这件事。我相当困惑:( 当做

  • 我有相同的模块,连接数据库运行在两个服务器(后台和前台)。它与同一个数据库连接。 我使用JPA(Hibernate实现)和Spring事务管理。 我有以下问题: 我必须用两个不同字段的最大值1更新表a中的字段a(表a中的字段a,表b中的字段b) 案例1: 更新前 表A fA = 100 tableB fB=102 更新后 表a fA=103 tableB fB=102 案例2: 更新前 表A fA

  • 我在Hibernate中看到了以下属性。cfg。一个企业(EJB)应用程序中的xml。我不知道这到底意味着什么。 我在代码中没有找到任何与事务相关的东西,比如begin transaction或commit,相反,我只看到sessionFactory。openSession()和会话。flush()。如果启用了上述配置,如何管理事务。

  • 本文向大家介绍SpringMVC+MyBatis 事务管理(实例),包括了SpringMVC+MyBatis 事务管理(实例)的使用技巧和注意事项,需要的朋友参考一下 前言         spring事务管理包含两种情况,编程式事务、声明式事务。而声明式事务又包括基于注解@Transactional和tx+aop的方式。那么本文先分析编程式注解事务和基于注解的声明式事务。 编程式事务管理使用Tr

  • 我正在将代码从EJB迁移到Spring-Hibernate。如果发生故障,如何加入事务并回滚?下面是EJB中的代码: 更新1:我们如何连接发生在不同数据库上的两个事务?有2个事务需要原子地执行。如果第二个事务失败,则必须回滚第一个事务。对此如何落实?

  • 我们正在开发一套模块(希望)部署在Apache Karaf中。每个模块都有一个分层结构,从域JPA实体/DAO、服务、Web组件等开始,其中每一层都变成了不同的OSGi包。 JPA实体扩展了一些属于公共包的抽象超类型。问题来了.. 当学习卡拉夫和OSGi的方法时,OpenJPA被“宣传”了很多,所以我们首先尝试了一下。编译时增强是一场灾难,完全是浪费时间,因为我们的实体层次结构跨越了多个包(jar