有没有办法在没有DTO的情况下将Hibernate实体公开为RESTful资源?

时间:2013-01-03 08:48:02

标签: java hibernate rest jpa-2.0

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

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

我已经尝试使用Dozer CustomFieldMapper来确定属性是否是惰性的Hibernate Collection,但是没有加载,然后返回NULL。

但是如果我们有双向关联,Hibernate会急切地加载很多到一个端,而Dozer会尝试复制属性,最终导致无限循环导致StackOverflow错误。

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

还有其他干净/更简单的方法来(联合国)对Hibernate实体进行编组吗?

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:3)

我在GWT应用程序中来回传递Hibernate的VO有一个类似的问题,在一些项目中使用Dozer效果很好,而在其他项目中使用了this article中描述的方法,基本上是null的编组之前的hibernate代理。

希望能帮到你,

答案 2 :(得分:2)

在这堂课上抓一个战利品:https://github.com/viniciuspires/reqlist/blob/master/src/main/java/org/reqlist/arch/HibernateAwareObjectMapper.java

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

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

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

这对我来说就像是一种魅力。