版本: 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>