2011年9月30日 星期五

Spring MVC + Hibernate JPA @Transactional 沒作用

版本: Spring 3 MVC + Hibernate 3.6 JPA

問題: 透過dao對資料庫操作時,無法新增(insert)、修改(update)及刪除(delete),沒有錯誤訊息,只能做select的動作。




原因: spring mvc 使用 annotation 時,需要在mvc-config.xml中加入

<context:component-scan base-package="div.mmncsmm"/>

在server啟動時,spring初始化的過程中,會掃描div.mmncsmm下的所有類別的annotation,包含@Controller、@Service、@Autowired等。
但掃描到 @Service 時,@Transactional 還沒被處理,所以Transaction沒有被開啟,dao對資料庫操作時沒有做commit,自然資料沒有被異動。

解決方式:

在載入applicationContext.xml時,先去掃描除了annotation之外的設定,等到載入mvc-config.xml時,在載入annotation的設定。

在mvc-config.xml中,原先是

<context:component-scan base-package="div.mmncsmm"/>

改成

<context:component-scan base-package="div.mmncsmm" use-default-filters="false" >
    <context:include-filter expression="org.springframework.stereotype.Controller" type="annotation"/>
</context:component-scan>

applicationContext.xml中加入

<context:component-scan base-package="div.mmncsmm" >
    <context:exclude-filter expression="org.springframework.stereotype.Controller" type="annotation"/>
</context:component-scan>