首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mapstruct将id映射到对象

mapstruct将id映射到对象
EN

Stack Overflow用户
提问于 2018-02-22 04:43:33
回答 2查看 9.7K关注 0票数 8

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

因此,在类中,我有一个person类型的属性Person,在SchoolDTO中,我有一个Long类型的属性personId

代码语言:javascript
复制
 @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;
  }
}

这里的问题是,当我显示person时,它会显示id及其值,另一个属性为null

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-02-25 20:31:02

之所以只显示设置了id值的Person,是因为fromId方法创建了一个空的Person,并且只设置了id。

我假设您想要从数据库中获取Person

要实现这一点,您只需要告诉MapStruct使用一个服务,或者您可以将其注入到您的映射器中并执行获取。

如果您有如下服务:

代码语言:javascript
复制
public interface PersonService {

    Person findById(Long id);
}

和你的映射器:

代码语言:javascript
复制
 @Mapper(componentModel = "spring", uses = { PersonService.class }) 
 public interface SchoolMapper extends EntityMapper<SchoolDTO, School>{ 

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

Stack Overflow用户

发布于 2021-01-16 00:21:57

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

代码语言:javascript
复制
@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);
    }
}

然后,PersonMapper将为:

代码语言:javascript
复制
@Mapper(componentModel = "spring", uses = {ReferenceMapper.class})
public interface PersonMapper {

    Person toEntity(Long id);
}

最后是SchoolMapper:

代码语言:javascript
复制
@Mapper(componentModel = "spring",uses = {PersonMapper.class})
public interface SchoolMapper {

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

生成的源码是:

代码语言:javascript
复制
@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;
    }
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48915091

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档