졸업프로젝트를 진행하면서 공부한 내용 정리!
create
: 실행될 때 기존 테이블을 삭제 + 새로 생성 (DROP + CREATE)
create-drop
: CREATE 속성에 어플리케이션을 종료할 때 생성한 DDL을 제거하는 옵션 추가 (DROP + CREATE + DROP)
update
: DB 테이블과 엔티티 매핑 정보를 비교해서 변경 사항만 수정
validate
: DB 테이블과 엔티티 매핑정보를 비교해서 차이가 있으면 경고를 남기고 어플리케이션을 실행하지 않음
none
: 자동 생성 기능을 사용X
🚨 주의할 점
개발 초기 :create
,create-drop
,update
배포/운영 :validate
,none
개발 초기에는 테이블 매핑관계가 자주 바뀔 수도 있고 만약 테스트 데이터가 쌓이는 것을 보기 싫다면
create
,create-drop
을 쓰는 것이 좋다. (나도 그랬다ㅎ)
하지만 예를 들어, 유저 한 명을 저장해놓고 그에 관한 기능들을 테스트하고 싶을 때는update
를 사용해도 좋다!
하지만 배포/운영 단계에서는 무조건validate
혹은none
을 사용해야 한다! 왜냐하면 다른 옵션들은 엔티티 간의 매핑 관계를 바꿀 수도 있는 옵션이고 테이블이 날라갈 수도 있는 옵션이기 때문에 테이블 간 매핑 관계만 비교하는validate
나none
을 사용해야 한다.
Error executing DDL "alter table pet drop foreign key~"
위와 같은 오류가 뜨면서 제대로 drop되지 않을 수도 있다.
그럴 때는 ddl-auto속성을 update
로 바꿔주면 해당 오류가 뜨지 않는다.
하지만 위에서 얘기한 대로 update
의 경우에는 테이블에 저장되었던 데이터들을 지워주지 않으므로 테이블에 저장된 데이터를 지우고 싶거나 create
나 create-drop
속성을 개발하는 동안에는 유지하고 싶다면
set foreign_key_checks = 0;
drop table pet;
truncate pet;
set foreign_key_checks = 1;
foreign_key_checks
속성을 잠시 풀어줘서 FK설정을 풀고 테이블을 drop하거나 truncate로 테이블의 데이터를 밀어버리고 다시 foreign_key_checks
속성을 설정해주면 된다!
(create
나 create-drop
옵션은 테이블을 다시 생성해주니까 굳이 다시 foreign_key_checks
속성을 설정 안 해도 괜찮다ㅎ)
jpa hibernate의 ddl 자동생성 옵션과 초기화 전략 그리고 Error DDL 해결 방법
[JPA] Hibernate 엔티티(Entity) 매핑하기
[Error] TransientPropertyValueException: object references an unsaved transient