우아한테크코스 4기

[JPA] hibernate.ddl-auto 설정

giron 2022. 7. 14. 00:32
728x90

hibernate.ddl-auto 옵션은 Entity객체를 참고하여 애플리케이션 실행 시점에 하이버네이트에서 자동으로 DDL을 만들어주는 옵션이다. 

JPA 테스트 도중 fk 제약조건이 걸린 엔티티를 생성할 때, 아래 설정처럼 create를 하니 에러가 발생했다.

properties
Table "ANSWER" not found;

ddl-auto 옵션

  • create: 기존테이블 삭제 후 다시 생성 + 닫을 때 삭제하지 않는다.
  • create-drop: create와 같으나 종료시점에 테이블 DROP
  • update: 하이버네이트는 주어진 엔티티 구조에 따라서 데이터베이스를 변경한다.
  • validate: 엔티티와 테이블이 정상 매핑되었는지만 확인
  • none: 어떠한 변화도 주지 않는다.mysql에서 default이다.

ddl-auto의 옵션의 시작은 create or update로 시작해야한다. 왜냐하면 처음에는 테이블의 스키마가 없기 때문이다.

The spring.jpa.hibernate.ddl-auto is a special case, because, depending on runtime conditions, it has different defaults. If an embedded database is used and no schema manager (such as Liquibase or Flyway) is handling the DataSource, it defaults to create-drop. In all other cases, it defaults to none.
The dialect to use is detected by the JPA provider. If you prefer to set the dialect yourself, set the spring.jpa.database-platform property.

내장된 db가 사용되거나 flyway와 같은 스키마 manager가 없으면 default로 create-drop으로 지정이 된다. ex)h2

다른 모든 경우에는 none이 적용된다고 한다.ex)mysql

에러 발생

CommandAcceptanceException: Error executing DDL " alter table {table} drop foreign key ~

1. 해결 방법

create나 create-drop을 하면 테이블을 drop을 하고 create를 한다. 이때 테이블을 먼저 drop을 한다.

이후 table을 create하기 전에 alter table 구문으로 foreign key를 생성하는데 이미 테이블이 제거되어서 테이블이 없다고 에러가 발생한다.

 

따라서 ddl-auto : update로 변경하면 변경 부분만 반영되므로 해결이 된다.

 

https://spring.io/guides/gs/accessing-data-mysql

 

 

728x90