2

私はJPA(hibernate)、JAX-RS(Jersey)、Jacksonを使用しています。

パケットが作成されて送信された後、エンティティマネージャを閉じるにはどうすればよいですか?

以下は機能せず、エラーが発生します。応答が完了する前に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(); }
}

重大:パス[]のコンテキストでサーブレット[JAX-RSサーブレット]のServlet.service()が例外org.codehaus.jackson.map.JsonMappingExceptionをスローしました:ロールのコレクションを遅延初期化できませんでした:com.company.entity.Node。 childList、セッションまたはセッションが閉じられていません(参照チェーンを介して:com.company.entity.Node ["childIdList"])

私は他の同様の方法でトランザクションを使用しています。

4

1 に答える 1

2

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

このパターンは「OpenSessioninView」と呼ばれます。ここでスタックオーバーフローであなたはフィルターを試すことができますEntityManagerを初期化しないでくださいそして他の場所で見てください...

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

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

しかし、さらにヘルプが必要な場合は、グーグルまたはスタックオーバーフローで検索してみることもできます。

于 2012-05-04T06:42:35.783 に答える