JPA ENUM 사용법
JPA ENUM 사용법
jpa에서 enum을 사용할때 기본적으로
@Enumerated(EnumType.STRING)
@Column(name = "jobtype")
private JobType jobtype;
Enumerated 어너테이션을 사용하여 EnumType을 String으로 사용할건지 ORDINAL으로 사용할건지 선택을 한다.
여기서 코드와 맵핑시켜서 사용하면
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를 선언해서 사용한다.
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를 구현하면 간단하게 컨버터를 구현할수 있다.
@Convert(converter = UseModeConverter.class)
@Column(name = "use_mode")
private UseMode useMode;
위에 처럼 지정해 주면 된다.