mapstruct将ID映射到对象

Aym*_*ari 2 java mapstruct

我有一个对象学校,其中有一个对象人,人已经保存在数据库中,当我保存学校对象时,我给它一个人ID

因此在班级学校中,我有一个类型为Person的属性person,在SchoolDTO中,我有一个类型为Long的属性personId

 @Mapper(componentModel = "spring", uses = { PersonMapper.class }) 
 public interface SchoolMapper extends EntityMapper<SchoolDTO, School>{ 

  @Mapping(source = "personId", target = "person") 
  School toEntity(SchoolDTO schoolDTO); 
 } 

 School school = schoolMapper.toEntity(schoolDTO); 
 log.info(school.getPerson()); 


public interface EntityMapper <D, E> {

 E toEntity(D dto);

 D toDto(E entity);

 List <E> toEntity(List<D> dtoList);

 List <D> toDto(List<E> entityList);
}


@Mapper(componentModel = "spring", uses = {})
public interface PersonMapper extends EntityMapper<PersonDTO, Person> {

  default Person fromId(Long id) {
   if (id == null) {
     return null;
   }
   Person person= new Person();
   person.setId(id);
   return person;
  }
}
Run Code Online (Sandbox Code Playgroud)

当我显示此人时,这里出现的问题显示了我的ID及其值和另一个属性null

And*_*ver 8

我们可以通过引入 ReferenceMapper 来概括前面的答案,如下所示:

@Component
public class ReferenceMapper {

    @PersistenceContext
    private EntityManager entityManager;

    @ObjectFactory
    public <T> T map(@NonNull final Long id,  @TargetType Class<T> type) {
        return entityManager.getReference(type, id);
    }
}
Run Code Online (Sandbox Code Playgroud)

那么,PersonMapper 将是:

@Mapper(componentModel = "spring", uses = {ReferenceMapper.class})
public interface PersonMapper {

    Person toEntity(Long id);
}
Run Code Online (Sandbox Code Playgroud)

最后是 SchoolMapper:

@Mapper(componentModel = "spring",uses = {PersonMapper.class})
public interface SchoolMapper {

  @Mapping(source = "personId", target = "person") 
  School toEntity(SchoolDTO schoolDTO); 
}
Run Code Online (Sandbox Code Playgroud)

生成的源将是:

@Override
    public School toEntity(InDto dto) {
        if ( dto == null ) {
            return null;
        }

        School school = new School();

        school.setPerson( personMapper.toEntity( dto.getPersonId() ) );
        // other setters

        return school;
    }
Run Code Online (Sandbox Code Playgroud)


Fil*_*lip 6

Person仅在设置了id值的情况下显示您的原因是因为您的fromId方法创建了一个空值Person并仅设置了id。

我想您想Person从数据库中获取。

为此,您只需要告诉MapStruct使用服务即可,或者可以将其注入到映射器中并执行获取。

如果您有以下服务:

public interface PersonService {

    Person findById(Long id);
}
Run Code Online (Sandbox Code Playgroud)

和您的映射器:

 @Mapper(componentModel = "spring", uses = { PersonService.class }) 
 public interface SchoolMapper extends EntityMapper<SchoolDTO, School>{ 

  @Mapping(source = "personId", target = "person") 
  School toEntity(SchoolDTO schoolDTO); 
 } 
Run Code Online (Sandbox Code Playgroud)

  • 它之所以有效,是因为 MapStruct 会查找 Mapper#uses 中定义的服务的所有方法。在这种特殊情况下,它将寻找一种将 Long 映射到 Person 的方法。这就是为什么它使用该方法 (4认同)