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


126

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값을 사용하여 데이터베이스 스키마를 생성하는 방법을 실제로 이해하지 못했습니다 . 기술적으로 어떻게 작동하는지, 그리고 개발 및 프로덕션 서버에서이 속성을 사용하기위한 권장 사항이 무엇인지 설명해 주시겠습니까? 감사합니다


1
FWIW JPA 2.1에는 표준 속성 javax.persistence.schema-generation.database.action이 있으므로 스키마 생성을 위해 JPA 공급 업체별 속성을 사용할 필요성을 실제로 보지 마십시오.
Neil Stockton

@NeilStockton Hibernate 6에서 우리가 탐구하고있는 한 가지 아이디어는 카테고리에 따라 스키마 생성을 다르게 제어 할 수 있다는 것입니다. 예를 들어 orm 테이블이 될 수 none있지만 Hibernate Search 및 Envers 테이블 update은 해당 프로젝트에 의해 내부적으로 관리되고 수동으로 관리하고 싶지 않기 때문에 사용하여 생성 되도록 할 수 있습니다. 현재 우리는 출처 / 소스에 관계없이 모든 테이블에 대해이를 전역 적으로 제어합니다. 이것은 이것을 사용하려는 경우 공급 업체별 옵션을 사용하는 이유가됩니다.
Naros

답변:


212

레코드의 경우 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가 데이터베이스 변경 사항에 대한 마이그레이션 스크립트를 검토하는 것이 일반적인 관행이기 때문입니다.


11
예, 프로덕션에서 ddl 생성을 사용하지 마십시오. ddl을 사용하여 테이블 구조에 대한 초기 스크립트를 생성하고 프로세스에 DBA를 참여시킵니다. 그런 다음 배포 단위의 일부로 db 스크립트를 포함하고 애플리케이션이 배포 될 때 Flyway를 사용하여 실행합니다. 데이터베이스를 수정해야하는 경우 다음 버전의 애플리케이션에 새 스크립트를 추가하고 스테이징에 배포합니다. Flyway는 자동으로 현재 버전을 감지하고 데이터베이스를 최신 버전으로 가져 오는 데 필요한 스크립트를 실행합니다. 모든 것이 작동하면 프로덕션에 배포합니다.
Klaus Groenbaek

1
이 속성을 지정하지 않으면 어떻게 될까요? 예를 들어 내 자신의 <bean id = "sessionFactory"class = "org.springframework.orm.hibernate5.LocalSessionFactoryBean"> ... <prop key = "hibernate.hbm2ddl.auto"> update </ prop>가 있습니다. 그리고 어떤 이유로 위에서 언급 한 속성을 추가 할 때까지 내 테이블이 항상 삭제되었습니다.; 추신 : 코드 샘플 죄송합니다)
Ţîgan Ion

11
validate프로덕션 환경에 있지 않습니까?
Shamal Karunarathne

20
@ShamalKarunarathne 응용 프로그램은 validate프로덕션에서 사용할 수 있지만 일반적으로 데이터베이스 마이그레이션 도구에 작성하거나 적용한 데이터베이스 스크립트가 정확한지 확인하기 위해 품질 / 테스트 환경에서 사용하는 설정이어야합니다. validate프로덕션 에서 사용하지 않는 또 다른 이유 는 특히 개체 모델의 크기가 상당히 광범위하거나 다른 네트워크 관련 요소가 작용하는 경우 응용 프로그램의 시작 프로세스 중에 병목 현상이 발생할 수 있기 때문입니다.
Naros

1
정확한 스택 추적이 없으면 추측하기 어렵습니다. 그러나 내 첫 번째 추측은 order이스케이프되지 않으면 키워드이기 때문에 SQL 파서에 의해 잘못 해석되는 것입니다.
Naros
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.