回滚在 @Transactional 注释服务中不起作用。 Spring + 休眠

Rollback is not working in @Transactional annotated service. Spring + Hibernate

在我的代码中,服务方法 savePerson 带有 @Transactional 注释。在这个方法中,一个 Person 实体被持久化,并立即有意抛出一个运行时异常。我认为不应该提交事务,但是 Person 实体保留在数据库中....回滚不起作用,我不知道为什么。

这是我的休眠配置:

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;
    }   
}

这是我的服务:

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

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

}

您可能正在使用不支持事务的 MyISAM 存储引擎的表: