6

我正在开发一个简单的 webapp,它将域模型公开为 RESTful 资源。我打算将 JPA2(Hibernate) 与 SpringMVC REST 支持一起使用。

在将 Hibernate 实体编组为 XML/JSON 时,如果实体被分离,它将为惰性子关联抛出 LazyLoadingException。如果实体仍然附加到 Hibernate Session,它将几乎加载整个数据库。

我尝试使用 Dozer CustomFieldMapper 来确定该属性是否是未加载的惰性 Hibernate 集合,然后返回 NULL。

但是,如果我们有双向关联,Hibernate 会急切地加载多对一,而 Dozer 将尝试复制属性,这些属性最终会陷入无限循环,从而导致 StackOverflow 错误。

我知道解决此问题的唯一解决方法是使用 DTO 并将所需的属性仅复制到干净的 POJO(DTO)中,然后编组为 XML/JSON。但是复杂的领域模型手动复制属性是非常痛苦的。

有没有其他更干净/更简单的方法来(取消)编组 Hibernate 实体?

4

3 回答 3

4

我可能听起来太保守了,但我认为使用 DTO 仍然是一个好主意。

映射的复杂性与资源 API 的粒度成正比,换句话说,越粗糙越复杂。

于 2013-01-03T09:02:32.363 回答
3

我在 GWT 应用程序中来回传递 Hibernate 的 VO 时遇到了类似的问题,并且在某些项目中使用 Dozer 效果很好,而在其他项目中使用了本文中描述的方法,这基本上是编组之前的休眠代理。

希望对你有帮助,

于 2013-01-03T09:02:05.127 回答
2

在这门课上掠夺:https ://github.com/viniciuspires/reqlist/blob/master/src/main/java/org/reqlist/arch/HibernateAwareObjectMapper.java

我将 Jackson 用作 JSON 序列化器/反序列化器,我必须创建此类并为其添加 Hibernate4Module 以验证是否Hibernate.isInitialized意外初始化该属性。

之后,您只需将其配置为您的ObjectMapper,并将其传递给MessageConverters数组,就像我在这一行中所做的那样:

https://github.com/viniciuspires/reqlist/blob/master/src/main/resources/META-INF/org.reqlist.context.xml#L21

这对我来说就像一个魅力。

于 2015-03-12T20:42:59.577 回答