当前位置: 首页 > 知识库问答 >
问题:

域模型CRUD操作的泛型类

计承德
2023-03-14

我的目标是为CRUD操作使用一个通用类,这样我就不需要为我的应用程序中的每个域模型实现一个单独的类。

该层还在我的DTO和域模型之间进行转换。

get和delete方法工作正常。但是,如何实现save方法。对于新实体,我需要创建泛型的新实例,并将DTO映射到泛型上。

/**
 * This class can be extended to use default CRUD features
 *
 * @param <T> domain model
 * @param <V> DTO represenation of domain model
 */
@RequiredArgsConstructor
public abstract class AbstractCrudService<T extends CoreDomain, V extends CoreDTO> implements CrudStrategy<T, V>{
    
    private final JpaRepository<T, Long> repository;
    private final ModelMapper modelMapper;
    private final Class<V> dtoClass;    
    
    @Override
    public List<V> getAll() {
        List<V> list = new ArrayList<>();
        for (T item : repository.findAll()) {
            list.add(modelMapper.map(item, dtoClass));
        };      
        return list;
    }

    @Override
    public V getById(Long id) {
        T entity = getEntity(id);
        return modelMapper.map(entity, dtoClass);
    }

    @Override
    public void delete(Long id) {
        repository.deleteById(id);      
    }


    @Override
    @Transactional
    public void save(V dto) {
        T entity = new T(); /// DOESNT WORK!!!!
        
        // for edit operation, load existing entity from the DB
        if (dto.getId() != null) {
            entity = getEntity(dto.getId());
        }
        
        modelMapper.map(dto, entity);   
    }
    
    @Override
    public T getEntity(Long id) {
        Optional<T> entity = Optional.ofNullable(repository.findById(id)    
                .orElseThrow(() -> new NoSuchElementException(String.format("Entity with id %s not found", id))));
        return entity.get();
    }   
    
}

我的Service类如下所示:

@Service
public class Test extends AbstractCrudService<Project, ProjectDTO>{
    
    private final ProjectRepository projectRepository;
    private final ModelMapper modelMapper;
    
    public Test(ProjectRepository projectRepository, ModelMapper modelMapper) {
        super(projectRepository, modelMapper, ProjectDTO.class);
        this.projectRepository = projectRepository;
        this.modelMapper = modelMapper;
    }   
        
}

共有1个答案

龙越彬
2023-03-14

我通过以下实现解决了这个问题:

    @Override
    @Transactional
    @SuppressWarnings("unchecked")
    public void save(V dto) {

        ParameterizedType paramType = (ParameterizedType) entityClass.getGenericSuperclass();
        T entity = (T) paramType.getActualTypeArguments()[0];

        // for edit operation, load existing entity from the DB
        if (dto.getId() != null) {
            entity = getEntity(dto.getId());
        }

        modelMapper.map(dto, entity);
    }
 类似资料:
  •        对已经加载入LSV的模型,可以通过“模型操作”对模型进行平移、升降、旋转以及缩放等操作。        并可以通过勾选“复制”和“快速平移”对模型进行复制以及快速平移的操作。

  •        对已经加载入LSV的模型,可以通过“模型操作”对模型进行平移、升降、旋转以及缩放等操作。        并可以通过勾选“复制”和“快速平移”对模型进行复制以及快速平移的操作。

  • 如何获取这个类的类型?对于上下文,我使用ModelMapper,我需要类类型T从S转换为T。 背景: 我已经尝试了N种方法,其中我放置了“//一些方法来获取类型”,但没有任何效果。例如: 或

  • 为什么叫“泛型模型”,请查看一些基本概念 Keras的泛型模型为Model,即广义的拥有输入和输出的模型,我们使用Model来初始化一个泛型模型 from keras.models import Model from keras.layers import Input, Dense a = Input(shape=(32,)) b = Dense(32)(a) model = Model(inp

  • 问题内容: 我有一个代表文本片段的泛型类。该文本片段可能具有多种不同模式(突出显示的不同类型)中的任何一种。这些模式用枚举表示。每个项目的Enum可能不同,但是它必须实现一个接口,该接口提供了一种将其中两个结合的方法(可以突出显示并加粗显示)。所以我有一个界面: 然后我的TextFragment是文本字符串和模式的容器。但是当我尝试声明该类时: 我收到以下错误: 令牌“扩展”的语法错误,预期 根据

  • 我正在尝试创建一个对通用数字类型的特征抽象。指定我希望特征需要(即