Java 在Spring中将数据延迟加载到字段

Java 在Spring中将数据延迟加载到字段,java,spring,jdbc,lazy-loading,Java,Spring,Jdbc,Lazy Loading,我有一个使用Spring的项目,它被分解成几十个DAO和相关的DTO。我使用的是JdbcTemplate,但没有太多其他功能,因为这正是我所满意的抽象级别 目前,我正在对DTO执行延迟加载,方法是在它们的getter中放置一些相当复杂的代码 基本样板逻辑是: 1.如果字段不为null,则返回其值并退出 2.联系适当的DAO并获取相关的DTO 3.保存到下次 它工作得很好,只是我的低级DTO与一大堆DAO结合在一起,并不是那么简单 如果我将逻辑放在DAO中,则会出现另一种代码味道,因为它将同时处理

我有一个使用Spring的项目,它被分解成几十个DAO和相关的DTO。我使用的是JdbcTemplate,但没有太多其他功能,因为这正是我所满意的抽象级别

目前,我正在对DTO执行延迟加载,方法是在它们的getter中放置一些相当复杂的代码

基本样板逻辑是: 1.如果字段不为null,则返回其值并退出 2.联系适当的DAO并获取相关的DTO 3.保存到下次

它工作得很好,只是我的低级DTO与一大堆DAO结合在一起,并不是那么简单

如果我将逻辑放在DAO中,则会出现另一种代码味道,因为它将同时处理DTO的CRUD和延迟加载,而且据我所知,对象应该有一个单独的责任

我希望有一种相对简单的Spring方法,我可以使用它在DAO和DTO之间注入一个惰性加载程序对象来实现这一点,但任何其他解决方案都适合我


有什么想法吗?

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

围绕DAO更容易。。。这取决于你想展示多少模型。 DTO通常不用于实现一对多,因为有两个或多个单独的数据库/dao调用。在这种情况下,你真的需要一个ORM。既然你在寻找一把刀的答案

并没有什么能阻止你们将DAO链接在一起,给你们一个DTO。将DTO连接到DAO更容易。它不是真正的服务层,它只是DAO的构建块。 所以你可能有一个人的名字和一个电话号码。一个人可以有不止一个电话号码,所以你也可以有PersonModelDAo,在引擎盖下使用PersonDao和电话号码Dao来完成工作

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

我喜欢这个答案(+1)失去人的清晰度真是太遗憾了。getTelephoneNumbers()