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;
}
也即是,如果有不是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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.