在 Spring 中延迟加载 DTO 字段

Posted

技术标签:

【中文标题】在 Spring 中延迟加载 DTO 字段【英文标题】:Lazy Loading DTO fields in Spring 【发布时间】:2009-01-29 05:41:38 【问题描述】:

我有一个使用 Spring 的项目,它被分解为几十个 DAO 和相关的 DTO。我正在使用 JdbcTemplate,但仅此而已,因为它正是我满意的抽象级别。

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

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

除了我的低级 DTO 与一大堆 DAO 相结合而且不是那么 POJOey 之外,它工作得很好。

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

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

有什么想法吗?

【问题讨论】:

【参考方案1】:

将 DAO 包裹在 DAO 周围会更容易……这取决于您想要引入多少模型。 DTO 通常不用于将一对多的操作作为两个或多个单独的数据库/dao 调用。在那种情况下,你真的想要一个 ORM。既然你在找道的答案……

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

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

【讨论】:

我喜欢这个答案 (+1) 失去 person.getTelephoneNumbers() 的清晰度是一种耻辱【参考方案2】:

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

【讨论】:

以上是关于在 Spring 中延迟加载 DTO 字段的主要内容,如果未能解决你的问题,请参考以下文章

Spring MVC灵活控制返回json的值(自定义过滤字段)

Jpa/Hibernate 字节码增强:字段延迟加载

在 Spring Boot jpa 中将延迟加载的对象转换为 JSON

Lazy<T>的应用之类内部字段与C#延迟加载

延迟加载有效,但不应该

spring中怎么实现过滤器和监听器?