2015-04-18 2 views
0

Этот код о некоторых действиях базы данных:Почему не работает аннотация @Transactional?

@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 CUSTOMER WHERE firstName = ?"; 

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

    public void deleteCustomerByID(Long ID) { 
     String sql = "DELETE FROM CUSTOMER WHERE id = ?"; 

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

    public List getAllCustomer(){ 
     String sql = "Select * FROM customer"; 

     return getJdbcTemplate().queryForList(sql); 
    } 

    public void displayAllCustomer() { 
     for (Object o : getAllCustomer()) { 
      System.out.println(o); 
     } 
    } 
} 

Это мой Spring файл конфигурации:

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

    <jdbc:embedded-database id="dataSource"> 
     <jdbc:script location="sqlfiles/schema.sql"/> 
     <jdbc:script location="sqlfiles/data.sql"/> 
    </jdbc:embedded-database> 

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

    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 
     <constructor-arg name="dataSource" ref="dataSource"/> 
    </bean> 
</beans> 

и мой тестовый класс:

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

    CustomerTransactionImp customerTransactionImp = context.getBean("trans", CustomerTransactionImp.class); 

    customerTransactionImp.deleteCustomerByName("Omer"); 
    customerTransactionImp.displayAllCustomer(); 
} 

Так основные коды, в код, где я использую annaotation @Transactional, я создал неправильный SQL-запрос, таблица не моя db-:

String sql = "DELETE FROM CUSTOMERWrong WHERE firstName = ?"; 

Я имею в виду, в методе deleteCustomerByName, здесь deleteCustomerByID метод и этот метод работает отлично и фиксации.

В соответствии с транзакцией метод deleteCustomerByID не должен фиксироваться, или мое понимание аннотации @Transactional будет неправильным. SQL-запрос под кодом deleteCustomerByName неверен, в то время как SQL-запрос под deleteCustomerByID в порядке, все они не должны совершать ???

+0

попытаться добавить '@ Transactional' в метод deleteCustomerByID – Gospel

ответ

0

Я исправил свою проблему, @Transactional используется в любом классе обслуживания (Customer, Manager), а также использует базу данных в реальном времени, я использовал базу данных, которая запускается в ОЗУ. Мой новый код выглядит следующим образом:

@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> 
Смежные вопросы