2012-05-04 5 views
2

私はJPAJPA(冬眠)、JAX-RS(ジャージー)、ジャクソンを使用しています。ジャンパーとJax-rsを使用している場合、エンティティマネージャーを閉じる方法

パケットの作成と送信後にエンティティマネージャを閉じるにはどうしたらいいですか?

次のコードは機能しません。エラーが表示されます。応答が完了する前にem.close()が呼び出されているようです。

@GET 
@Produces(MediaType.APPLICATION_JSON) 
public Response getNode(@QueryParam("nodeId") long nodeId){ 
try { 
    Node node = em.find(Node.class, nodeId);   
    if (node == null) throw new WebApplicationException(Response.Status.NOT_FOUND); 
    Response response = Response.ok(node, MediaType.APPLICATION_JSON).build(); 
    return response; 
} 
finally { em.close(); } 
} 

SEVERE:サーブレット用のServlet.service()JAX-RSサーブレット] 経路に関連して[]は、例外org.codehaus.jackson.map.JsonMappingExceptionを投げ: はレイジーコレクションの初期化に失敗しました役割の: com.company.entity.Node.childList、いかなるセッションまたはセッションは、(参照チェーンを介し:com.company.entity.Node [ "childIdList"]) を閉じなかった私はトランザクションを使用してい

他の同様の方法。

答えて

2

これに対する解決策は、トランザクションを管理するjaxbサーブレットの前で実行されるフィルタを作成することです。これにはネット上のいくつかの例があります。

このパターンは、「ビューで開いているセッション」と呼ばれます。ここでは流れの上にスタック上にあなたはFilter do not initialize EntityManagerを試すことができますし、他の場所を見て...

http://chstath.blogspot.com/2007/11/extending-transaction-boundaries-beyond.html

http://www.naildrivin5.com/daveblog5000/?p=39

しかし、あなたも試してみて、より多くの助けのためにGoogleでまたは流量を超えるスタック上で検索することができます。

関連する問題