在Spring中延迟加载DTO字段

时间:2009-01-29 05:41:38

标签: java spring jdbc lazy-loading

我有一个使用Spring的项目,并分为几十个DAO和相关的DTO。我正在使用JdbcTemplate,但不是很多,因为它正是我很满意的抽象级别。

我目前正在我的DTO上执行延迟加载,在其getter中添加一些相当毛茸茸的代码。

基本样板逻辑是: 1.如果field不为null,则返回其值并退出 2.联系相应的DAO并获取相关的DTO 3.将它们存放到下一次。

它的工作正常,只是我的低级DTO与一大堆DAO耦合在一起并且不那么POJOey。

如果我将逻辑放在DAO中,会出现另一个代码气味,因为它会为其DTO和延迟加载处理CRUD,而且据我所知,Objects应该只有一个责任。

我希望有一个相对简单的Spring方法可以用来在DAO和DTO之间注入一个Lazy Loader对象来实现这个目标,但任何其他解决方案对我都有用。

有什么想法吗?

2 个答案:

答案 0 :(得分:4)

围绕DAO包装DAO更容易......这取决于你想要带来多少模型。 DTO通常不会用来带一个到多个,作为两个或多个单独的数据库/ dao调用。在那种情况下,你真的想要一个ORM。既然你正在寻找道歉答案......

没有什么可以阻止你将DAO联系起来给你一个单一的DTO。将DTO连接到DAO更容易。它不是一个真正的服务层,它只是构建DAO的块。 所以你可能有一个PersonDao和一个TelephoneNumberDao。一个人可以拥有多个电话号码,所以你也可以拥有PersonModelDAo,它使用PersonDao和TelephoneNumberDao来完成它的工作。

或者,避免整个问题,不要尝试在DTO级别的人员和电话号码之间映射1-N。只需让您的UI正确调用正确的DAO即可。我在使用DTO的时候实际上更喜欢这个。

答案 1 :(得分:3)

引入一个包装DAO的服务层并处理诸如此类的问题是很常见的。如果您担心将过多的样板代码放入DTO来处理延迟加载,那么使用AOP可能是实现此目的的一种方法。您可能希望在编译时或加载时查看AspectJ并编织。由于您将直接修改字节码,因此您不必担心基于代理的AOP的性能开销。