0

mybatisの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;  
    }
}
4

2 に答える 2

1

同じ問題がありました。私も春は比較的新しいです。しかし、私によると、insertNotes() メソッドをどのように呼び出しているかによって異なります。別のローカルメソッドから呼び出している場合、Spring はそれが呼び出されたことを認識してトランザクションを開始する方法がないため、機能しません。

insertNotes() メソッドを含むクラスの autowired オブジェクトを使用して、別のクラスのメソッドから呼び出す場合は、機能するはずです。

例えば

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
   }
}
于 2012-04-05T03:23:23.447 に答える
0

トランザクション テンプレートを使用して試すことができます。@Transactional アノテーションをメソッドと次のコードから 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メソッドを呼び出す前に、すべてのパラメータをfinalにする必要があります

于 2012-04-06T01:27:14.147 に答える