如何映射多对一关联关系?基于已有一对一映射代码求助
首先明确依赖结构
因为你的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
相关产品推荐
相关产品推荐

