是否应该将实体转换为Repository对象内的DTO并将其返回到服务层?
我试图在这里得到两个非常相似的问题的答案:
我应该将实体转换为Repository对象内的DTO并将其返回到服务层吗?
要么
从存储库层返回DTO对象可以吗?
现在,我被困在Servlet(服务层)中,例如,尝试从中检索所有Restaurant
对象RestaurantOwnerRepository
:
// 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);
}
并有一个实用程序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实体。因此,您的服务层可以进一步返回您的持久性实体。
以上是 是否应该将实体转换为Repository对象内的DTO并将其返回到服务层? 的全部内容, 来源链接: utcz.com/qa/415710.html