2011-07-28 15 views
1

私はカスタムFlashScope実装でバニラSpring MVCを使用しています。基本的にはPost-Redirect-Getパターンに従います。マージ後のHibernateレイジーロードエラー

私は奇妙な状況に遭遇しました。私のポストでは、ユーザが入力したパラメータを検索し、それらのインスタンスをFlashScopeに設定します。私はそれらの作品がうまく動作して参照してください。 FlashScopeの上に私が置いたオブジェクトで

私はしかし、私はそうのようなコレクションにアクセスしようとすると、遅延ロードされたコレクションを持っている:

ERROR org.hibernate.LazyInitializationException IP127.0.0.1 CV#4c44559c-c576-4732 P#75004 - could not initialize proxy - no Session 
org.hibernate.LazyInitializationException: could not initialize proxy - no Session 
at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:167) 
at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:215) 
at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:190) 
at core.model.entities.WorkflowState_$$_javassist_36.getFunctions(WorkflowState_$$_javassist_36.java) 

entity.getLazyLoadedCollection(); 

私は、次のスタックトレースを受け取ります奇妙なことは、上の呼び出しの直前です。サービスレイヤのセッションにそれをマージします。

getSession().merge(entity); 
私は新しいセッションで働いていることがわかっている場合は、私が更新を呼び出す必要がありますが、 JavaDocsは私がマージ呼び出す必要がありますようにそれが見えるようにの

Hibernate Documentation状態...

私は次のことをやった回避策として:

if (getSession().contains(entity)) { 
    getHibernateTemplate().merge(person); 
} else { 
    getSession.update(entity); 
} 

ここで何をしていますか?

答えて

5

慎重にリンクしたjavadocを読んでください: "永続インスタンスを返します。指定されたインスタンスが保存されていない場合は、コピーを保存して新しく永続インスタンスとして返します。

あなたがmerge()に渡しても、そのオブジェクトはセッションに関連付けられません。あなたはmerge()から返されたオブジェクトで作業する必要があります。

+0

私はそれがセッションに関連付けられなってきていないについて、最後のビット上gleened:ここでは2つの基本的な方法があります。ガードは適切であるか、それとも完全に別のものでなければならないのでしょうか? – Scott

+0

私はそこに大きな答えがあるのか​​分かりません。あなたが見つけた違い以外 - オブジェクトをセッションに関連付けるかどうか - update()とmerge()はほぼ同じことを成し遂げます。おそらく、システムに意味的にどのように適しているのかという問題だと思います。 –

0

FlashScopeで作業したことはありませんが、初期化されていないLAZYコレクションにアクセスしようとしていて、Hibernate Sessionにアクセスできるアプリケーションの層にアクセスしていないためです。その前提が正しい場合は、Session(たとえば、あなたのDAO)にアクセスできるコレクションを初期化する必要があります。

Hibernate.initialize(object.getMyLazyCollection()); 

または

if(object.getMyLazyCollection() != null) { 
    object.getMyLazyCollection().size(); // forces a collection load 
} 
関連する問題