java - spring-hibernate事务不回滚

标签 java spring hibernate spring-mvc spring-boot

我使用spring+hibernate时HQL语句不会回滚,但是session.saveOrUpdate()会;

用户服务

@Service
@Transactional(rollbackFor=Exception.class)
public class UserService {

    @Autowired
    private BaseDao dao;

    public int updateTest(){
        int i = dao.updateUser();
        int t = 1/0;
        return i;
    }
}

BaseDao

@Repository
public class BaseDao {

     @Autowired
     private SessionFactory sessionFactory;

     private Session getSession(){
         return sessionFactory.getCurrentSession();
     }

     public int updateUser(){
         int i = 0;
        /* String sql = "from Student where name = 'dengbojing'";
         Query query = this.getSession().createQuery(sql);*/
         Student s = new Student();
         s.setId(1);
         s.setAddress("1");

         Query query = this.getSession().createQuery("update Student s set s.address = '1'");


         query.executeUpdate();

         //this.getSession().update(s);
         return i;
     }

}

配置类

@Configuration
@EnableConfigurationProperties(HibernateProperties.class)
@EnableTransactionManagement(proxyTargetClass=true)
public class HibernateConfig {
    @Autowired
    private HibernateProperties config;


    @Bean(name="sessionFactory")
    public LocalSessionFactoryBean localSessionFactoryBean(){
        LocalSessionFactoryBean bean = new LocalSessionFactoryBean();
        bean.setDataSource(dataSource());
        bean.setHibernateProperties(config.getHibernateProperties());
        bean.setPackagesToScan(config.getPackageToScan());
        return bean;
    }

    @Bean
    public DataSource dataSource(){
        DruidDataSource source = new DruidDataSource();
        source.setDriverClassName(config.getDatasource().getDriverClassName());
        source.setUsername(config.getDatasource().getUsername());
        source.setUrl(config.getDatasource().getUrl());
        source.setPassword(config.getDatasource().getPassword());
        return source;
    }

    @Bean
    public HibernateTransactionManager txManager(){
        HibernateTransactionManager manager = new HibernateTransactionManager();
        manager.setSessionFactory(localSessionFactoryBean().getObject());
        manager.setDataSource(dataSource());
        return manager;
    }

}

Spring事务不支持HQL语句,这个问题困扰了我2天,看到有人有类似问题,但是没有解决问题

最佳答案

我使用完全相同的版本和配置进行了一些测试。

我不得不说更新永远不会持久化在数据库中。

作为一种解决方法,如果您可以通过这种方式实现您的功能..请尝试:

  • 查找所需的 Person 实体
  • 更新必填字段
  • 此后不要在 session 对象上调用任何其他方法。只需将其留给框架来更新事务提交上的更改。

示例

Person person = session.get(Person.class, 1);

person.setAddress("1")
// other fields updated

return i;

现在,如果没有使用 executeUpate() 进行显式批量更新,则提供程序不可能进行隐式提交。这是理论,因此请检查一下。

关于java - spring-hibernate事务不回滚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42186825/

相关文章:

java - 将对象添加到数组

java - TIMEr 执行后的代码不起作用

java - 如何正确使用乐观锁定,使用 Spring 和 Hibernate 捕获 StaleObjectState 异常

java - 如何更改 Swagger-ui URL 前缀?

java - 您是否应该省略已由该类的属性指定的变量名中的信息?

java - 为什么 Spring 的 @Transactional 不能处理 protected 方法?

java.lang.NoSuchMethodException : org. springframework.boot.autoconfigure.http.HttpMessageConverters 问题

java - 热衷于从 spring 响应式(Reactive) ClientRequest 获取字符串形式的正文?

java - 为什么 Hibernate 不为 MySQL 创建数据库?

java - JPA 1.0 是否有任何 JPA fluent API/Critera api?我正在使用 OpenJPA