0

アプリケーションでOpenSessionInViewを使用しています。私の目標は、例外が発生した場合に、データベース内のすべての変更を1つのメソッドでロールバックすることです。これが私のコントローラーです:

@RequestMapping(value="/kartazadan.do", method=RequestMethod.GET )
    @Transactional(rollbackFor=Exception.class)
    public ModelAndView viewGET(HttpServletRequest request,
            HttpServletResponse response) throws Exception{
        int id = Integer.parseInt(ServletRequestUtils.getRequiredStringParameter(request, "id")); 
        ModelMap modelMap = new ModelMap();
        KartaZadan kartaZadan = kartaZadanDAO.getkartaZadanById(id);
        kartaZadan.setZadanie("TEST10");
        kartaZadanDAO.update(kartaZadan);
        kartaZadan = kartaZadanDAO.getkartaZadanById(null); //here when Exception should occurr and make transaction rollback
        kartaZadanDAO.update(kartaZadan);
        modelMap.addAttribute("kartaZadan", kartaZadan);
        setCommonFields(modelMap);
        modelMap.addAttribute("errorsEnabled", false);
        return new ModelAndView("kartaZadan", modelMap);
    }

以下に示す構成で機能します:web.xml内:

<filter>
        <filter-name>hibernateFilter</filter-name>
        <filter-class>
           org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
        </filter-class>
</filter>

<bean class="org.springframework.orm.hibernate3.support.OpenSessionInViewInterceptor"> 
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>

しかし、この戦略では、ビュー内の行を保存/更新することはできません。だから私は次のようにOpenSessionInViewFilterをovverridedしました:

public class CustomOpenSessionInViewFilter extends OpenSessionInViewFilter{

    @Override
    public void closeSession(Session session, SessionFactory sessionFactory){
        session.flush();
        super.closeSession(session,sessionFactory);
    }

}

これで保存/更新できますが、トランザクションはロールバックしません...両方を機能させる方法は?

4

1 に答える 1

0

あなたが直面しているのは、autoCommit がオンになっていることが原因である可能性があります。これをオフにする必要があります

<property name="hibernate.connection.autocommit">false</property> 

すべてが問題ない場合は、明示的に session.getTransaction().commit を介して自分でコミットします。

于 2011-12-08T10:48:16.313 に答える