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

Java 有没有办法在没有DTO的情况下将Hibernate实体公开为RESTful资源?,java,hibernate,rest,jpa-2.0,Java,Hibernate,Rest,Jpa 2.0,我正在开发一个简单的webapp,它将域模型公开为RESTful资源。 我计划使用JPA2(Hibernate)和SpringMVC REST支持 在将Hibernate实体编组为XML/JSON时,如果分离该实体,它将为惰性子关联抛出LazyLoadingException。如果该实体仍然连接到Hibernate会话,它将几乎加载整个数据库 我尝试使用Dozer CustomFieldMapper来确定属性是否为未加载的惰性Hibernate集合,然后返回NULL 但是,如果我们有双向关联,H

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

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

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

但是,如果我们有双向关联,Hibernate会急切地将多个加载到一方,Dozer会尝试复制属性,这将最终导致无限循环,从而导致堆栈溢出错误

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


是否有任何其他干净/更简单的方法来(取消)marshall Hibernate实体?

我在GWT应用程序中来回传递Hibernate的VO时遇到类似的问题,在一些项目中使用推土机取得了良好的效果,在其他项目中使用了中所述的方法,这基本上就是编组前的hibernate代理


希望帮助你,

p>听起来也许过于保守,但我认为使用DTOS仍然是个好主意。
映射的复杂性与资源API的粒度成正比,换句话说,越粗糙越复杂。

在这个类中获得一点好处:

我使用Jackson作为JSON序列化器/反序列化器,我必须创建这个类并为它添加Hibernate4模块,以验证是否初始化了Hibernate.isInitialized,并且不要意外地初始化属性

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


这对我来说很有魅力。

DTO在小心使用时仍然可以正常工作。当我想提供比实体更丰富的模型时,我倾向于使用它们,通常将不同的实体集中到一个更紧凑的模型中,可以很容易地进行交互,特别是在web层。我同意Gimby的观点。有时我们需要DTO来表示要在UI上显示的数据,UI可以是多个实体的集合。但是需要测试各种类型的关系映射。非常感谢。