我正在使用JPA(休眠),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 [JAX-RS Servlet]的Servlet.service()与上下文有关 path []抛出异常org.codehaus.jackson.map.JsonMappingException: 懒得初始化角色集合: com.company.entity.Node.childList,没有关闭会话或会话 (通过参考链:com.company.entity.Node [“childIdList”])
我在其他类似方法中使用交易。
答案 0 :(得分:2)
解决方法是创建一个过滤器 - 它将在为您管理事务的jaxb servlet之前运行。网上有几个例子。
该模式称为“视图中的开放会话”。在堆叠流程中,您可以尝试Filter do not initialize EntityManager并在其他地方查看...
http://www.naildrivin5.com/daveblog5000/?p=39
http://chstath.blogspot.com/2007/11/extending-transaction-boundaries-beyond.html
但您也可以尝试在Google上或在堆栈上搜索更多帮助。