mysql에서 테이블을 만들고 hibernate로 entity에 대한 validate 검증 시 발생하는 오류가 있다.
@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;
}
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에서 먼저 검증된 테이블을 생성했고 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;

해결