2016-01-23 77 views
2

我在Hibernate中有一個事務。我保存一個對象session.save()和其他使用session.getNamedQuery().executeUpdate()。 問題是第二個對象依賴於第一個存在,但即使這兩個調用都在同一事務上,當我嘗試使用namedQuery插入時,第一個對象「仍然不存在」。 如果我flush()會議它的工作,但我現在不是,如果這是一個很好的做法,操縱這樣的會議。休眠 - 在同一事務中保存並插入getNamedQuery

Session session = HibernateSessionManager.getSessionFactory().getCurrentSession(); 
Transaction transaction = null; 
    try { 
     transaction = session.beginTransaction(); 
     session.save(myObjectToSave); 
     session.flush(); //only works with this line in between 
     session.getNamedQuery("ar.com.portal.bean.Application.insertLang").executeUpdate(); 
     transaction.commit(); 
     } catch (Exception e) { 
      if (transaction != null) transaction.rollback(); 
      throw e; 
     } 

這是正確的解決方案嗎?或者取決於一些配置參數?我是Hibernate的新手。

編輯:

這些都是我在hibernate.cfg.xml中已經

<property name="connection.pool_size">10</property> 
<property name="dialect">org.hibernate.dialect.PostgreSQLDialect</property> 
<property name="current_session_context_class">thread</property> 
<property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property> 
<property name="show_sql">true</property> 

namedQuery的內容屬性

<sql-query name="insertLang" > 
insert into APPLICATION_LANG (APPLICATION_ID, ISO_LANGUAGE_ID, WORKSPACE_ID, NAME, DESCRIPTION) 
values (:id, :lang, :systemObject.workspace.id, :name, :description) 
</sql-query > 
+0

什麼是組態的沖洗模式? –

+0

在我的hibernate.cfg中添加了屬性。沒有關於刷新,所以我認爲它進入默認值。 –

+0

你正在執行的命名查詢中有什麼? –

回答

1

Hibernate不執行本地刷新之前什麼SQL查詢。請注意,HQL並非如此,因爲Hibernate知道查詢中使用了哪些實體,所以它可以在執行查詢之前自動執行必要的刷新。有關更多詳細信息,請參閱此blog

那麼,就可以解決這個問題你已經做到了(查詢之前明確地刷新所有內容)的方式,也可以定義同步實體類:

((SQLQuery) session.getNamedQuery("...")) 
    .addSynchronizedEntityClass(MyObjectToSaveClass.class) 
    .executeUpdate(); 

後一種方法更好,因爲它會如果沒有與MyObjectToSaveClass實體相關的掛起(未刷新的)DML更改並且它不會使整個二級高速緩存無效(請參閱此answer瞭解更多詳細信息),則不執行任何刷新。

+0

測試第二個選項。工程很好,很有道理! –