hibernate裏面的OpenSessionInViewFilter

OpenSessionInViewFilter在getSession的時候,會把獲取回來的session的flush mode 設爲FlushMode.NEVER。然後把該sessionFactory綁定到TransactionSynchronizationManager,使request的整個過程都使用同一個session,在請求過後再接除該sessionFactory的綁定,最後closeSessionIfNecessary根據該session是否已和transaction綁定來決定是否關閉session。在這個過程中,若HibernateTemplate 發現自當前session有不是readOnly的transaction,就會獲取到FlushMode.AUTO Session,使方法擁有寫權限。
也即是,如果有不是readOnly的transaction就可以由Flush.NEVER轉爲Flush.AUTO,擁有insert,update,delete操作權限,如果沒有transaction,並且沒有另外人爲地設flush model的話,則doFilter的整個過程都是Flush.NEVER。所以受transaction保護的方法有寫權限,沒受保護的則沒有。

所以說當配製有OpenSessionInViewFilter就會出現readOnly問題,而不配又出現session關閉的問題,要用hibernateTemplate的話就要考慮配置spring事務

如果用hibernate (uuid.hex)主鍵生成方式,用spring getSession.save()方法 會插不了數據

用hibernateTemplate就可以

這樣的話配置了OpenSessionInViewFilter就出現問題了

想了很久都不知道怎麼做,網上總說用事務解決,但我總沒成功,

現在其他方法都沒問題,就單一個插入操作 我用this.getHibernateTemplate().save();就出現

Write operations are not allowed in read-only mode (FlushMode.NEVER) - turn your Session into FlushMode.AUTO or remove 'readOnly' marker from transaction definition

最後沒辦法,就單單2個插入操作不可能去改變表結構或者動用其他東西

OpenSessionInViewFilter這傢伙不配可不行,我自己用了一個解決方案




public void insert(Consumer c) throws Exception {

final Consumer cc=c;

// this.getHibernateTemplate().save(c);有事務問題



// this.getSession().save(c);

// super.getSession(true).save(c);

// this.getSession().saveOrUpdate(c);這些都插不了數據,也沒報錯

this.getHibernateTemplate().execute(



new HibernateCallback() {

public Object doInHibernate(Session session) throws HibernateException {

session.setFlushMode(FlushMode.AUTO);

session.save(cc);

session.flush();

return null;

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章