这里有无数问题,如何通过急切取回、保持事务打开、打开另一个事务、OpenEntityManagerInViewFilter
等方式解决“无法初始化代理”的问题。
但是,是否可以简单地告诉Hibernate忽略这个问题,并假装集合为空?在我的情况下,不在获取它之前意味着我不关心它。
实际上,这是一个带有以下Y的XY问题:
我有像这样的类
class Detail {
@ManyToOne(optional=false) Master master;
...
}
class Master {
@OneToMany(mappedBy="master") List<Detail> details;
...
}
我想提供两种请求:一种返回单个具有其所有细节的master
,另一种返回没有details
的master
列表。结果由Gson转换为JSON。
我尝试了session.clear
和session.evict(master)
,但它们不会影响代替details
使用的代理。有效的方法是:
master.setDetails(nullOrSomeCollection)
这种方法感觉有点狡猾。我更喜欢“忽略”,因为它可以普遍适用,而不需要知道代理了哪些部分。
编写一个 Gson TypeAdapter
,忽略具有 initialized=false
的 AbstractPersistentCollection
实例可能是一种方式,但这将依赖于org.hibernate.collection.internal
,这肯定不是什么好事情。在 TypeAdapter
中捕获异常似乎也不太好。
在得到一些答案之后更新
我的目标不是“获取已加载的数据而不是异常”,而是“如何获取< strong > null 而不是异常”
Dragan 提出了 一个合理的观点,即忘记获取并返回错误数据比抛出异常更糟糕。但是有一个简单的解决方法:
- 只对集合执行此操作
- 永远不要使用
null
(空指针) - 返回
null
而不是空集合,以表示未获取的数据
这样,结果就永远不会被错误解释。如果我忘记获取某些内容,响应将包含null
,这是无效的。