2013-04-03 72 views
0

我目前工作的一個項目之前保存的瞬態的實例和我遇到這個錯誤:TransientObjectException:沖洗

org.hibernate.TransientObjectException: object references an unsaved transient instance – save the transient instance before flushing 

發生了什麼事: 1)我有我設置會話變量的作用域登錄後,讓我們說SessionScopeVariableA。

2.)然後我有一個頁面,我添加一個實體,讓我們說EntityA。

3.)EntityA有一個懶惰的領域sessionScopeVariableA,所以當我調用add方法時,我必須設置這個變量。

entityA.setSessionScopeVariableA(sessionScopeVariableA); 
em.persist(entityA); 

4.)注意SessionScopeVariableA包裝在會話範圍生成器中,而操作是對話範圍。

5.)無論我做什麼,我總是以上面指定的瞬態錯誤結束。

有什麼想法?

+0

被sessionScopeVariableA映射爲一個實體呢? – Gab

+0

是的,該應用程序是一個多租戶1,因此在登錄期間,登錄的用戶需要選擇他必須工作的租戶,這將保存在會話範圍內。 – czetsuya

回答

1

解決此問題的方法是使用焊料管理使用CDI的連接資源。這是我們如何做到這一點:

//預選賽租戶

@Retention(RetentionPolicy.RUNTIME) 
@Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.TYPE }) 
public @interface CurrentTenant { } 

//producer for the current tenant 
@Produces 
@Named("currentTenant") 
@CurrentTenant 
public Provider getCurrentTenant() { //.. } 

//在一個單獨的Util類,定義如何來管理連接資源(CDI)

@ExtensionManaged 
@ConversationScoped 
@Produces 
@PersistenceUnit(unitName="myEM") 
@MyEMJpa 
private EntityManagerFactory em; 

//接口連接資源

@Qualifier 
@Retention(RetentionPolicy.RUNTIME) 
@Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.TYPE }) 
public @interface MyEMJpa { } 

//在您的服務中注入實體管理器

@Inject 
@MyEMJpa 
protected EntityManager em; 

//如何注入目前的租戶

@Inject 
@CurrentTenant 
private Provider currentTenant;