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

回滚在@Transactional annotated service中不起作用。Spring冬眠

陈兴朝
2023-03-14

在我的代码中,服务方法savePerson被注释为@Transactional。在这个方法中,Person实体被持久化,并且在中间故意抛出运行时异常。我支持不提交事务,但Person实体将保留在数据库中。。。。回滚不起作用,我不知道为什么。

这是我的Hibernate配置:

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

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

}

共有1个答案

上官和惬
2023-03-14

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

 类似资料:
  • 问题内容: 我有一个MySQL数据库,正在使用。 由于某些原因,我无法使事务正常运行。如果我打电话,它不会回滚。 示例代码: 结果是将另一行添加到myTable。谁能想到一个原因? 问题答案: 您使用的是myIsam还是innodb?据我所知,它仅适用于innodb

  • 我使用@Transactional与Spring引导和jpa。但它不起作用。有人能帮忙吗? 我的插件在myDAO中,它是在服务类中自动生成的。下面的代码是实现服务接口的服务类的方法

  • 我是LiquiBase的新手。我可以使用LiquiBase更新(具有创建表的变更集)到Oracle数据库。在进行更新时,我还创建了标记。但是当我尝试回滚更新的更改(即删除创建的表)时,使用该标记。桌子没有掉下来。 我使用的是liquibase-maven插件3.4.2。下面是Maven中的代码。 请帮我解决这些问题。

  • 在spring boot中,我试图创建我的第一个事务性测试,但trasaction不起作用。 null 我需要的是: 将数据插入事务。 从事务中读取数据。 测试返回的数据。 回滚事务。

  • 问题内容: 我正在尝试使用Spring测试实体EJB3。 EJB本身不使用Spring,并且我想使生产JPA配置的重复保持最少(例如,不重复persistence.xml)。 我的单元测试似乎可以正常工作,但是即使我的单元测试应该是事务性的,数据仍会在各种测试方法之间持久存在…… 这是我的实体: 我的单元测试: 和我的appContext.xml: 当我运行测试时,test2失败,因为它找到了两个

  • 我有一个Spring Boot应用程序,我试图在其中测试使用LiquiBase的一些迁移。我试着看看回滚函数是如何工作的,但我不断地得到错误。 当我运行应用程序时,表创建正确...但我不知道如何或在哪里运行命令来执行回滚。我尝试在IntelliJ中的Maven Goal中运行以下命令: 当我运行时,它会说: 如果数据库URL丢失或错误,那么我认为它也不能创建表?