[TroubleShooting] MySQL @Enumerated

이프·2024년 8월 25일

trouble-shooting

목록 보기
1/8

mysql에서 테이블을 만들고 hibernate로 entity에 대한 validate 검증 시 발생하는 오류가 있다.

@Enumerated(EnumType.STRING)

@Entity
@Table(name = "order_menu")
@EqualsAndHashCode(callSuper = true)
@SuperBuilder
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Getter
public class OrderMenu extends BaseEntity {

    @Column(nullable = false)
    private Long userOrderId;

    @Column(nullable = false)
    private Long storeMenuId;

    @Setter
    @Column(length = 50, nullable = false)
    @Enumerated(EnumType.STRING)
    private OrderMenuStatus status;

}
  • OrderMenuStatus는 Enum 객체이다. DB에서 사용하기 위해 @Enumerated를 사용하면서 자동으로 varchar로 변하길 기대하고 있다.
CREATE TABLE IF NOT EXISTS `delivery`.`order_menu` (
  `id` BIGINT(32) NOT NULL,
  `user_order_id` BIGINT(32) NOT NULL,
  `store_menu_id` BIGINT(32) NOT NULL,
  `status` VARCHAR(50) NOT NULL,
  PRIMARY KEY (`id`),
  INDEX `idx_user_order_id` (`user_order_id` ASC) VISIBLE,
  INDEX `idx_store_menu_id` (`store_menu_id` ASC) VISIBLE
  )
ENGINE = InnoDB;
  • DB에서는 status를 varchar로 생성되었다.

db에서 먼저 검증된 테이블을 생성했고 jpa로 entity에 대해 검증을 수행한다.
yml or properties 파일의 정보가 spring.jpa.hibernate.ddl-auto=validate 일 경우, 검증이 잘 수행될까?

Caused by: org.hibernate.tool.schema.spi.SchemaManagementException: Schema-validation: wrong column type encountered in column [status] in table [order_menu]; 

found [varchar (Types#VARCHAR)], but expecting [enum ('registered','unregistered') (Types#ENUM)]
  • 결과는 이런 어이없는 에러가 발생한다.

@Enumerated(EnumType.STRING) 은 Enum의 상수 그자체를 저장하는데 이게 여러가지 있을 경우, MySQL은 Enum Type을 지원하기 때문에 JPA가 Enum으로 저장해버린다.

@Column 어노테이션을 활용해서 명시해주면 해결된다.

@Setter
@Column(length = 50, nullable = false, columnDefinition = "varchar(50)")
@Enumerated(EnumType.STRING)
private OrderMenuStatus status;

해결

profile
if (이런 시나리오는 어떨까?) then(테스트로 검증하고 해결) else(다음 시나리오 고민)

0개의 댓글