【发布时间】:2013-05-04 17:01:52
【问题描述】:
我正在尝试使用 JAX-RS 将对象公开为 XML。
我有一个名为 Client 的类,我正在返回它的实例,如下所示:
@Transactional(readOnly=true)
@GET
@Produces("application/xml")
@Path("/{clientId}.xml")
public Client getCleintAsXML(@PathParam("clientId") int clientId) {
Client c = em.find(Client.class, clientId);
return c;
}
但是Client 对象有一个Group 对象的列表,而Group 对象又具有其他对象的列表。
当 JAX-RS 尝试序列化 Client 对象时,它会遍历整个对象图。当它遇到 groups 的 Hibernate 代理时,代码会中断,因为延迟加载仅在事务内部起作用。
很公平,所以我在退出事务之前急切地加载了groups。
但它仍然失败,因为每个 Group 对象又具有一对多的关系,即更多的代理列表。
我什至不需要它们在输出中。我意识到如果删除这些代理,即设置为空,我的问题将得到解决。
我不想手动将它们设置为 null,因为这容易出错且不可维护。有没有办法自动做到这一点?
或者我可以告诉hibernate不要为这个特定的查询使用代理吗?还是只使用 1 级深度的代理?
我在 JPA 后面使用 Hibernate。我尽可能不希望直接引用 Hibernate。
我发现了十几个由不同用户编写的类来摆脱代理。有没有标准的方法来做到这一点?如果这是一个如此普遍的问题,我想会有一个标准的解决方案。
【问题讨论】:
-
Hibernate POJO 不可序列化。例如,GWT 有问题,请参阅此处developers.google.com/web-toolkit/articles/…您没有使用 GWT,但您的环境中是否有类似的问题?
-
不,不是这样。 Hibernate 使用代理将数据的获取延迟到实际需要数据的时间。如果对象被分离,那将失败。我通过使用反射删除所有未初始化的 HibernateProxies 解决了这个问题。
标签: hibernate jpa jersey jax-rs