我有实体A
并且A
有一组实体B
。我做延迟加载。当我加载所有A
结果列表时,我需要为每个A
大小为B
for that的结果列表设置一个瞬态值A
。
在服务层我不能这样做,因为我执行了延迟加载。我必须在dao
侧面设置瞬态值。但我听说没有逻辑dao
。
我该怎么办?任何解释表示赞赏。
如果您在未初始化的情况下查看Hibernate 计数集合大小,则可以将延迟加载的集合与其大小一起加载
看起来它会满足你的要求......
Hibernate 不必是“全有或全无”的解决方案。当适合您的目的时,您可以自由选择直接 JDBC。
我建议SELECT COUNT() FROM B
在您选择的 DAO 中编写那个简单的查询并继续处理。
或者也许你应该问自己为什么 A 的 DAO 总是需要 B 的大小。我认为 DAO 应该是无国籍的。为什么不是你的?也许应该重新考虑设计。从你的问题我看不出来。
我的解决方案将是我的这样一种方法ADao
:
public void loadBs( Collection<A> as ) {
}
该方法中的代码应该将所有外键收集到单个 select 语句中,然后B
一次加载所有 s 并将它们分发到A
它们所属的 s 上。
这样,业务/服务代码可以决定应该加载哪一组A
所有依赖项,并且可以一次性加载所有依赖项。B
编辑:语句“DAO 中没有逻辑”是指“DAO 中没有业务逻辑”。DAO 应该为您的业务/服务层提供对底层数据结构的快速、舒适的访问。但是,如果您开始将业务逻辑移到那里,您最终会在依赖关系网络中扼杀自己。
一个很好的例子是一些对象有一个“有效的时间范围”。时间范围被定义为,start < end
但将此检查移至 DAO 是否是个好主意?
如果您尝试加载要编辑的对象,例如名称但时间范围无效,会发生什么情况?如果 DAO 层拒绝加载这样一个无效的对象,它真的有用吗?
或者 DAO 是否应该能够加载甚至完全无效的对象,并且所有验证都应该发生在业务层中?或者在 UI 层,当用户实际上可以做一些事情而不是无助地盯着错误消息时?
我认为您可以这样做,因为将那条额外信息添加到您的实体可以被视为数据访问的一部分,而不是业务逻辑。
但这只是关于违反设计原则的问题。Paul D'Ambra 建议利用 hibernate 的潜力来满足您的需求,这似乎是一个更优雅的解决方案。