[JPA] enum으로 상속관계 구분 컬럼 지정하기

hoyong.eom·2024년 12월 15일

JPA

목록 보기
3/8
post-thumbnail

JPA

JPA로 토이 프로젝트를 진행하는데, 상속 관계 맵핑 구분 컬럼을 enum 값으로 지정하고 싶었다.

하지만, @DiscriminatorColumn 에는 String 타입을 Value로 지정하게 되어 있다.

체계적으로 관리하기 위해서 어떤 우회적인 방법이 필요했다.

코드

@RequiredArgsConstructor
public enum CardType {

    BUS(Values.BUS),
    SUBWAY(Values.SUBWAY),
    TRAFFIC(Values.TRAFFIC);
    
    private final String value;
    
    public static class Values {
        public static final String BUS = "BUS";
        public static final String SUBWAY = "SUBWAY";
        public static final String TRAFFIC  = "TRAFFIC";
    }
}
@Entity
@Getter
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "CardType",
        discriminatorType = DiscriminatorType.STRING
)
@Table(name = "tb_card")
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public abstract class Card extends BaseEntity {

    @Id
    @Column(name = "card_id")
    @GeneratedValue
    private Long id;

    private String name;

    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinColumn(name = "card_group_id")
    private CardGroup cardGroup;

    public Card(String name) {
        this.name = name;
    }

    /**
     * 연관 관계 편의 메서드
     */
    public void setCardGroup(CardGroup cardGroup) {

        if (this.cardGroup != null) {
            this.cardGroup.getCardList().remove(this);
        }

        this.cardGroup = cardGroup;
        cardGroup.getCardList().add(this);
    }
}
@Entity
@DiscriminatorValue(value = CardType.Values.BUS)
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class BusArrivalCard extends Card{

    private String busStopName;

    private String cityCode;

    private String busStopId;

    public BusArrivalCard(String cardName, String busStopName, String cityCode, String busStopId) {
        super(cardName);
        this.busStopName = busStopName;
        this.cityCode = cityCode;
        this.busStopId = busStopId;
    }
}

참고

https://stackoverflow.com/questions/3639225/single-table-inheritance-strategy-using-enums-as-discriminator-value

0개의 댓글