답변:
로부터 커뮤니티 문서 :
hibernate.hbm2ddl.auto SessionFactory가 생성 될 때 스키마 DDL을 데이터베이스에 자동으로 검증하거나 데이터베이스로 내 보냅니다. create-drop을 사용하면 SessionFactory가 명시 적으로 닫힐 때 데이터베이스 스키마가 삭제됩니다.
예를 들어 확인 | 업데이트 | 작성 | 만들기 드롭
가능한 옵션 목록은 다음과 같습니다.
이러한 옵션은 개발자 도구를위한 것이며 프로덕션 수준의 데이터베이스를 용이하게하지 않기 위해 다음 질문을 살펴볼 수 있습니다. 최대 절전 모드 : hbm2ddl.auto = 생산시 업데이트?
문서화되지 않은 "없음"이라는 값도있어 완전히 비활성화 할 수 있습니다.
구성 특성이 호출됩니다 hibernate.hbm2ddl.auto
개발 환경에서는 hibernate.hbm2ddl.auto=create-drop
배포 할 때마다 깨끗한 데이터베이스를 삭제하고 생성하여 데이터베이스가 알려진 상태에 있도록 설정했습니다.
이론적으로 hibernate.hbm2ddl.auto=update
모델을 변경하여 데이터베이스를 업데이트하도록 설정할 수 있지만 프로덕션 데이터베이스에서는 데이터베이스를 신뢰할 수 없습니다. 이 문서의 이전 버전은 적어도 실험적인 것이라고 밝혔다. 현재 상태를 모르겠습니다.
따라서 프로덕션 데이터베이스의 경우 설정하지 마십시오 hibernate.hbm2ddl.auto
. 기본값은 데이터베이스를 변경하지 않는 것입니다. 대신 한 버전에서 다음 버전으로 변경 사항을 적용하는 SQL DDL 업데이트 스크립트를 수동으로 만듭니다.
DB를 업데이트하기 위해 liquibase 를 사용 합니다. 최대 절전 모드의 스키마 업데이트 기능은 개발자가 새로운 기능을 개발하는 동안에 만 괜찮습니다. 프로덕션 상황에서는 db 업그레이드를보다 신중하게 처리해야합니다.
그것은 꽤 오래된 게시물이지만 주제에 대한 조사를 했으므로 공유 할 생각이었습니다.
최대 절전 모드 .hbm2ddl.auto
설명서에 따라 다음과 같은 네 가지 유효한 값을 가질 수 있습니다.
작성 | 업데이트 | 확인 | 만들기 드롭
다음은 이러한 값으로 표시되는 동작에 대한 설명입니다.
다음은 주목할만한 중요한 사항입니다.
Table not found:<table name>
이 속성에 값을 주면 (위의 4 가지 값 대신 abc) 또는 비어 있습니다. 다음과 같은 동작을 보여줍니다.
-스키마가 DB에 존재하지 않는 경우 :-스키마를 생성
-DB에 스키마가있는 경우 :- 스키마를 업데이트 하십시오.
먼저 hbm2ddl
구성 특성 의 가능한 값 은 다음과 같습니다.
none
-조치가 수행되지 않습니다. 스키마가 생성되지 않습니다.create-only
-데이터베이스 스키마가 생성됩니다.drop
-이후에 데이터베이스 스키마가 삭제되고 작성됩니다.create
-이후에 데이터베이스 스키마가 삭제되고 작성됩니다.create-drop
-이후에 데이터베이스 스키마가 삭제되고 작성됩니다. 를 닫으면 SessionFactory
데이터베이스 스키마가 삭제됩니다.validate
-데이터베이스 스키마는 엔티티 매핑을 사용하여 검증됩니다.update
-기존 데이터베이스 스키마와 엔티티 매핑을 비교하여 데이터베이스 스키마가 업데이트됩니다.가장 일반적인 Hibernate DDL 생성 전략에 대한 블로그 게시물 을 전담했습니다 .
hibernate.hbm2ddl.auto="update"
일부 사용자 정의 스크립트를 기능을 추가하거나 실행 계획이라면 편리하지만 덜 유연하다.그러나 Flyway를 사용하더라도 hbm2ddl을 사용하여 초기 마이그레이션 스크립트를 생성 할 수 있습니다. 에서 이 기사 , 당신은 당신이 jOOQ 표 모델로 JPA 엔티티 모델을 결합 할 수있는 방법을 볼 수 있습니다.
hibernate.hbm2ddl.auto
sessionFactory가 작성 될 때 DDL을 자동으로 유효성 검증하고 스키마로 내 보냅니다.
기본적으로 DB에서는 자동으로 생성 또는 수정을 수행하지 않습니다. 사용자가 아래 값 중 하나를 설정하면 DDL 스키마 변경이 자동으로 수행됩니다.
create-스키마 생성
<entry key="hibernate.hbm2ddl.auto" value="create">
업데이트-기존 스키마 업데이트
<entry key="hibernate.hbm2ddl.auto" value="update">
유효성 검사-기존 스키마 유효성 검사
<entry key="hibernate.hbm2ddl.auto" value="validate">
create-drop-세션이 시작되고 종료 될 때 스키마를 자동으로 작성 및 삭제
<entry key="hibernate.hbm2ddl.auto" value="create-drop">
앱에서 문자열을 사용하지 않고 미리 정의 된 상수를 찾고 org.hibernate.cfg.AvailableSettings
있다면 가능한 모든 설정에 대한 상수를 찾을 수있는 Hibernate JAR 에 클래스가 포함되어 있습니다. 예를 들어 귀하의 경우 :
/**
* Auto export/update schema using hbm2ddl tool. Valid values are <tt>update</tt>,
* <tt>create</tt>, <tt>create-drop</tt> and <tt>validate</tt>.
*/
String HBM2DDL_AUTO = "hibernate.hbm2ddl.auto";
validate
: 스키마의 유효성을 검사하며 데이터베이스에는 아무런 변화가 없습니다.update
: 현재 실행 쿼리로 스키마를 업데이트합니다.create
: 매번 새 스키마를 작성하고 이전 데이터를 제거합니다.create-drop
: 애플리케이션이 중지되거나 SessionFactory가 명시 적으로 닫힐 때 스키마를 삭제합니다.나는 당신이에 집중해야한다고 생각
SchemaExport Class
이 클래스는 구성을 동적으로 설정하므로 가장 적합한 제품군을 선택할 수 있습니다 ...
validate
: 스키마의 유효성을 검사하고 DB를 변경하지 않습니다.
맵핑 파일에 새 컬럼을 추가하고 삽입 조작을 수행한다고 가정하면 기존 스키마가 삽입하려는 오브젝트와 다르기 때문에 "XYZ 컬럼 누락"예외가 발생합니다. 새 열을 수동으로 추가하여 테이블을 변경 한 다음 삽입 작업을 수행하면 새 열과 함께 모든 열이 테이블에 확실히 삽입됩니다. 기존 스키마 / 테이블을 변경 / 변경하지 않음을 의미합니다.
update
: 작업을 수행 할 때 데이터베이스의 기존 테이블을 변경합니다. 이 hbm2ddl 옵션을 사용하여 열을 추가하거나 제거 할 수 있습니다. 그러나 'NOT NULL'인 새 열을 추가하려는 경우 해당 특정 열을 DB에 추가하는 것을 무시합니다. 기존 테이블에 'NOT NULL'열을 추가하려면 테이블이 비어 있어야하므로.
5.0 이후 , 이제 전용에 그 값을 찾을 수 있습니다 Enum
: org.hibernate.boot.SchemaAutoTooling
(가치 향상 NONE
5.2 이후)를.
또는 5.1 이후 JPA 2와 "레거시"Hibernate DDL 작업을 결합한 것을 사용할 수도 있습니다 .org.hibernate.tool.schema.Action
Enum
그러나 아직 DataSource
프로그래밍 방식으로 구성 할 수는 없습니다 . 이것을 결합하여 사용하는 org.hibernate.cfg.AvailableSettings#HBM2DDL_AUTO
것이 좋지만 현재 코드는 String
값 (에서 발췌)을 기대합니다 SessionFactoryBuilderImpl
.
this.schemaAutoTooling = SchemaAutoTooling.interpret( (String) configurationSettings.get( AvailableSettings.HBM2DDL_AUTO ) );
...와 내부 enum
모두의 값 org.hibernate.boot.SchemaAutoTooling
과 org.hibernate.tool.schema.Action
공개적으로 노출되지 않습니다.
아래에서 DataSource
gambit를 사용 .name().toLowerCase()
하지만 (예를 들어가 아닌 create-drop
) 대시가없는 값으로 만 작동 하는 샘플 프로그래밍 구성 (Spring Boot 응용 프로그램에서 사용됨 ) :
@Bean(name = ENTITY_MANAGER_NAME)
public LocalContainerEntityManagerFactoryBean internalEntityManagerFactory(
EntityManagerFactoryBuilder builder,
@Qualifier(DATA_SOURCE_NAME) DataSource internalDataSource) {
Map<String, Object> properties = new HashMap<>();
properties.put(AvailableSettings.HBM2DDL_AUTO, SchemaAutoTooling.CREATE.name().toLowerCase());
properties.put(AvailableSettings.DIALECT, H2Dialect.class.getName());
return builder
.dataSource(internalDataSource)
.packages(JpaModelsScanEntry.class, Jsr310JpaConverters.class)
.persistenceUnit(PERSISTENCE_UNIT_NAME)
.properties(properties)
.build();
}
누가 기본값을 검색합니까?
스프링 부트 2.0.5 버전의 소스 코드와 JpaProperties의 1.1.0 소스 코드로 작성되었습니다.
/**
* DDL mode. This is actually a shortcut for the "hibernate.hbm2ddl.auto"
* property. Defaults to "create-drop" when using an embedded database and no
* schema manager was detected. Otherwise, defaults to "none".
*/
private String ddlAuto;