2015-05-02 2 views
0

У меня есть способ добавить элемент в таблицу и проверить исключение Мой элемент хранится в таблице. Исключение возникает, но сделка не была Откат Мой методSpring Transactional rollbackFor не работает

@Transactional(propagation = Propagation.REQUIRED, readOnly = false, 
     rollbackFor={java.lang.Exception.class, java.lang.RuntimeException.class}) 
public MyBean addItem(MyBean bean, Integer iduser) throws Exception { 

    NalogBean nb = txTemplate.execute(new TransactionCallback<MyBean>() { 

     @Override 
     public MyBean doInTransaction(TransactionStatus txStatus) { 
      MyBean nbl = null; 
      try { 
       sessionFactory.getCurrentSession().saveOrUpdate(bean); 
       throw new RuntimeException("Exception throwed!"); 

      } catch (Exception e) { 
       txStatus.setRollbackOnly(); 
      } 
      return nbl; 
     } 
    }); 

    return nb;   
} 

Мой сервлет-контекст является стандартным

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

<beans:bean id="dataSource" 
    class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    <beans:property name="driverClassName" value="${database.driver}" /> 
    <beans:property name="url" value="${database.url}" /> 
    <beans:property name="username" value="${database.user}" /> 
    <beans:property name="password" value="${database.password}" /> 
</beans:bean> 


<beans:bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
    <beans:property name="dataSource" ref="dataSource"></beans:property> 
    <beans:property name="hibernateProperties"> 
     <beans:props> 
      <beans:prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</beans:prop> 
     </beans:props> 
    </beans:property> 
    <beans:property name="packagesToScan" value="rs.co"></beans:property> 


    <beans:property name="annotatedClasses"> 
     <beans:list> 
      <beans:value>rs.co.mfp.klijent.finansije.model.NalogModel</beans:value> 
     </beans:list> 
    </beans:property> 

</beans:bean> 


<beans:bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> 
    <beans:property name="sessionFactory" ref="sessionFactory"/> 
</beans:bean> 

и когда я называю AddItem это магазин боб в таблицу. Также я стараюсь без txTemplate, только sessionFactory.getCurrentSession(). SaveOrUpdate (bean); throw new RuntimeException («Исключение выбрано!»); но такой же результат. Элемент хранился в таблице. Любая идея?

+0

Вы можете удалить RuntimeException в блоке rollbackFor, потому что он наследует Exception. Кроме того, вы повторяете значение по умолчанию для readOnly и распространения. –

+0

mh-dev, Да, это много, но я все стараюсь. Также я попробовать @Transactional (распространение = Propagation.REQUIRED, READONLY = FALSE, \t \t \t rollbackFor = {java.lang.Exception.class, java.lang.RuntimeException.class}) \t общественного NalogBean addNalog (NalogBean фасоль, Integer iduser) throws Exception { \t \t \t \t NalogModel model = null; \t \t \t model = convertToModel (bean); \t \t \t sessionFactory.getCurrentSession(). SaveOrUpdate (model); \t \t bean.setIdnalog (model.getIdnalog()); \t \t if (true) \t \t throw new RuntimeException («Исключение выбрано!»); \t \t // testRequired(); \t \t bean bean; \t }, но он написал данные в таблицу – Milos

+0

Если честно, то, что вы делаете, - далеко от того, как я использую весну в наши дни. Вся эта xml-конфигурация автоматически загружает Spring Boot. (рядом с конфигурацией datasource в файле свойств). Один важный вопрос: вы вызываете этот метод из одного класса? Если да, то аннотация не имеет никакого эффекта без aop. –

ответ

0

, когда вы используете аннотацию Transaction в методе выше метода, не нужно использовать txStatus.

@Transactional(propagation = Propagation.REQUIRED, readOnly = false, 
     rollbackFor={java.lang.Exception.class, java.lang.RuntimeException.class}) 
public MyBeanId addItem(MyBean bean, Integer iduser) throws Exception { 

       return sessionFactory.getCurrentSession().saveOrUpdate(bean); 

} 

, когда будет поднят исключение, откат транзакции автоматически я надеюсь помочь вам

+0

Я пробовал, и я положил if (true) \t \t \t throw new RuntimeException («Исключение выбрано!»); но bean хранится в таблице. – Milos

+0

Вот ссылка из тестового проекта http://www.mfp.co.rs/wp-content/uploads/2015/05/testHibernate.zip – Milos

+1

Благодаря М. Дейну, он решает мою проблему. Проблема была в таблице MySQL. Я должен преобразовать таблицу в InnoDB ALTER TABLE table_name ENGINE = InnoDB и все отлично. – Milos

Смежные вопросы