[spring] spring.jpa.hibernate.ddl-auto 속성은 Spring에서 정확히 어떻게 작동합니까?

Spring boot 앱 프로젝트에서 작업 중이었고 때때로 다른 서버 (SQL Server)의 데이터베이스에 대한 연결 시간 초과 오류가 있음을 발견했습니다. 이것은 특별히 스크립트 마이그레이션을 시도 할 때 발생 FlyWay하지만 여러 번 시도한 후에 작동합니다.

그런 다음 spring.jpa.hibernate.ddl-auto속성 파일에 지정하지 않은 것을 알았습니다 . 몇 가지 조사를했고 spring.jpa.hibernate.ddl-auto= create-drop개발 에 추가하는 것이 좋습니다
. 그리고 다음으로 변경하십시오 spring.jpa.hibernate.ddl-auto= none.

그러나 실제로 어떻게 작동하는지, 최대 절전 모드가 create-drop또는 none값을 사용하여 데이터베이스 스키마를 생성하는 방법을 실제로 이해하지 못했습니다 . 기술적으로 어떻게 작동하는지, 그리고 개발 및 프로덕션 서버에서이 속성을 사용하기위한 권장 사항이 무엇인지 설명해 주시겠습니까? 감사합니다



답변

레코드의 경우 spring.jpa.hibernate.ddl-auto속성은 SpringData JPA에 따라 다르며 결국 Hibernate에 전달 될 값을 알고있는 속성 아래에서 지정하는 방법 hibernate.hbm2ddl.auto입니다.

값은 create, create-drop, validate, 그리고 update기본적으로 스키마 공구 관리가 시작시 데이터베이스 스키마를 조작하는 방법에 영향을 미친다.

예를 들어, update작업은 데이터베이스 메타 데이터를 얻기 위해 JDBC 드라이버의 API를 쿼리 한 다음 Hibernate는 주석이 달린 클래스 또는 HBM XML 매핑을 읽는 것을 기반으로 생성 한 객체 모델을 비교하고 즉시 스키마를 조정하려고 시도합니다.

update예를 들어 작업이 등 새로운 열, 제약 조건을 추가하려고 시도하지만, 이전에 존재하지하지만 더 이상 이전 실행에서 개체 모델의 일부로서 수행 한 수있는 열이나 제약 조건을 제거하지 않습니다.

일반적으로 테스트 케이스 시나리오에서는 create-drop스키마를 생성하고 테스트 케이스가 일부 모의 데이터를 추가하고 테스트를 실행 한 다음 테스트 케이스 정리 중에 스키마 개체가 삭제되어 빈 데이터베이스를 남길 수 있도록 사용합니다.

개발 과정에서 개발자 update가 자동으로 스키마를 수정하여 다시 시작할 때 새 추가 항목을 추가하는 것을 보는 것이 일반적 입니다. 그러나 이것은 더 이상 필요하지 않은 이전 실행에서 존재할 수있는 열이나 제약 조건을 제거하지 않습니다.

프로덕션에서는 none이 속성 을 사용 하거나 단순히 지정하지 않는 것이 좋습니다 . 특히 데이터베이스가 여러 서비스 및 애플리케이션에서 공유되는 경우 DBA가 데이터베이스 변경 사항에 대한 마이그레이션 스크립트를 검토하는 것이 일반적인 관행이기 때문입니다.


답변