Весенняя транзакция mybatis становится совершенной

Я пытаюсь использовать mybatis spring для управления транзакциями. Моя проблема в том, что транзакции фиксируются, даже если выдается исключение. Относительно новичок в этом, любая помощь очень ценится. Ниже приведены фрагменты кода.

конфигурация Spring XML

 <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">

        <property name="location">

            <value>classpath:Config.properties</value>

        </property>

    </bean>
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
     <property name="driverClassName" value="${db.driver}"/>
    <property name="url" value="${db.url}"/>
    <property name="username" value="${db.user}"/>
    <property name="password" value="${db.pass}"/>
    <property name="defaultAutoCommit" value="false" />
    </bean>



     <bean id="transactionManager"      class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>


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


<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="configLocation" value="classpath:Configuration.xml" />
        <property name="dataSource" ref="dataSource" />
    </bean>

    <bean class="org.mybatis.spring.SqlSessionTemplate" id="sqlSessionTemplate">
        <constructor-arg ref="sqlSessionFactory"/>
   </bean>

Сервисный класс

@Transactional(rollbackFor=Exception.class, propagation=Propagation.REQUIRED)
public void insertNotes(String noteTypeId,String confidentialValue,String summaryValue,String notes ,String notesId,String noteTypeValue,
        String claimNumber,String notepadId,String mode)
{


        NotepadExample notepadExample= new NotepadExample();

        //to be moved into dao class marked with transaction boundaries
        Notepad notepad = new Notepad();
        notepad.setAddDate(new Date());
        notepad.setAddUser("DummyUser");
        if("true".equalsIgnoreCase(confidentialValue))
            confidentialValue="Y";
        else
            confidentialValue="N";
        notepad.setConfidentiality(confidentialValue);
        Long coverageId=getCoverageId(claimNumber);
        notepad.setCoverageId(coverageId);
        notepad.setDescription(summaryValue);

        notepad.setEditUser("DmyEditUsr");
        //notepad.setNotepadId(new Long(4)); //auto sequencing
        System.out.println(notes);
        notepad.setNotes(notes);
        notepad.setNoteType(noteTypeValue); //Do we really need this?
        notepad.setNoteTypeId(Long.parseLong(notesId));
        if("update".equalsIgnoreCase(mode))
        {
            notepad.setNotepadId(new Long(notepadId));
            notepad.setEditDate(new Date());
            notepadMapper.updateByPrimaryKeyWithBLOBs(notepad);

        }
        else
            notepadMapper.insertSelective(notepad);

              throw new java.lang.UnsupportedOperationException();





}

Не уверен, где я иду не так...

Текущий вызов от контроллера, как указано ниже

 @Controller
public class NotesController {

    private static final Logger logger = LoggerFactory
            .getLogger(NotesController.class);

    @Autowired
    private Utils utility;

    @Autowired
     NotepadService notepadService;


    public  @ResponseBody List<? extends Object> insertNotes(HttpServletRequest request,
        HttpServletResponse response,@RequestParam("noteTypeValue") String noteTypeId,
    @RequestParam("confidentialValue")String confidentialValue,
    @RequestParam("summaryValue")String summaryValue,
    @RequestParam("notes")String notes ,
    @RequestParam("notesId")String notesId,
    @RequestParam("noteTypeValue")String noteTypeValue,
    @RequestParam("claimNumber")String claimNumber,
    @RequestParam("notepadId")String notepadId,
    @RequestParam("mode")String mode) {

        try {
            notepadService.insertNotes(noteTypeId, confidentialValue, summaryValue, notes, notesId, noteTypeValue, claimNumber, notepadId, mode);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;  
    }
}

2 ответа

Я была такая же проблема. Я также относительно новичок в весне. Но, по моему мнению, это зависит от того, как вы вызываете свой метод insertNotes(). Если вы вызываете его из другого локального метода, он не будет работать, потому что у Spring нет способа узнать, что он вызывается, и начать транзакцию.

Если вы вызываете его из метода другого класса с помощью объекта autowired класса, который содержит метод insertNotes(), то он должен работать.

Например

class ABC
{
 @Autowired
 NotesClass notes;

   public void testMethod() {
      notes.insertNotes();
   }
}


class NotesClass
{
   @Transactional(rollbackFor=Exception.class, propagation=Propagation.REQUIRED)  
   public void insertNotes(String noteTypeId,
                           String confidentialValue,
                           String summaryValue,String notes ,
                           String notesId,String noteTypeValue, 
                           String claimNumber,
                           String notepadId,
                           String mode) {
                //Your code
   }
}

Вы можете попробовать использовать шаблон транзакции. Удалите аннотацию @Tranasactional из метода и следующего кода в файл XML.

 <bean id="trTemplate" class="org.springframework.transaction.support.TransactionTemplate">
<property name="timeout" value="30"/>
<property name="transactionManager" ref="transactionManager"/>
</bean>

Создайте объект Trasactiontemplate и вызовите insertNotes из контроллера, как это

@Autowired
private TransactionTemplate transactionTemplate;

transactionTemplate.execute(new TransactionCallbackWithoutResult() {

        @Override
        protected void doInTransactionWithoutResult(TransactionStatus transactionStatus)  {


            try {
                insertNotes();
            } catch (Exception e) {
                transactionStatus.setRollbackOnly();
                logger.error("Exception ocurred when calling insertNotes", e);  

                throw new RuntimeException(e);
            }
        }
    });

Примечание. Перед вызовом метода insertNotes необходимо сделать все параметры окончательными.

Другие вопросы по тегам