0

我有实体A并且A有一组实体B。我做延迟加载。当我加载所有A结果列表时,我需要为每个A大小为Bfor that的结果列表设置一个瞬态值A

在服务层我不能这样做,因为我执行了延迟加载。我必须在dao侧面设置瞬态值。但我听说没有逻辑dao

我该怎么办?任何解释表示赞赏。

4

4 回答 4

3

如果您在未初始化的情况下查看Hibernate 计数集合大小,则可以将延迟加载的集合与其大小一起加载

看起来它会满足你的要求......

于 2013-05-03T09:32:44.857 回答
1

Hibernate 不必是“全有或全无”的解决方案。当适合您的目的时,您可以自由选择直接 JDBC。

我建议SELECT COUNT() FROM B在您选择的 DAO 中编写那个简单的查询并继续处理。

或者也许你应该问自己为什么 A 的 DAO 总是需要 B 的大小。我认为 DAO 应该是无国籍的。为什么不是你的?也许应该重新考虑设计。从你的问题我看不出来。

于 2013-05-03T09:30:20.007 回答
0

我的解决方案将是我的这样一种方法ADao

 public void loadBs( Collection<A> as ) {
 }

该方法中的代码应该将所有外键收集到单个 select 语句中,然后B一次加载所有 s 并将它们分发到A它们所属的 s 上。

这样,业务/服务代码可以决定应该加载哪一组A所有依赖项,并且可以一次性加载所有依赖项。B

编辑:语句“DAO 中没有逻辑”是指“DAO 中没有业务逻辑”。DAO 应该为您的业务/服务层提供对底层数据结构的快速、舒适的访问。但是,如果您开始将业务逻辑移到那里,您最终会在依赖关系网络中扼杀自己。

一个很好的例子是一些对象有一个“有效的时间范围”。时间范围被定义为,start < end但将此检查移至 DAO 是否是个好主意?

如果您尝试加载要编辑的对象,例如名称但时间范围无效,会发生什么情况?如果 DAO 层拒绝加载这样一个无效的对象,它真的有用吗?

或者 DAO 是否应该能够加载甚至完全无效的对象,并且所有验证都应该发生在业务层中?或者在 UI 层,当用户实际上可以做一些事情而不是无助地盯着错误消息时?

于 2013-05-03T09:37:45.860 回答
0

我认为您可以这样做,因为将那条额外信息添加到您的实体可以被视为数据访问的一部分,而不是业务逻辑。

但这只是关于违反设计原则的问题。Paul D'Ambra 建议利用 hibernate 的潜力来满足您的需求,这似乎是一个更优雅的解决方案。

于 2013-05-03T09:41:29.207 回答