1

问题有点尴尬。我有一个带有评论的主题(论坛上的一些谈话),每个评论可以有多个审核标志。

使用 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 查询中强制这个空值?

4

1 回答 1

1

您不能告诉 Hibernate 简单地忽略集合的存在:它将使用自己的集合实现(PersistentBag 或 PersistentList)进行代理,并填充或不填充数据。
我认为这取决于您的序列化程序来考虑它。

您可以在 Jackson 中编写一个自定义序列化程序,分配给flags集合,该序列化程序将使用方法Hibernate.isInitialized()检查集合是否已初始化,以决定是否对其进行序列化。(但这是一个技术答案......)

于 2014-05-07T16:07:47.290 回答