Java 为什么@Transactional注释不起作用?

Java 为什么@Transactional注释不起作用?,java,spring,transactions,Java,Spring,Transactions,这段代码是关于一些数据库操作的: @成分反式 公共类CustomerTransactionImp扩展了JDBCDAO支持{ public static final Logger Logger=Logger.getLoggerCustomerTransactionImp.class.getName; @自动连线 公共CustomerTransactionImpDataSource数据源{ setDataSourcedataSource; } @交易的 public void deleteCusto

这段代码是关于一些数据库操作的:

@成分反式 公共类CustomerTransactionImp扩展了JDBCDAO支持{ public static final Logger Logger=Logger.getLoggerCustomerTransactionImp.class.getName; @自动连线 公共CustomerTransactionImpDataSource数据源{ setDataSourcedataSource; } @交易的 public void deleteCustomerByNameString名称{ 字符串sql=从客户中删除,其中firstName=?; 删除CustomerBydlong 100; 显示所有客户; logger.infoDeleted名为:+name的客户; getJdbcTemplate.updatesql,名称; } public void deleteCustomerBydLong ID{ 字符串sql=从客户中删除,其中id=?; logger.info已删除名为:+ID的客户; getJdbcTemplate.updatesql,ID; } 公共列表getAllCustomer{ 字符串sql=从客户中选择*; 返回getJdbcTemplate.queryForListsql; } 公共无效显示所有客户{ 对于对象o:getAllCustomer{ System.out.printlno; } } } 这是我的Spring配置文件:

我的测试班:

@试验 公共无效传输管理测试{ ApplicationContext context=new ClassPathXmlApplicationContextdatabaseconf/transaction-conf.xml; CustomerTransactionImp CustomerTransactionImp=context.getBeantrans,CustomerTransactionImp.class; customerTransactionImp.DeleteCustomerByNamer; customerTransactionImp.displayAllCustomer; } 所以基本代码,在我使用@Transactional Annoatation的代码中,我创建了一个错误的SQL查询,表不是我的db-:

 String sql = "DELETE FROM CUSTOMERWrong WHERE firstName = ?";
我的意思是,在deleteCustomerByName方法中,这里是deleteCustomerByID方法,该方法工作正常并提交


根据transaction,deleteCustomerByID方法不能提交,否则我对@Transactional注释的理解将是错误的。deleteCustomerByName方法下的SQL查询错误,而deleteCustomerByID下的SQL查询正常,所有这些都不能提交

我修复了我的问题,@Transactional用于任何服务类客户、经理,还使用实时数据库,我使用的是在RAM上运行的数据库。我的新代码如下:

@Test
    public void trans_management_test() {
        ApplicationContext context = new ClassPathXmlApplicationContext("databaseconf/transaction-conf.xml");

        CustomerManager customerTransactionImp = context.getBean("manager", CustomerManager.class);
        customerTransactionImp.operation("Administration", 110);
    }

@Component("trans")
public class CustomerTransactionImp extends JdbcDaoSupport{

    public static final Logger logger = Logger.getLogger(CustomerTransactionImp.class.getName());

    @Autowired
    public CustomerTransactionImp(DataSource dataSource) {
        setDataSource(dataSource);
    }

    @Transactional
    public void deleteCustomerByName(String name){
        String sql = "DELETE FROM departments WHERE department_name = ?";

        logger.info("Deleted customer named: "+ name);
        getJdbcTemplate().update(sql,name);
    }

    @Transactional
    public void deleteCustomerByID(Long ID) {
        String sql = "DELETE FROM departments WHERE department_id = ?";

        logger.info("Deleted customer named: "+ ID);
        getJdbcTemplate().update(sql, ID);
    }

@Component("manager")
public class CustomerManager {

    @Autowired
    CustomerTransactionImp transactionImp;

    @Transactional
    public void operation(String name , long ID){
        transactionImp.deleteCustomerByID(ID);
        transactionImp.deleteCustomerByName(name);
    }

    public CustomerTransactionImp getTransactionImp() {
        return transactionImp;
    }

 <context:annotation-config></context:annotation-config>
    <context:component-scan base-package="database.transactionmanagement"/>

    <bean id="datasource2" class="org.apache.tomcat.dbcp.dbcp2.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost/hr"/>
        <property name="username" value="root"/>
        <property name="password" value=""/>
    </bean>

    <tx:annotation-driven transaction-manager="transactionManager"/>

    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <constructor-arg name="dataSource" ref="datasource2"/>
    </bean>
尝试在DeleteCustomerByd方法上添加@Transactional