2013-05-03 75 views
0

我有实体AA已设置实体B。我做了懒加载。当我加载所有A结果列表时,我需要为每个A设置一个瞬态值,该值为A的大小为B逻辑在道旁不是一个好习惯吗?

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

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

+4

为什么你不能在服务层做到这一点?事务应该在服务层中打开和关闭,而不是在DAO层中,所以懒加载不会导致任何问题。这就是说,这个瞬变变量的意义是什么,因为它会保持与A.getBs()。size()'相同的值。 – 2013-05-03 09:30:18

回答

3

如果你看看Hibernate count collection size without initializing你可以加载它的大小延迟加载集合

这似乎是它会满足你的要求......

+0

我试图将其定义为@LazyCollection(LazyCollectionOption.EXTRA)的懒惰集合 \t私有列表产品;但是得到了一个异常org.springframework.web.util.NestedServletException:请求处理失败;嵌套异常是org.hibernate.LazyInitializationException:未能懒惰地初始化一个角色集合:com.cellcity.cbtl.dao.domain.ProductCategory.products,无法初始化代理 - 没有会话....任何想法? – 2013-05-03 09:57:17

+0

快速谷歌表明这是一个交易问题。您已经到了需要向您的问题添加代码的地步,以便人们可以看到发生了什么......这可能只是LazyCollectionOption.EXTRA不适合您的方案。 – 2013-05-03 10:23:46

+0

感谢Paul.It的工作,当我设置@ManyToOne @LazyToOne(LazyToOneOption.PROXY)在许多方面。我认为这可能是因为我已经将mappedBy属性设置为One sides变量。 – 2013-05-03 10:47:04

1

休眠不需要是“全或无”解决方案。当你适合你的目的时,你可以自由选择直接JDBC。

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

或者你应该问自己为什么A的DAO需要一直保持B的大小。我认为DAO应该是无国籍的。为什么不是你的?也许应该重新考虑设计。我无法从你的问题中得知。

0

我的解决办法是在我ADao这样的方法:

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

的方法应该收集所有的外键到一个单一的SELECT语句,然后在一次加载所有B S和他们在分发代码他们属于。

这样,业务/服务代码可以决定应该加载哪一组A所有从属B s,并且所有这些组都可以一次加载。

编辑:声明“DAO中没有逻辑”是指“没有业务 DAO逻辑”。 DAO应该为您的业务/服务层提供对底层数据结构的快速和舒适的访问。但是如果你开始把业务逻辑放在那里,你最终会把自己扼杀在一个依赖的网络中。

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

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

或者DAO应该能够加载甚至完全无效的对象,并且所有验证都应该在业务层中进行?或者在用户界面层,当用户可以真正做些什么而不是无视盯着错误信息?

0

我认为你可以这样做,因为向你的实体添加额外的信息可以被看作是数据访问的一部分,而不是业务逻辑。

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

相关问题