
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;
}
}