首页 > 解决方案 > OneToMany 双向关系不显示孩子

问题描述

当我使用 parentId 创建 templateDir 时,它在 getAllTree 方法之后正确显示,如果我创建没有 parentId 的 templateFile 它也正确显示。 但是当我使用 parentDirId 创建 templateFile 时,它​​根本没有显示。它位于 db 中,但我假设的 parentDir 没有被正确识别为子项。

我有 2 个实体类:TemplateFile 和 TemplateDirectory:

我正在尝试通过对 templateFiles 和 templateDirectories 使用存储库方法 findAllByParentIsNull 来显示所有“TemplateTree”:

@Transactional(readOnly = true)
public TemplateTreeDTO getAllTree() {
    Set<TemplateFileDTO> rootTemplates =
            templateFileRepository.findAllByParentDirIsNull()
                                  .stream()
                                  .map(templateMapper::createTemplateDTOFromEntity)
                                  .map(templateDTO -> (TemplateFileDTO) templateDTO)
                                  .collect(Collectors.toUnmodifiableSet());

    Set<TemplateDirectoryDTO> rootTemplateDirectories =
            templateDirectoryRepository.findAllByParentIsNull()
                                       .stream()
                                       .map(templateMapper::createTemplateDTOFromEntity)
                                       .map(templateDTO -> (TemplateDirectoryDTO) templateDTO)
                                       .collect(Collectors.toUnmodifiableSet());
    TemplateTreeDTO templateTreeDTO = new TemplateTreeDTO();
    templateTreeDTO.setTemplates(rootTemplates);
    templateTreeDTO.setDirectories(rootTemplateDirectories);

    return templateTreeDTO;
}

标签: javahibernateh2

解决方案


错是我的粗心...在

@Smutje

我发现我实际上并没有在 TemplateDirectoryDTO 中设置模板列表......如此简单明了。希望有人发现这个问题作为 OneToMany 双向关系的示例很有用。

将 TemplateMapper.createTemplateDTOFromEntity 更新为:

public TemplateDTO createTemplateDTOFromEntity(TemplateEntity templateEntity) {
    if (templateEntity instanceof TemplateFile) {
        TemplateFile templateFile = (TemplateFile) templateEntity;
        TemplateFileDTO templateFileDTO = new TemplateFileDTO();
        templateFileDTO.setId(templateFile.getId());
        templateFileDTO.setName(templateFile.getName());
        templateFileDTO.setFilePath(templateFile.getLocalPath());
        TemplateDirectory parentDirectory = templateFile.getParentDir();
        templateFileDTO.setParentId(parentDirectory == null ? null : parentDirectory.getId());
        return templateFileDTO;
    } else {
        TemplateDirectory templateDirectory = (TemplateDirectory) templateEntity;
        TemplateDirectoryDTO templateDirectoryDTO = new TemplateDirectoryDTO();
        templateDirectoryDTO.setId(templateDirectory.getId());
        templateDirectoryDTO.setName(templateDirectory.getName());
        TemplateDirectory parentDirectory = templateDirectory.getParent();
        templateDirectoryDTO.setParentId(parentDirectory == null ? null : parentDirectory.getId());
        Set<TemplateDirectory> childDirectories = templateDirectory.getChildDirs();
        if (childDirectories != null && !childDirectories.isEmpty()) {
            templateDirectoryDTO.setDirectories(childDirectories
                                                        .stream()
                                                        .map(this::createTemplateDTOFromEntity)
                                                        .map(templateDTO -> (TemplateDirectoryDTO) templateDTO)
                                                        .collect(Collectors.toUnmodifiableSet()));
        }
        Set<TemplateFile> childFiles = templateDirectory.getChildFiles();
        if (childFiles != null && !childFiles.isEmpty()) {
            templateDirectoryDTO.setTemplates(childFiles
                                                        .stream()
                                                        .map(this::createTemplateDTOFromEntity)
                                                        .map(templateDTO -> (TemplateFileDTO) templateDTO)
                                                        .collect(Collectors.toUnmodifiableSet()));
        }

        return templateDirectoryDTO;
    }
}

缺少的部分是

Set<TemplateFile> childFiles = templateDirectory.getChildFiles();
        if (childFiles != null && !childFiles.isEmpty()) {
            templateDirectoryDTO.setTemplates(childFiles
                                                        .stream()
                                                        .map(this::createTemplateDTOFromEntity)
                                                        .map(templateDTO -> (TemplateFileDTO) templateDTO)
                                                        .collect(Collectors.toUnmodifiableSet()));
        }

推荐阅读