我在这里试图得到两个非常相似的问题的答案:
我是否应该在存储库对象中将实体转换为DTO,并将其返回到服务层?
// RestaurantOwnerService (Servlet)
@Override
@Transactional
public List<RestaurantDTO> getAvailableRestaurants() {
List<Restaurant> availableRestaurants = restaurantOwnerRepository.getRestaurants(getSessionId());
return null;
}
其中Restaurant
是一个@Entity
注释类-这似乎是我不应该做的第一件事,因为服务层现在知道了一个非常低级别的对象,它违反了在每一层抽象数据的尝试。
如果我将每个餐厅
转换为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);
}
public class ConvertEntity {
public static List<RestaurantDTO> convertRestaurants(List<Restaurant> restaurants) {
// ...
}
}
但这对我来说不是最好的解决办法…我在这里能做什么?
要提到的一件重要事情是,它来自GWT项目。这意味着我在服务器和客户端使用RestaurantDto
,因为它包含在共享项目中。
在你的评论之后,现在更清楚了。我们再试一次:
首先,一些澄清:您的RestaurantownerRepository
实现了存储库模式。您的@entity
注释对象是hibernate实体,也是DAO代理。您的RestaurantownerService
是一个GWT服务,只能返回与客户机和服务器共享的DTO。
因此,在一个非常简单的服务器端设置中,您有一个DB-Backend,通过hibernate作为持久层访问数据,还有一个服务层作为REST-Service。在这样的设置中,您的hibernate实体在整个服务器端代码中共享。例如,您的服务层正在将实体转换为json格式。成交?
您的“高级”设置
存储库层的定义:在我看来,它是对不同数据/持久层的抽象。它不提供业务逻辑,这更多是进一步业务层的目的。业务层将上层的输出一起编译,进行计算并返回结果。但是根据您的评论来看,这可能也是您的存储库层的情况。但我们可以澄清。
您的问题是:从存储库层返回DTO对象可以吗?
回答:不,从“存储库”层返回DTO是不合适的。
原因:1。您的DTO是一个域实体,它被转换成一种可以发送到客户端的格式。它有一些限制,以至于不能在其中使用一些服务器端库。2.考虑您还希望提供其他服务层的情况。可能是一个REST接口,也可能是另一个GUI框架。它们在转移域实体方面都有自己的局限性。您真的想为每个服务层复制存储库层吗?3.考虑这样一种情况:您希望扩展存储库/业务层,以便它将使用RestaurantownerRepository
的输出。你真的想在那里做DTOs吗?
这就是为什么创建DTO是服务层的目的。因此,DTO在客户端和服务层之间共享。在同样的意义上,您需要在服务层和存储库层之间共享的对象。我称这些域实体。这些从存储库层返回并由服务层使用。同样,存储库层和持久层之间也是如此。例如,持久层返回存储库层上使用的Hibernate实体。
在大多数情况下,从多个层向下传播对象是可以的。因此可以将hibernate实体从存储库层返回到服务层。更新版本的GWT甚至允许在客户端使用具有特殊设置的JPA实体。因此,您的服务层可以进一步返回您的持久性实体。
问题内容: 我试图在这里得到两个非常相似的问题的答案: 我应该将实体转换为Repository对象内的DTO并将其返回到服务层吗? 要么 从存储库层返回DTO对象可以吗? 现在,我被困在Servlet(服务层)中,例如,尝试从中检索所有对象: 带注释的类在哪里- 这似乎是我不应该做的第一件事,因为服务层现在知道一个非常低级的对象,恕我直言违反了在每一层抽象我的数据的尝试。 如果我将每个实例都转换为
我有JPA持久实体wjich有50个字段。有时我需要将所有50个字段显示到用户界面,或者有时比这少得多。 我能想到两种方法 方法1:- 我将继续将实体返回到UI。有一些方法(带有注释)可以让我提到需要返回下的哪些特定字段 例子:- 如果我想在将json返回到浏览器之前忽略Employee类中的,我将创建,其中包含所需的,如下所示 方法2:- 我将制作新的POJO,再次包含所有5o字段,并返回到UI
问题内容: 实体在返回控制器之前应该转换为Dto吗? 问题答案: 有一千种方法来做某事,并且对什么是最好的方法也有很多看法。但是没有最好的方法,一切都有优点和缺点。请记住这一点! 通常,你具有不同的层: 持久层存储数据 业务层来处理数据 表示层公开数据 通常,每个层都将使用其自己的对象类型: 持久层:存储库,实体 业务层:服务,域对象 表示层:控制器,DTO 这意味着每一层只能使用其自己的对象,而
数据是非常小的,就像水果的列表,不会经常改变,也只有一个服务将使用这个数据和服务到其他服务,请提到您的方法的优点和缺点。
很容易包括它,但我认为这可能是有原因的。 当响应不包括XML声明时,Edge浏览器不显示XML: 当响应包含xml声明,但声明中的编码与响应编码不匹配时,它也会以“无法切换编码”而失败:
我有一个项目,我需要在数据库中存储用户。我正在使用Hibernate,在模块的某些部分中,也在实验性地使用Spring数据JPA。我有一个用于注册客户的RESTendpoint,并在那里接收UserDTO对象。之后,在其他服务中,我需要将其转换为UserEntity并保存在数据库中。 现在我创建了用户设置页面,我需要显示一些关于登录用户的信息。我不想发送UserDTO对象,因为有太多的数据,所以我