我已经阅读了很多关于这些内容的内容,而且我目前正在开发一个更大的Web应用程序及其相应的后端.
但是,我开始使用一种设计,我要求Repository从数据库中获取数据并将其映射到DTO.为何选择DTO?仅仅因为到目前为止基本上一切都是简单的东西,不再需要复杂性.如果它有点复杂,那么我开始直接在服务层中映射例如1到n的关系.就像是:
// This is Service-Layer
public List<CarDTO> getCarsFromOwner(Long carOwnerId) {
// Entering Repository-Layer
List<CarDTO> cars = this.carRepository = this.carRepository.getCars(carOwnerId);
Map<Long, List<WheelDTO>> wheelMap = this.wheelRepository.getWheels(carId);
for(CarDTO car : cars) {
List<WheelDTO> wheels = wheelMap.get(car.getId());
car.setWheels(wheels);
}
return cars;
}
Run Code Online (Sandbox Code Playgroud)
这当然是有效的,但事实证明,有时事情变得比这更复杂,我开始意识到,如果我不对此做任何事情,代码可能看起来很丑陋.
当然,我可以加载wheelMap,在CarRepository那里进行轮映射,只返回完整的对象,但由于SQL查询有时看起来很复杂,我不想获取所有cars 和他们的wheels加号处理映射getCars(Long ownerId).
我显然错过了商业层,对吗?但我根本无法理解其最佳实践.
我们假设我有Car一个Owner业务对象.我的代码看起来像这样:
// This is Service-Layer
public List<CarDTO> getCarsFromOwner(Long carOwnerId) {
// The new Business-Layer
CarOwner carOwner = new CarOwner(carOwnerId);
List<Car> …Run Code Online (Sandbox Code Playgroud) 我想在这里找到两个非常相似的问题的答案:
我应该将实体转换为Repository对象内的DTO并将其返回到服务层吗?
要么
可以从存储库层返回DTO对象吗?
现在我被困在我的Servlet(Servie层)中,例如尝试从以下位置检索所有Restaurant对象RestaurantOwnerRepository:
// RestaurantOwnerService (Servlet)
@Override
@Transactional
public List<RestaurantDTO> getAvailableRestaurants() {
List<Restaurant> availableRestaurants = restaurantOwnerRepository.getRestaurants(getSessionId());
return null;
}
Run Code Online (Sandbox Code Playgroud)
这里Restaurant是一个@Entity注释的类 - 这似乎是我不应该做的第一件事,因为服务层现在知道一个非常低级别的对象,它违反了在每个层中抽象数据的尝试.
如果我将每个转换Restaurant为a,那就不会是这种情况RestaurantDTO - 但是我应该这样做,这样了吗?
基本上改变:
// RestaurantOwnerRepository
@Override
public List<Restaurant> getRestaurants(String sessionId) {
RestaurantOwner restaurantOwner = this.get(sessionId);
// .. getting restaurants ..
return availableRestaurants;
}
Run Code Online (Sandbox Code Playgroud)
至
// RestaurantOwnerRepository
@Override
public List<Restaurant> getRestaurants(String sessionId) {
RestaurantOwner restaurantOwner = this.get(sessionId);
// .. getting restaurants ..
return ConvertEntity.convertRestaurants(availableRestaurants);
} …Run Code Online (Sandbox Code Playgroud) 一般来说,这个背景故事无关紧要,只是为了解释下面的代码:
服务器处理用户和用户组。用户组能够“发现”地点 - 目前这些地点完全来自 Google Places API。
目前,我的服务层中有很多JpaRepository对象,我称之为Repository。我强调“存储库”,因为在我下面提出的解决方案中,它们将被降级为 DAO。
但是,我在当前代码中不喜欢的地方,也是我在这里提出问题的原因,是可以在UserGroupService.
@Service
public class UserGroupService {
private final static Logger LOGGER = LogManager.getLogger(UserGroupService.class);
@Autowired
private UserGroupRepository userGroupRepository;
@Autowired
private UserGroupPlaceRepository userGroupPlaceRepository;
@Autowired
private PlaceRepository placeRepository;
@Autowired
private GooglePlaceRepository googlePlaceRepository;
@Autowired
private GooglePlaces googlePlaces;
public UserGroupService() {
}
@Transactional
public void discoverPlaces(Long groupId) {
final UserGroup userGroup = this.userGroupRepository.findById(groupId).orElse(null);
if (userGroup == null) {
throw new EntityNotFoundException(String.format("User group with id %s not found.", …Run Code Online (Sandbox Code Playgroud)