@Mapper annotation이 알아서 interface명 + Impl클래스를 만들어준다.

@Mapper()
- componentModel: spring빈으로 사용하기 위한 세팅.
- unmappedTargetPolicy: ReportingPolicy.IGNORE
-- 맵핑에 대해서 경고가 나오면 무시한다.
만약 mapStruct에서 조인된 세부 필드를 맵핑하고 싶다면?
ex> 예를들어 Part.java와 PartOld220.java를 맵핑 한다고 해보자
public class Part implements Serializable {
@Id
@Column(name = "PART_NM", nullable = false, length = 100)
private String partName;
@Id
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(
name = "ASST_SEQNO",
foreignKey = @ForeignKey(value = ConstraintMode.NO_CONSTRAINT)
)
private Machine machine;
@Id
@Column(name = "VENDOR_NM", nullable = false, length = 50, columnDefinition = "varchar(50)")
private String vendorName;
--- 중략 ---
@Column(name = "YOFFSET", columnDefinition = "float default NULL")
private Float yOffset;
}
public class PartOld220 implements Serializable {
@Id
@Column(name = "PART_NM", nullable = false, length = 100)
private String partName;
@Id
@Column(name = "ASST_SEQNO", nullable = false)
private Long assetSeqno;
@Id
@Column(name = "VENDOR_NM", nullable = false, length = 50, columnDefinition = "varchar(50)")
private String vendorName;
--- 중략 ---
@Column(name = "YOFFSET", columnDefinition = "float default NULL")
private Float yOffset;
}
Mapping abstract class
- 따로 맵핑 해줘야 하는 특정 컬럼이 없는 경우는 그냥 interface로 만들어 줘야 하지만, 따로 맵핑할 특정 컬럼이 있는 경우는 abstract 클래스로 만들어 줘야한다.
- 자세한 내용은 코드 사이에 있는 코멘트를 참고한다.
@Mapper(componentModel = "spring"
,unmappedTargetPolicy = ReportingPolicy.IGNORE
)
public abstract class PartMapper {
@PersistenceContext
EntityManager entityManager;
/*
mapMachine메소드의 파라메터에 PartOld220을 넣어주면 커스텀 맵퍼 안에서 .getAssetSeqno()로 접근히여
*/
@Mapping(target = "machine" , source="old")
public abstract LibPart toNew(PartOld220 old);
@Mapping(target = "assetSeqno" , source="origin.machine.assetSeqno")
public abstract PartOld220 toOld(Part origin);
// Machine과 assetSeqno를 매핑한다.
Machine mapMachine(PartOld220 part){
Long id = part.getAssetSeqno();
return (id == null) ? null : entityManager.getReference(Machine.class, id);
}
}
만약 따로 맵핑해줄 만한 컬럼이 따로 없다면, 아래 예제와 같이 매퍼 interface를 만들어주면 된다.
@Mapper(componentModel = "spring")
public interface OddShapeImageMapper {
OddShapeImage toNew(OddShapeImageOld220 old);
OddShapeImageOld220 toOld(OddShapeImage original);
}