JPA ENUM 사용법

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;

위에 처럼 지정해 주면 된다.

참조