【发布时间】:2014-05-08 00:07:47
【问题描述】:
这个问题有点尴尬。我有一个带有评论的主题(论坛上的一些谈话),每个评论可以有多个审核标志。
使用 JBoss,我使用 RestEasy 发出 RESTful Web 服务请求。 Jackson 技术将我的主题转换为 JSON。
我查找主题的请求是:
Select s from Subject s JOIN FETCH s.comments WHERE s.id = :id
问题是每个评论现在都有一个PersistentBag 而不是一个列表,并且 JBoss 抛出:
org.codehaus.jackson.map.JsonMappingException:
failed to lazily initialize a collection of role: io.robusta.fora.domain.Comment.flags, no session or session was closed (through reference chain:
java.util.ArrayList[0]
->io.robusta.fora.domain.Subject["comments"]
->org.hibernate.collection.internal.PersistentBag[0]
->io.robusta.fora.domain.Comment["flags"])
事实上,我只是想在此特定请求中忽略这些标志。所以我所做的很糟糕,但很有效:
for (Comment c : comments ){c.setFlags(new ArrayList<Flag>());}
但是为了避免这个可怕的循环,有没有办法在 JPQL 查询中强制这个空值?
【问题讨论】:
-
另一种方法是限制Json序列化的深度,但是因为Json比较复杂,我可能需要在另一个分支更深入
-
使用 Jackson 视图或 mixin,甚至将您的主题转换为包含您想要序列化的数据的 DTO,而不是更多。
-
我不想要技术答案,因为我也可以使用 mustache 模板引擎。而且我不想围绕每个域对象创建 3-4 个 DTO,因为有一天我不需要标志,然后不需要帐户等。
-
尝试在 Comment 实体中将标志初始化为 ArrayList? private List
flags = new ArrayList ();