상황
Enum에 새로운 상수를 추가해 주고, ddl-auto로 프로그램을 제 빌드 하였지만 추가된 enum 상수를 찾지 못하고
java.sql.SQLException: Data truncated for column 에러가 발생했다.
이는 Hibernate6 부터 ddl-auto 기능이 기본적으로, 데이터베이스 스키마 일부만 업데이트 되도록 변경되었기 때문이다. 따라서 새로운 enum 상수를 추가해 주어도 스키마에 반영되지 않았다.
내용
test - enum, entity 생성
지금 상황에서는 animalType 테이블 구조를 살펴보면 Data Type에 CAT,DOG,LION 잘 저장된 것을 확인 할 수 있다.
하지만 여기서 AnimalType에 BIRD 를 추가한다면 어떻게 될까???
BIRD를 추가한 후 프로젝트를 다시 실행시켜 보았지만, 데이터베이스의 테이블 구조는 달라지지 않았다.
따라서 api를 호출하여 BIRD를 저장하려 한다면
java.sql.SQLException: Data truncated for column 'animal_type' at row 1 에러가 발생하게 된다.
해결방법
해결방법으로는 AnimalType 메타데이터에 enum이 아닌 String 값을 저장해주고, 데이터베이스에서 값을 가져올때 String 값을 enum으로 변환해 주는 컨버터를 만드는 것이다.
AttributeConverter<> 을 구현한 AnimalConverter를 구현하여 엔티티에서 @Converter를 사용해주었다.
public class AnimalConverter implements AttributeConverter<AnimalType, String> {
@Override
public String convertToDatabaseColumn(AnimalType animalType) {
return animalType != null ? animalType.name() : null;
}
@Override
public AnimalType convertToEntityAttribute(String s) {
return s != null ? AnimalType.valueOf(s) : null;
}
}
@Entity
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class Animal {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@Convert(converter = AnimalConverter.class)
private AnimalType animalType;
}
다시 프로젝트를 재 실행 해보니, Hibernate가 animal_type을 varchar로 변경해 주었다.
결과
'스프링 > jpa' 카테고리의 다른 글
영속성 컨텍스트란? (0) | 2024.09.14 |
---|---|
User들의 권한 관계 (0) | 2024.08.07 |
연관 관계를 무조건 맺는것이 좋을까? (0) | 2024.08.04 |