我有实体A
和A
已设置实体B
。我做了懒加载。当我加载所有A
结果列表时,我需要为每个A
设置一个瞬态值,该值为A
的大小为B
。逻辑在道旁不是一个好习惯吗?
在服务层我不能这样做,因为我执行了延迟加载。我必须在dao
一侧设置瞬态值。但我听说dao
方面没有逻辑。
我该怎么办?任何解释赞赏。
我有实体A
和A
已设置实体B
。我做了懒加载。当我加载所有A
结果列表时,我需要为每个A
设置一个瞬态值,该值为A
的大小为B
。逻辑在道旁不是一个好习惯吗?
在服务层我不能这样做,因为我执行了延迟加载。我必须在dao
一侧设置瞬态值。但我听说dao
方面没有逻辑。
我该怎么办?任何解释赞赏。
如果你看看Hibernate count collection size without initializing你可以加载它的大小延迟加载集合
这似乎是它会满足你的要求......
我试图将其定义为@LazyCollection(LazyCollectionOption.EXTRA)的懒惰集合 \t私有列表
快速谷歌表明这是一个交易问题。您已经到了需要向您的问题添加代码的地步,以便人们可以看到发生了什么......这可能只是LazyCollectionOption.EXTRA不适合您的方案。 – 2013-05-03 10:23:46
感谢Paul.It的工作,当我设置@ManyToOne @LazyToOne(LazyToOneOption.PROXY)在许多方面。我认为这可能是因为我已经将mappedBy属性设置为One sides变量。 – 2013-05-03 10:47:04
休眠不需要是“全或无”解决方案。当你适合你的目的时,你可以自由选择直接JDBC。
我建议在你选择的DAO中写入那个简单的SELECT COUNT() FROM B
查询,并继续处理事情。
或者你应该问自己为什么A的DAO需要一直保持B的大小。我认为DAO应该是无国籍的。为什么不是你的?也许应该重新考虑设计。我无法从你的问题中得知。
我的解决办法是在我ADao
这样的方法:
public void loadBs(Collection<A> as) {
}
的方法应该收集所有的外键到一个单一的SELECT语句,然后在一次加载所有B
S和他们在分发代码他们属于。
这样,业务/服务代码可以决定应该加载哪一组A
所有从属B
s,并且所有这些组都可以一次加载。
编辑:声明“DAO中没有逻辑”是指“没有业务 DAO逻辑”。 DAO应该为您的业务/服务层提供对底层数据结构的快速和舒适的访问。但是如果你开始把业务逻辑放在那里,你最终会把自己扼杀在一个依赖的网络中。
一个很好的例子是一些对象具有“有效时间范围”。时间范围定义为start < end
,但将此检查移入DAO是个好主意吗?
如果您尝试加载要编辑的对象,比如说,它的名称但时间范围无效,会发生什么情况?如果DAO层拒绝加载这样的无效对象,它会非常有用吗?
或者DAO应该能够加载甚至完全无效的对象,并且所有验证都应该在业务层中进行?或者在用户界面层,当用户可以真正做些什么而不是无视盯着错误信息?
我认为你可以这样做,因为向你的实体添加额外的信息可以被看作是数据访问的一部分,而不是业务逻辑。
但这只是关于违反设计原则的问题。 Paul D'Ambra建议利用hibernate的潜力满足您的需求,这似乎是一个更优雅的解决方案。
为什么你不能在服务层做到这一点?事务应该在服务层中打开和关闭,而不是在DAO层中,所以懒加载不会导致任何问题。这就是说,这个瞬变变量的意义是什么,因为它会保持与A.getBs()。size()'相同的值。 – 2013-05-03 09:30:18