gpt4 book ai didi

java - 在数据传输对象设计模式中保留 Hibernate 延迟加载

转载 作者:行者123 更新时间:2023-12-02 03:09:43 25 4
gpt4 key购买 nike

我通常在持久层中使用 Hibernate 来处理 3 层应用程序,并且我注意不要在表示层中使用域模型类。这就是我使用DTO(数据传输对象) 设计模式的原因。

但我在实体 dto 映射中总是遇到困境。无论是我失去了延迟加载的好处,还是通过引入过滤器来调用域模型 getters 来创建代码复杂性。

<小时/>

示例: 考虑对应于实体 User 的 DTO UserDto

public UserDto toDto(User entity, OptionList... optionList) {

if (entity == null) {
return null;
}

UserDto userDto = new UserDto();
userDto.setId(entity.getId());
userDto.setFirstname(entity.getFirstname());


if (optionList.length == 0 || optionList[0].contains(User.class, UserOptionList.AUTHORIZATION)) {
IGenericEntityDtoConverter<Authorization, AuthorizationDto> authorizationConverter = converterRegistry.getConverter(Authorization.class);

List<AuthorizationDto> authorizations = new ArrayList<>(authorizationConverter.toListDto(entity.getAuthorizations(), optionList));
userDto.setAuthorizations(authorizations);

...
}

OptionList 用于过滤映射并仅映射所需的内容。

最后一种方案虽然允许延迟加载,但是由于optionList必须在服务层指定,所以非常繁重。

<小时/>

是否有更好的解决方案来在 DTO 设计模式中保留延迟加载?

最佳答案

对于相同的实体持久状态,我不喜欢在某些执行路径中对象的字段未初始化,而这些字段在其他情况下也可能被初始化。这导致维护起来太令人头痛:

  • 在更好的情况下会导致空指针
  • 如果 null也是一个有效的选项(因此不会导致 NullPointer),它可能意味着数据已被删除,并可能触发意外的删除业务规则,而数据实际上仍然存在。

我宁愿创建接口(interface)和/或类的 DTO 层次结构,从 UserDto 开始。所有实际的 dto 实现字段都被填充以镜像持久状态:如果有数据,则 dto 的字段不为空。

那么你只需要询问服务层你想要哪个 Dto 实现:

public <T extends UserDto> T toDto(User entity, Class<T> dtoClass) {
...
}

然后在服务层,你可以有一个:

Map<Class<? extends UserDto>, UserDtoBUilder> userDtoBuilders = ...

您可以在其中注册不同的构建器,这些构建器将创建和初始化各种 UserDto 实现。

关于java - 在数据传输对象设计模式中保留 Hibernate 延迟加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41260038/

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