JPA ENUM 사용법
jpa에서 enum을 사용할때 기본적으로
1 2 3 4 5
| @Enumerated(EnumType.STRING) @Column(name = "jobtype") private JobType jobtype;
|
Enumerated 어너테이션을 사용하여 EnumType을 String으로 사용할건지 ORDINAL으로 사용할건지 선택을 한다.
여기서 코드와 맵핑시켜서 사용하면
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
|
import static java.util.stream.Collectors.toMap;
import java.util.Map; import java.util.Objects; import java.util.stream.Stream; import lombok.Getter; import lombok.extern.slf4j.Slf4j;
@Slf4j public enum UseMode { IN_CAR_TIME(2, "입차시점기준"), MIDNIGHT(1, "자정기준");
private static final Map<Integer, UseMode> codeToEnum = Stream.of(values()).collect(toMap(UseMode::getCode, e -> e));
@Getter private Integer code; private String description;
UseMode(Integer code, String description) { this.code = code; this.description = description; }
public static UseMode fromCode(Integer symbol) { UseMode useMode = codeToEnum.get(symbol); if (Objects.isNull(useMode)) { log.error("잘못된 UseMode 타입입니다. UseMode = {}", symbol); throw new IllegalArgumentException("잘못된 UseMode 타입입니다."); } return useMode; }
}
|
위와 같은 Enum을 만들어서 DB에는 code값이 들어가야 될때 converter를 선언해서 사용한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
|
import javax.persistence.AttributeConverter; import javax.persistence.Converter; import kr.co.parkingcloud.local.integration.constants.UseMode;
@Converter public class UseModeConverter implements AttributeConverter<UseMode, Integer> {
@Override public Integer convertToDatabaseColumn(UseMode useMode) { return useMode.getCode(); }
@Override public UseMode convertToEntityAttribute(Integer integer) { return UseMode.fromCode(integer); } }
|
AttributeConverter를 구현하면 간단하게 컨버터를 구현할수 있다.
1 2 3 4 5
| @Convert(converter = UseModeConverter.class) @Column(name = "use_mode") private UseMode useMode;
|
위에 처럼 지정해 주면 된다.
참조