有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何将DTO映射到现有的JPA实体?

我正在尝试将Java DTO对象映射到现有的JPA实体对象,而无需执行以下操作:

public MyEntity mapToMyEntity(SomeDTO dto, MyEntity entity) {
    entity.setField1(dto.getField1());
    entity.setField2(dto.getField2());
    ...
    entity.setField20(dto.getField20());

    return entity;
}

到目前为止,我一直在使用像这样的ModelMapperMyEntity entity = modelMapper.map(dto, SomeDTO.class);,但我想做的是映射到一个现有的实体对象,而不是从DTO创建一个新的实体对象。我查阅了ModelMapper手册,没有找到如何在不创建新对象的情况下进行映射。我是否无法为可能拥有的每个实体对象手动添加每个成员变量


共 (5) 个答案

  1. # 1 楼答案

    您可以使用推土机映射器或gson

    DozerMapper ex:

    Mapper mapper = DozerBeanMapperBuilder.createDefault();
    DestinationObject destObject = mapper.map(sourceObject,DestinationClassName.class);
    

    您可以查看github page以了解更多信息

  2. # 2 楼答案

    目前ModelMapper还支持映射到现有对象

    可以执行以下操作(对于伪弹簧示例):

    MyEntity mye = repository.findById(id);
    ModelMapper mm = new ModelMapper();    
    mm.map(myDTO, mye);
    repository.save(mye):
    

    我使用的是2.3.1版,但早期版本可能也支持此功能

  3. # 3 楼答案

    翻译自葡萄牙语

    https://pt.stackoverflow.com/questions/166438/dto-assembler-como-utiliza-lo-realmente

    使用模式汇编程序: 您可以通过汇编器模式将实体转换为DTO,但这是错误的(我认为),它打破了DTO的意义,DTO是传输对象的标准。请注意,它可以由多个实体组成。正确的做法是使用服务类中对象实例的集合方法,将DTO作为实体进行组装,这仅仅是因为您正确地使用了标准

    但它有一种方式,即使它是错误的,它也会工作,但只有实体x DTO之间的1 x 1关联,使用番石榴函数

    例如:转换转换为对象和列表

    import java.util.ArrayList;
    import java.util.List;
    import com.google.common.base.Function;
    
        /**
         * Classe de transformação para popular os dados em DTOs, seguindo o pattern
         * Transfer Object Assembler.
         */
        public class Transformer {
    
            /**
             * Executa a transformação de um objeto para um DTO.
             * 
             * @param from
             * @param function
             * @return <F, T> T
             */
            public static <F, T> T transform(F from, Function<? super F, ? extends T> function) {
                return (from == null) ? null : function.apply(from);
            }
    
            /**
             * Executa a transformação de uma lista de objetos para uma lista de DTOs.
             * 
             * @param fromList
             * @param function
             * @return <F, T> List<T>
             */
            public static <F, T> List<T> transform(List<F> source, Function<? super F, ? extends T> function) {
                List<T> out = new ArrayList<>(source.size());
    
                for (F from : source) {
                    out.add(function.apply(from));
                }    
                return out;
            }    
        }
    

    模式汇编程序:

    import java.util.List;
    import br.com.myapp.model.dto.AuthUserDTO;
    import br.com.myapp.model.entity.AuthUser;
    import com.google.common.base.Function;
    import com.google.common.collect.Lists;
    
    /**
     * Classe que transforma entidade USUARIOS em DTO.
     * 
     * @author Dilnei Cunha
     */
    public class AuthUserDTOAssembler implements Function<AuthUser, AuthUserDTO>{
    
        /**
         * Método responsável por fazer a conversão da entidade USUARIOS em um AuthUserDTO.
         */
    @Override
    public AuthUserDTO apply(AuthUser e) {
    
        AuthGroupDTO groupDTO = Transformer.transform(e.getAuthGroup(), new  AuthGroupDTOAssembler());
    
        return new AuthUserDTO(e.getId(),
                           e.getName(),
                           e.getPassword(),
                           e.getEmail(),
                           e.getCreationDate(),
                           e.getLastModificationdate(),
                           e.getLastAccessDate(),
                           e.getAtivo(),
                           e.getUserName(),
                           e.getRamal(),
                           groupDTO);
        }
    }
    

    什么样的服务会使用这些模式

    /**
     * Método responsável por buscar um AuthUserDTO pelo ID do usuário.
     */
    @Override
    public AuthUserDTO findById(Long id) {
        return Transformer.transform(authUserRepository.findUserById(id), new AuthUserDTOAssembler());
    }
    

    现在,让我们做一个相反的过程,将一个或一个DTO列表转换为对象,但请记住,关联是1x1。要做到这一点,只需在函数的实现中反转对象,例如:

    import java.util.List;
    import br.com.myapp.model.dto.AuthUserDTO;
    import br.com.myapp.model.entity.AuthUser;
    import com.google.common.base.Function;
    import com.google.common.collect.Lists;
    
    /**
     * @author Dilnei Cunha
     */
    public class AuthUserAssembler implements Function<AuthUserDTO, AuthUser>{
    
    @Override
    public AuthUser apply(AuthUserDTO e) {
    
            AuthGroup group = Transformer.transform(e.getAuthGroupDTO(), new  AuthGroupAssembler());
    
            return new AuthUser(e.getId(),
                               e.getName(),
                               e.getPassword(),
                               e.getEmail(),
                               e.getCreationDate(),
                               e.getLastModificationdate(),
                               e.getLastAccessDate(),
                               e.getAtivo(),
                               e.getUserName(),
                               e.getRamal(),
                               group);
            }
        }
    
  4. # 4 楼答案

    您可以定义下一个类:

    public class ObjectMapperUtils {
    
        private static ModelMapper modelMapper = new ModelMapper();
    
        /**
         * Model mapper property setting are specified in the following block.
         * Default property matching strategy is set to Strict see {@link MatchingStrategies}
         * Custom mappings are added using {@link ModelMapper#addMappings(PropertyMap)}
         */
        static {
            modelMapper = new ModelMapper();
            modelMapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STRICT);
        }
    
        /**
         * Hide from public usage.
         */
        private ObjectMapperUtils() {
        }
    
        /**
         * <p>Note: outClass object must have default constructor with no arguments</p>
         *
         * @param <D>      type of result object.
         * @param <T>      type of source object to map from.
         * @param entity   entity that needs to be mapped.
         * @param outClass class of result object.
         * @return new object of <code>outClass</code> type.
         */
        public static <D, T> D map(final T entity, Class<D> outClass) {
            return modelMapper.map(entity, outClass);
        }
    
        /**
         * <p>Note: outClass object must have default constructor with no arguments</p>
         *
         * @param entityList list of entities that needs to be mapped
         * @param outCLass   class of result list element
         * @param <D>        type of objects in result list
         * @param <T>        type of entity in <code>entityList</code>
         * @return list of mapped object with <code><D></code> type.
         */
        public static <D, T> List<D> mapAll(final Collection<T> entityList, Class<D> outCLass) {
            return entityList.stream()
                    .map(entity -> map(entity, outCLass))
                    .collect(Collectors.toList());
        }
    
        /**
         * Maps {@code source} to {@code destination}.
         *
         * @param source      object to map from
         * @param destination object to map to
         */
        public static <S, D> D map(final S source, D destination) {
            modelMapper.map(source, destination);
            return destination;
        }
    }
    

    并将其用于您的需求:

    MyEntity entity = ObjectMapperUtils.map(dto, existingEntity);