当前位置: 首页 > 面试题库 >

是否应该将实体转换为Repository对象内的DTO并将其返回到服务层?

谷梁德容
2023-03-14
问题内容

我试图在这里得到两个非常相似的问题的答案:

我应该将实体转换为Repository对象内的DTO并将其返回到服务层吗?

要么

从存储库层返回DTO对象可以吗?

现在,我被困在Servlet(服务层)中,例如,尝试从中检索所有Restaurant对象RestaurantOwnerRepository

// RestaurantOwnerService (Servlet)

@Override
@Transactional
public List<RestaurantDTO> getAvailableRestaurants() {

    List<Restaurant> availableRestaurants = restaurantOwnerRepository.getRestaurants(getSessionId());

    return null;
}

Restaurant@Entity注释的类在哪里-
这似乎是我不应该做的第一件事,因为服务层现在知道一个非常低级的对象,恕我直言违反了在每一层抽象我的数据的尝试。

如果我将每个实例都转换RestaurantRestaurantDTO-,则不是这种情况,但我应该这样做吗?

基本上改变:

// RestaurantOwnerRepository

@Override
public List<Restaurant> getRestaurants(String sessionId) {

    RestaurantOwner restaurantOwner = this.get(sessionId);

    // .. getting restaurants ..

    return availableRestaurants;
}

// RestaurantOwnerRepository

@Override
public List<Restaurant> getRestaurants(String sessionId) {

    RestaurantOwner restaurantOwner = this.get(sessionId);

    // .. getting restaurants ..

    return ConvertEntity.convertRestaurants(availableRestaurants);
}

并有一个实用程序ConvertEntity每个 这样的,例如实体:

public class ConvertEntity {

    public static List<RestaurantDTO> convertRestaurants(List<Restaurant> restaurants) {
        // ...
    }

}

但是,这对我而言并不是最佳的解决方案。.在这里我该怎么办?

值得一提的 是,这来自GWT项目。这意味着我正在RestaurantDTO服务器和客户端上使用它,因为它包含在 共享 项目中。


问题答案:

在您发表评论后,现在更加清楚。让我们再试一次:

首先,进行一些澄清:
RestaurantOwnerRepository实现存储库模式。带@Entity注释的对象是休眠实体,也是DAO代理。您RestaurantOwnerService是GWT服务,该服务只能返回与客户端和服务器共享的DTO。

因此,在非常简单的服务器端设置中 ,您具有一个DB-Backend,可以通过hibernate作为持久层访问数据,而通过服务层作为rest-
service。在这种设置中,您的休眠实体在整个服务器端代码之间共享。例如,您的服务层正在将实体转换为json格式。好吗

您的“高级”设置

  • 持久层
    • 与Hibernate(传递@Entity注释的对象)
    • 也许还有其他东西
  • 信息库层(不清楚要返回什么)
  • 服务层(GWT Servlet,提供与客户端共享的DTO)

Repository-Layer的定义:
在我看来,它是针对不同数据/持久层的抽象。它不提供业务逻辑,这更多的是进一步业务层的目的。业务层将上层的输出汇总在一起,进行计算并返回结果。但是根据您的评论来看,您的存储库层也可能是这种情况。但是我们可以澄清。

您的问题: 是否可以从存储库层返回DTO对象?

答: 不,从“存储库”层返回DTO并不是真的可以。

原因:
1.您的DTO是一个域实体,已转换为可以发送到客户端的格式。它有局限性,因此不能在其中使用某些服务器端库。2.考虑您还想提供其他服务层的情况。也许是一个REST接口,也许是另一个GUI框架。它们对于转移域实体都有各自的限制。您是否真的要为每个服务层复制存储库层?3.考虑要扩展存储库/业务层以使其使用的输出的情况RestaurantOwnerRepository。您真的要在那里工作DTO吗?

这就是为什么创建DTO是服务层的目的。因此,DTO在客户端和您的服务层之间共享。同样,您需要在服务层和存储库层之间共享的对象。我称这些领域实体。这些从存储库层返回并由服务层使用。再次在存储库层和持久性层之间相同。例如,持久层返回在存储层上使用的Hibernate实体。

在大多数情况下,可以从多层向下传播对象。因此,您可以将休眠实体从存储库层返回到服务层。较新版本的GWT甚至允许通过特殊设置在客户端使用JPA实体。因此,您的服务层可以进一步返回您的持久性实体。



 类似资料:
  • 我在这里试图得到两个非常相似的问题的答案: 我是否应该在存储库对象中将实体转换为DTO,并将其返回到服务层? 其中是一个注释类-这似乎是我不应该做的第一件事,因为服务层现在知道了一个非常低级别的对象,它违反了在每一层抽象数据的尝试。 如果我将每个转换为,情况就不是这样了--但是我应该这样做吗? 基本改变: 但这对我来说不是最好的解决办法…我在这里能做什么? 要提到的一件重要事情是,它来自GWT项目

  • 我有JPA持久实体wjich有50个字段。有时我需要将所有50个字段显示到用户界面,或者有时比这少得多。 我能想到两种方法 方法1:- 我将继续将实体返回到UI。有一些方法(带有注释)可以让我提到需要返回下的哪些特定字段 例子:- 如果我想在将json返回到浏览器之前忽略Employee类中的,我将创建,其中包含所需的,如下所示 方法2:- 我将制作新的POJO,再次包含所有5o字段,并返回到UI

  • 我有一个项目,我需要在数据库中存储用户。我正在使用Hibernate,在模块的某些部分中,也在实验性地使用Spring数据JPA。我有一个用于注册客户的RESTendpoint,并在那里接收UserDTO对象。之后,在其他服务中,我需要将其转换为UserEntity并保存在数据库中。 现在我创建了用户设置页面,我需要显示一些关于登录用户的信息。我不想发送UserDTO对象,因为有太多的数据,所以我

  • 我正在尝试将复杂的实体转换为Dto。我想从DTO中删除实体中的一些值。 我的实体看起来像这样(为了简单起见,省略了实体的大部分): 我找到了一个对简单实体非常有效的解决方案:将实体转换为数据。如果我采纳了自定义拦截器的建议,删除id或整个item属性就可以了。 我尝试了两种方法来定义我的DTO: < li >它仅返回id和整个项目。 现在的问题是我只想删除 item 属性中的某些值。例如,私有字段

  • 首先,我是SpringWebFlux的新手,正在尝试建立一个反应式spring启动项目的POC。我有一个用例,需要将检索到的实体类(PartyDTO)转换为Mono对象(Person:这是一个没有构造函数的第三方业务对象,我无法修改它)。我在谷歌上搜索,但找不到与我的用例相匹配的答案。 第三方对象: 我的课程如下: 调用我的存储库的服务类。 如上图所示,我尝试将平面图与我的自定义映射器一起使用,但

  • 我有以下几门课: 我希望能够有一个具有JSON格式的文件,这样: 该文件是所有对象的列表。所以我试图创建两种方法: 将转换为JSON文件的方法。 方法,该方法将JSON文件读入。 在Java 8中实现这一点的最佳方式(最优雅的方式)是什么?我是否需要向类添加一些方法?还是有别的办法? 既然它是一个只包含字符串的对象列表,那么有什么优雅的东西吗?