在说出“指定查询中的获取类型”之类的内容之前,请先阅读以下内容。那不是我所追求的。
我正在寻找一种方法来急切加载完整的对象图(对象+它的所有子对象以及它们的所有子对象等等)。
I do not想要枚举要加载的所有属性。直到运行时我才认识它们。
N+1 查询不是问题。但在这个神奇的操作结束时,我不希望在我的图中留下单个代理或惰性集合。
应该可以编写一些代码来反思性地、递归地查看所有属性。但集合让这变得尴尬和复杂。
有些人推荐使用 Dozer 来做这种事情,但这似乎有点过分,所以我想把它留作最后的手段。
一个简单的解决方案是指定lazy="false"
对于所有集合(1:N 和 N:M)和关联 (1:1)。
这会将整个图加载到内存中每笔交易。因此,为了使其正常工作,您最多应该有一笔交易,否则会非常非常严重地损害性能。
虽然这可以满足您的要求,但成本可能太高。请注意,您可以使用“获取配置文件”在运行时选择不同的策略,但当您请求对象时,Hibernate 总是为您提供一个副本供您使用,因此它每次都必须复制图表。
对我来说,这听起来 Hibernate 根本不是完成这项任务的工具。使用 Hibernate 映射实体很方便,但代价是 Hibernate 会泄漏到您的模型和业务代码中。如果 Hibernate 施加的限制不符合您的要求,那么您应该寻找其他地方。
也许你可以和Record
类型而不是完全充实的 Java bean。如果是这样,那么你可以看看jOOQ http://www.jooq.org/ or 实现“活动记录”模式的框架 https://stackoverflow.com/questions/610590/is-there-a-java-implementation-of-the-activerecord-pattern-that-is-built-on-top.
如果您需要 beans 并且不限于某种类型的数据库,请尝试 OO 数据库,例如db4o http://www.db4o.com/.
最后,为什么要使用 SQL?如果您始终需要整个对象图,为什么不简单地将其序列化到文件并在启动时加载它呢?或者使用一个内存驻留数据库 http://www.edval.biz/memory-resident-programming-object-databases.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)