gpt4 book ai didi

java - 我应该将一个实体转换为 Repository 对象中的 DTO 并将其返回给服务层吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:15:14 25 4
gpt4 key购买 nike

我想在这里找到两个非常相似的问题的答案:

Should I convert an entity to a DTO inside a Repository object and return it to the Service Layer?

Is it okay to return DTO objects from the Repository Layer?

现在我卡在我的 Servlet(Servie 层)中,例如尝试从 RestaurantOwnerRepository 中检索所有 Restaurant 对象:

// RestaurantOwnerService (Servlet)

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

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

return null;
}

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

如果我例如将每个 Restaurant 转换为 RestaurantDTO - 但我应该这样做吗?

基本改变:

// 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);
}

并为 每个 实体设置一个 util ConvertEntity,例如:

public class ConvertEntity {

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

}

但这对我来说并不是最好的解决方案..我能在这里做什么?


需要提及的一件重要事情 是它来自一个 GWT 项目。这意味着我正在使用例如RestaurantDTO 在服务器端和客户端,因为它包含在一个共享 项目中。

最佳答案

你发表评论后现在更清楚了。让我们再试一次:

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

因此,在一个非常简单的服务器端设置中,您有一个数据库后端,通过作为持久层的 hibernate 访问数据,以及作为休息服务的服务层。在这样的设置中,您的 hibernate 实体在整个服务器端代码之间共享。例如,您的服务层正在将实体转换为 json 格式。成交?

您的“高级”设置

  • 持久层
    • 使用 Hibernate(传递@Entity-Annotated 对象)
    • 也许还有其他东西
  • 存储库层(你不清楚要返回什么)
  • 服务层(GWT Servlets,提供与客户端共享的 DTO)

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

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

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

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

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

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

关于java - 我应该将一个实体转换为 Repository 对象中的 DTO 并将其返回给服务层吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31743017/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com