錯誤記錄(九)Could not obtain transaction-synchronized Session for current thread

阿木俠發表於2017-06-02

報錯資訊:

org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current thread
	at org.springframework.orm.hibernate4.SpringSessionContext.currentSession(SpringSessionContext.java:134)
	at org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:1041)

這個錯誤的提示是無法獲取當前transaction-synchronized執行緒的會話
原因是沒有為用到了事務的方法定義事務


比如:在Action中定義了該方法,用於刪除資料資訊操作:


而在applicationContext.xml中是這樣設定的:


這表示只有以do和find打頭的方法才能事務,其他方法不走事務,刪除自然不能成功,於是報上面的錯誤。


當然,也可能不是上面這麼粗心的原因,如果使用了Hibernate4報錯的話,可以在web.xml中加入如下配置,程式也可以正常執行了。

<filter>
	<filter-name>SpringOpenSessionInViewFilter</filter-name>
	<filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class>
</filter>
  <filter-mapping>
    	<filter-name>SpringOpenSessionInViewFilter</filter-name>
   	<url-pattern>/*</url-pattern>
  </filter-mapping>

網上還看到一種解決方法,針對第二種情況的,測試也可行。
1. 在spring 配置檔案中加入
2. 在處理業務邏輯的類上採用註解:<tx:annotation-driven transaction-manager="transactionManager"/>

如:

@Service
public class CustomerServiceImpl implements CustomerService {  
    @Transactional
    public void saveCustomer(Customer customer) {
        customerDaoImpl.saveCustomer(customer);
    }
    ...
}


相關文章