首页 > 解决方案 > Rollback is not working in @Transactional annotated service. Spring + Hibernate

问题描述

In my code the service method savePerson is annotated with @Transactional. Inside this method a Person entity is persisted and inmediately a Runtime exception is intentionally throwed. I suposse the transaction should not be commited but the Person entity is persisted in database....rollback is not working and I dont know why.

This is my Hibernate Configuration:

package newp;

import java.util.Properties;

import javax.sql.DataSource;

import org.apache.commons.dbcp.BasicDataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.orm.hibernate5.HibernateTransactionManager;
import org.springframework.orm.hibernate5.LocalSessionFactoryBean;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@Configuration
@EnableTransactionManagement
public class HibernateConf {

    @Bean
    public LocalSessionFactoryBean sessionFactory() {
        LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
        sessionFactory.setDataSource(dataSource());
        sessionFactory.setPackagesToScan(new String[]{"newp"});
        sessionFactory.setHibernateProperties(hibernateProperties());

        return sessionFactory;
    }

    @Bean
    public DataSource dataSource() {
        BasicDataSource dataSource = new BasicDataSource();
        dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/poas");
        dataSource.setUsername("admin");
        dataSource.setPassword("admin");

        return dataSource;
    }

    @Bean
    public PlatformTransactionManager hibernateTransactionManager() {
        HibernateTransactionManager transactionManager= new HibernateTransactionManager();
        transactionManager.setSessionFactory(sessionFactory().getObject());
        return transactionManager;
    }

    private final Properties hibernateProperties() {
        Properties hibernateProperties = new Properties();
        
        hibernateProperties.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQL5Dialect");
        hibernateProperties.setProperty("hibernate.show_sql", "true");

        return hibernateProperties;
    }   
}

This is my service:

package newp.services;

import javax.transaction.Transactional;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.EnableTransactionManagement;

import newp.dao.PersonDao;
import newp.model.Person;

@Service
public class PersonService{
    @Autowired
    PersonDao dao;
    
    @Transactional
    public void savePerson(Person p) {
        dao.savePerson(p);          
        throw new RuntimeException();
    }
    
}

The DAO

package newp.dao;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import newp.entities.PersonEntity;
import newp.model.Person;

@Repository 
public class PersonDao {
    @Autowired
    SessionFactory sessionFactory;
    
    public void savePerson(Person person) {
        Session s = sessionFactory.getCurrentSession();
        PersonEntity p=new PersonEntity();
        p.setAge(person.getAge());      
        p.setName(person.getName());
        p.setSurname(person.getSurname());
        s.saveOrUpdate(p);
    }   

}

标签: springhibernatespring-mvctransactions

解决方案


您可能正在使用带有不支持事务的 MyISAM 存储引擎的表:https ://stackoverflow.com/a/8036049/412446


推荐阅读