在Hibernate中在运行时急切加载整个对象图

Nim*_*Nim 5 java hibernate lazy-loading eager-loading

请在继续说"查询查询中的提取类型"之前阅读.那不是我追求的.

我正在寻找一种方法来急切加载一个完整的对象图(对象+所有子对象及其所有子对象等).

希望枚举要加载的所有属性.直到运行时我才知道它们.

N + 1个查询不是问题.但是在这个神奇的操作结束时,我不想在我的图表中留下单个代理或惰性集合.

应该可以编写一些反射和递归查看所有属性的代码.但是收藏会使这种尴尬和复杂.

有些人推荐Dozer这种东西,但这似乎有点过分,所以我想把它作为最后的手段保存.

Aar*_*lla 0

一个简单的解决方案是指定lazy="false"所有集合(1:N 和 N:M)和关联(1:1)。

这会将每个事务的整个图表加载到内存中。因此,为了使其正常工作,您最多应该有一笔交易,否则会非常非常严重地损害性能。

虽然这可以满足您的要求,但成本可能太高。请注意,您可以使用“获取配置文件”在运行时选择不同的策略,但当您请求对象时,Hibernate 总是为您提供一个副本供您使用,因此它每次都必须复制图表。

对我来说,这听起来 Hibernate 根本不是完成这项任务的工具。使用 Hibernate 映射实体很方便,但代价是 Hibernate 会泄漏到您的模型和业务代码中。如果 Hibernate 施加的限制不符合您的要求,那么您应该寻找其他地方。

也许您可以接受Record类型而不是完全充实的 Java bean。如果是这样,那么您可以查看jOOQ实现“活动记录”模式的框架

如果您需要 bean 并且不限于某种类型的数据库,请尝试 OO 数据库,例如db4o

最后,为什么要使用 SQL?如果您始终需要整个对象图,为什么不简单地将其序列化到文件并在启动时加载它呢?或者使用内存驻留数据库