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(); }
}

严重:servlet [JAX-RS Servlet] 的 Servlet.service() 在路径 [] 的上下文中抛出异常 org.codehaus.jackson.map.JsonMappingException:未能延迟初始化角色集合:com.company.entity.Node。 childList,没有会话或会话被关闭(通过引用链:com.company.entity.Node["childIdList"])

我正在其他类似方法中使用事务。

4

1 回答 1

2

解决方案是创建一个过滤器——它将在为您管理事务的 jaxb servlet 之前运行。网上有几个这样的例子。

该模式称为“在视图中打开会话”。在堆栈溢出中,您可以尝试过滤器不初始化 EntityManager并在其他地方查看...

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

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

但是您也可以尝试在 google 或 stack over flow 上搜索以获得更多帮助。

于 2012-05-04T06:42:35.783 回答