2017-02-09 4 views
11

실제로 저는 스프링 부트 응용 프로그램 프로젝트에서 작업 중이 었으며 때때로 다른 서버 (SQL Server)에서 내 데이터베이스에 대한 연결 시간이 있음을 발견했습니다. 특히 FlyWay를 사용하여 스크립트를 마이그레이션하려고 할 때 특히 효과적이었습니다. 여러 번 시도한 후에 그때 나는 내 속성 spring.jpa.hibernate.ddl-auto에서 지정하지 않았다는 것을 알았다. 나는 그 다음 약간의 조사를했고, 그것이 발전에 spring.jpa.hibernate.ddl-auto= create-drop를 추가하기 위해 recommanded하다는 것을 알았다. 그리고 제작시 spring.jpa.hibernate.ddl-auto= none으로 변경하십시오. 하지만 실제로 어떻게 작동하는지, 그리고 절전 모드로 데이터베이스 스키마를 생성하고 가치를 창출하거나 사용하지 않는 방법을 실제로 이해하지 못했습니다. 기술적으로 어떻게 작동하는지, 개발 및 프로덕션 서버에서이 속성을 사용하는 권장 사항은 무엇입니까? 고마워요spring.jpa.hibernate.ddl-auto 속성은 Spring에서 정확히 어떻게 작동하나요?

+0

FWIW JPA 2.1에는 _standard_ 속성 javax.persistence.schema-generation.database.action이 있으므로 스키마 생성에 JPA 공급 업체 특정 속성을 사용할 필요가 없습니다. –

답변

22

레코드의 경우 spring.jpa.hibernate.ddl-auto 속성은 Spring Data JPA에만 해당되며 결국 알고있는 속성 인 hibernate.hbm2ddl.auto에서 Hibernate로 전달 될 값을 지정하는 방법입니다.

create, create-drop, validateupdate은 기본적으로 시작시 스키마 도구 관리가 데이터베이스 스키마를 조작하는 방법에 영향을줍니다.

예를 들어, update 작업은 JDBC 드라이버의 API를 쿼리하여 데이터베이스 메타 데이터를 가져온 다음 Hibernate가 주석이있는 클래스 또는 HBM XML 매핑을 읽는 기준으로 생성 한 개체 모델을 비교하고 해당 스키마를 조정하려고 시도합니다 -파리.

예를 들어, update 연산은 새로운 열, 제약 조건 등을 추가하려고 시도하지만 이전에 존재했지만 이전 실행에서 객체 모델의 일부로는 존재하지 않는 열이나 제약 조건을 절대로 제거하지 않습니다.

일반적으로 테스트 케이스 시나리오에서는 create-drop을 사용하여 스키마를 만들고 테스트 케이스를 일부 모의 데이터를 추가하고 테스트를 실행 한 다음 테스트 사례 정리 중에 스키마 개체를 삭제하고, 빈 데이터베이스가 남는다.

개발 중에는 개발자가 update을 사용하여 자동으로 스키마를 수정하여 다시 시작할 때 새로운 추가 기능을 추가하는 것이 흔히 볼 수 있습니다. 그러나 이것은 더 이상 필요하지 않은 이전 실행으로 인해 발생할 수있는 열이나 제약 조건을 제거하지 않음을 다시 한번 이해합니다.

프로덕션에서는 none을 사용하거나 단순히이 속성을 지정하지 않는 것이 좋습니다. DBA가 데이터베이스 변경을 위해 마이그레이션 스크립트를 검토하는 것은 일반적인 관행입니다. 특히 데이터베이스가 여러 서비스 및 응용 프로그램에서 공유되는 경우 더욱 그렇습니다.

+1

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

+0

이 속성을 지정하지 않으면 어떻게됩니까? 예를 들어, 내 자신이있다 ... update 위의 속성을 추가 할 때까지 내 테이블이 항상 드롭되었습니다.; ps : 코드 샘플에 대해 미안합니다. –

+0

H2가 있고 스프링 부트가" create-drop "이라고 말하면서 내가 설정 한 속성을 무시합니다. https://docs.spring.io/spring-boot/docs/current/reference/html/howto-database-initialization.html –