You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何映射多对一关联关系?基于已有一对一映射代码求助

首先明确依赖结构

因为你的PatientEntity里用了@OneToMany(mappedBy = "patient"),所以VisitEntity必然包含一个多对一关联到Patient的字段,先给出它的基础结构:

@Entity
@Table(name = "VISIT")
public class VisitEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    // 示例字段:根据你的业务补充实际字段
    private LocalDate visitDate;
    private String description;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "PATIENT_ID")
    private PatientEntity patient;

    // getter、setter方法
}

对应的VisitTO需要和实体字段匹配,示例如下:

public class VisitTO {
    private Long id;
    private LocalDate visitDate;
    private String description;
    // 可选:如果业务需要,可存储关联的患者ID
    private Long patientId;

    // getter、setter方法
}

修改PatientMapper,添加多对一/一对多映射

1. Entity转TO(mapToTO方法)

遍历患者的就诊记录列表,逐个转换为TO对象,注意处理懒加载场景(需确保在JPA会话内访问集合,否则会抛出LazyInitializationException):

public static PatientTO mapToTO(final PatientEntity patientEntity)
{
    if (patientEntity == null)
    {
        return null;
    }
    final PatientTO patientTO = new PatientTO();
    patientTO.setId(patientEntity.getId());
    patientTO.setFirstName(patientEntity.getFirstName());

    // 一对一地址映射保持不变
    final AddressTO addressTO = new AddressTO();
    addressTO.setId(patientEntity.getAddress().getId());
    addressTO.setCity(patientEntity.getAddress().getCity());
    patientTO.setAddress(addressTO);

    // 处理就诊记录列表映射
    if (patientEntity.getVisit() != null && !patientEntity.getVisit().isEmpty()) {
        List<VisitTO> visitTOList = new ArrayList<>();
        for (VisitEntity visitEntity : patientEntity.getVisit()) {
            VisitTO visitTO = new VisitTO();
            visitTO.setId(visitEntity.getId());
            visitTO.setVisitDate(visitEntity.getVisitDate());
            visitTO.setDescription(visitEntity.getDescription());
            visitTO.setPatientId(patientEntity.getId());
            visitTOList.add(visitTO);
        }
        patientTO.setVisit(visitTOList);
    }

    return patientTO;
}

2. TO转Entity(mapToEntity方法)

转换就诊记录列表时,需为每个VisitEntity设置关联的PatientEntity,维护多对一关系:

public static PatientEntity mapToEntity(final PatientTO patientTO)
{
    if(patientTO == null)
    {
        return null;
    }
    PatientEntity patientEntity = new PatientEntity();
    patientEntity.setId(patientTO.getId());
    patientEntity.setFirstName(patientTO.getFirstName());

    // 一对一地址映射保持不变
    AddressEntity addressEntity = new AddressEntity();
    addressEntity.setId(patientTO.getAddress().getId());
    addressEntity.setCity(patientTO.getAddress().getCity());
    patientEntity.setAddress(addressEntity);

    // 处理就诊记录列表映射
    if (patientTO.getVisit() != null && !patientTO.getVisit().isEmpty()) {
        List<VisitEntity> visitEntityList = new ArrayList<>();
        for (VisitTO visitTO : patientTO.getVisit()) {
            VisitEntity visitEntity = new VisitEntity();
            visitEntity.setId(visitTO.getId());
            visitEntity.setVisitDate(visitTO.getVisitDate());
            visitEntity.setDescription(visitTO.getDescription());
            // 关联当前患者实体,维护多对一关系
            visitEntity.setPatient(patientEntity);
            visitEntityList.add(visitEntity);
        }
        patientEntity.setVisit(visitEntityList);
    }

    return patientEntity;
}

额外提示

  • 若业务不需要完整的就诊记录信息,可只返回就诊ID列表,减少数据传输量;
  • 懒加载问题:如果PatientEntity.getVisit()是LAZY加载策略,需确保在Mapper处理前已初始化集合(比如在Service层用Hibernate.initialize(patientEntity.getVisit()),或查询时用FETCH JOIN关联加载);
  • 若项目使用MapStruct等映射框架,可大幅简化手动编写Mapper的工作量,上述代码为纯手动实现方案。

内容的提问来源于stack exchange,提问作者Qmails

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 23:35:38