0

現在プロジェクトに取り組んでいますが、次のエラーが発生しました。

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.) 何をしても、上記の一時的なエラーが常に発生します。

何か案が?

4

1 に答える 1

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;
于 2013-04-17T02:28:45.077 に答える