Hibernate hbm2ddl.auto 설정의 가능한 값은 무엇이며 어떻게합니까?


1085

업데이트, 내보내기 및 hibernate.hbm2ddl.auto
업데이트 사용시기 및 사용하지 않을 때 알아야 할 값에 대해 더 알고 싶습니다 . 그리고 대안은 무엇입니까?

DB에서 발생할 수있는 변경 사항은 다음과 같습니다.

  • 새로운 테이블
  • 이전 테이블의 새 열
  • 열이 삭제되었습니다.
  • 변경된 열의 데이터 유형
  • 열 유형이 속성을 변경 함
  • 테이블 삭제
  • 열 값이 변경됨

각각의 경우 가장 좋은 해결책은 무엇입니까?

답변:


1083

로부터 커뮤니티 문서 :

hibernate.hbm2ddl.auto SessionFactory가 생성 될 때 스키마 DDL을 데이터베이스에 자동으로 검증하거나 데이터베이스로 내 보냅니다. create-drop을 사용하면 SessionFactory가 명시 적으로 닫힐 때 데이터베이스 스키마가 삭제됩니다.

예를 들어 확인 | 업데이트 | 작성 | 만들기 드롭

가능한 옵션 목록은 다음과 같습니다.

  • validate : 스키마를 검증하고 데이터베이스를 변경하지 않습니다.
  • update : 스키마를 업데이트합니다.
  • create : 스키마를 생성하여 이전 데이터를 삭제합니다.
  • create-drop : SessionFactory가 명시 적으로 닫히면 (일반적으로 응용 프로그램이 중지 될 때) 스키마를 삭제합니다.
  • none : 스키마와 관련이 없으며 데이터베이스를 변경하지 않습니다.

이러한 옵션은 개발자 도구를위한 것이며 프로덕션 수준의 데이터베이스를 용이하게하지 않기 위해 다음 질문을 살펴볼 수 있습니다. 최대 절전 모드 : hbm2ddl.auto = 생산시 업데이트?


14
유효한 값에 대해서는 최대 절전 모드 문서를 읽으십시오. "eg"... 다른 유효한 값이 있습니까?
Ta Sas

16
누군가가 가능한 모든 값에 관심이 있다면 Hibernate의 javadoc에서 찾을 수 있다면 커뮤니티 문서 일 뿐이므로 "eg"라고 말합니다. (그리고 네, 만 네 가지 옵션이 존재) docs.jboss.org/hibernate/orm/4.1/javadocs/org/hibernate/cfg/...
szegedi

4
validate는 스키마의 유효성을 검사한다고 말합니다. 정확히 무엇을 의미합니까 ??
Hussain Akhtar Wahid 'Ghouri'9

6
최대 절전 모드로 작업을 수행하지 않으려는 경우 'aardvark'또는 'pigeon'또는 다른 단어를 사용할 수도 있습니다. 물론 권장하지는 않습니다!
Ward

2
작성 드롭 옵션에 약간 추가되었습니다. 이 옵션을 사용하면 전체 스키마를 삭제하지 않고이를 실행하는 동안 맵핑을 사용할 수있는 테이블을 삭제합니다. 예를 들어 Schema S가있는 데이터베이스에 A, B, C 테이블이 있고 Java 코드에 A와 B에 대한 매핑 만있는 경우 Hibernate는 테이블 C를 삭제하지 않습니다.
Aditya

194

문서화되지 않은 "없음"이라는 값도있어 완전히 비활성화 할 수 있습니다.


7
Hibernate의 스키마 유효성 검사가 때로는 완벽한 스키마에 대해 실패하기 때문에 이것은 실제로 매우 유용합니다.
Michael Piefel

나는 이것과 비슷한 것을 요구하려고했습니다. 저의 의도는 시작 시간을 줄이는 것입니다.
digao_mb

46
'빈 문자열'은 '없음'보다 낫습니다 . '없음'을 사용하려면 다음과 같은 경고 메시지가 나타납니다. org.hibernate.cfg.SettingsFactory- "hibernate.hbm2ddl.auto"에 대한 인식 할 수없는 값 : 없음
okwap

14
나는 그것을 패치했습니다. 명시 적으로 유효한 상수로 "없음"을 추가했습니다.
Sanne

9
나는 "hibernate.hbm2ddl.auto = potato"를 좋아한다 stackoverflow.com/a/15810379/838444
Sneg

161

구성 특성이 호출됩니다 hibernate.hbm2ddl.auto

개발 환경에서는 hibernate.hbm2ddl.auto=create-drop배포 할 때마다 깨끗한 데이터베이스를 삭제하고 생성하여 데이터베이스가 알려진 상태에 있도록 설정했습니다.

이론적으로 hibernate.hbm2ddl.auto=update모델을 변경하여 데이터베이스를 업데이트하도록 설정할 수 있지만 프로덕션 데이터베이스에서는 데이터베이스를 신뢰할 수 없습니다. 이 문서의 이전 버전은 적어도 실험적인 것이라고 밝혔다. 현재 상태를 모르겠습니다.

따라서 프로덕션 데이터베이스의 경우 설정하지 마십시오 hibernate.hbm2ddl.auto. 기본값은 데이터베이스를 변경하지 않는 것입니다. 대신 한 버전에서 다음 버전으로 변경 사항을 적용하는 SQL DDL 업데이트 스크립트를 수동으로 만듭니다.


5
실제로 문서에 따라 create-drop은 데이터베이스 팩토리를 작성하고 세션 팩토리가 명시 적으로 닫히면 삭제합니다. 세션 팩토리가 작성 될 때 테이블을 삭제 하지 않습니다 .
Frans

4
아니오, 세션 팩토리가 작성 될 때 테이블 작성 및 삭제는 테이블을 삭제 한 다음, 세션 팩토리가 닫힐 때 테이블 작성 테이블이 삭제됩니다. stackoverflow.com/a/6752698/1536382
Testo Testini

생산에서 hibernate.hbm2ddl.auto = create-drop을 만들면 생산에서 여러 연결 시간 초과가 발생할 수 있습니까?
METTAIBI


51

그것은 꽤 오래된 게시물이지만 주제에 대한 조사를 했으므로 공유 할 생각이었습니다.

최대 절전 모드 .hbm2ddl.auto

설명서에 따라 다음과 같은 네 가지 유효한 값을 가질 수 있습니다.

작성 | 업데이트 | 확인 | 만들기 드롭

다음은 이러한 값으로 표시되는 동작에 대한 설명입니다.

  • create :-스키마를 만듭니다. 스키마에 이전에 존재하는 데이터가 있다면 손실됩니다.
  • update :-주어진 값으로 스키마를 업데이트합니다.
  • validate :-스키마를 검증합니다. DB에는 아무런 변화가 없습니다.
  • create-drop :-이전에 존재하는 데이터를 파기하여 스키마를 만듭니다 (있는 경우). 또한 SessionFactory가 닫힐 때 데이터베이스 스키마를 삭제합니다.

다음은 주목할만한 중요한 사항입니다.

  • 의 경우 갱신 , 경우 스키마는 스키마가 생성 된 DB에 존재하지 않습니다.
  • 의 경우 유효성 검사 스키마가 DB에 존재하지 않는 경우, 그것은 만들어지지 않습니다. 대신 오류가 발생합니다.Table not found:<table name>
  • create-drop의 경우 세션을 닫을 때 스키마가 삭제되지 않습니다. SessionFactory를 닫을 때만 삭제됩니다.
  • 이 속성에 값을 주면 (위의 4 가지 값 대신 abc) 또는 비어 있습니다. 다음과 같은 동작을 보여줍니다.

    -스키마가 DB에 존재하지 않는 경우 :-스키마를 생성

    -DB에 스키마가있는 경우 :- 스키마를 업데이트 하십시오.


"update"가 사용될 때 스키마가 존재하지 않는 경우 스키마가 작성되는 것이 매우 중요합니다.
yuranos

"행동 설명"과 "중요 포인트"문을 비교할 때 create-drop이 모순됩니다.
VNT

2
업데이트비어 있는 차이점은 무엇입니까 ?
yashjain12yj

46

먼저 hbm2ddl구성 특성 의 가능한 값 은 다음과 같습니다.

  • none-조치가 수행되지 않습니다. 스키마가 생성되지 않습니다.
  • create-only -데이터베이스 스키마가 생성됩니다.
  • drop -이후에 데이터베이스 스키마가 삭제되고 작성됩니다.
  • create -이후에 데이터베이스 스키마가 삭제되고 작성됩니다.
  • create-drop-이후에 데이터베이스 스키마가 삭제되고 작성됩니다. 를 닫으면 SessionFactory데이터베이스 스키마가 삭제됩니다.
  • validate -데이터베이스 스키마는 엔티티 매핑을 사용하여 검증됩니다.
  • update -기존 데이터베이스 스키마와 엔티티 매핑을 비교하여 데이터베이스 스키마가 업데이트됩니다.

가장 일반적인 Hibernate DDL 생성 전략에 대한 블로그 게시물 을 전담했습니다 .

  1. hibernate.hbm2ddl.auto="update"일부 사용자 정의 스크립트를 기능을 추가하거나 실행 계획이라면 편리하지만 덜 유연하다.
  2. 가장 유연한 접근 방식은 사용하는 것입니다 이동 경로를 .

그러나 Flyway를 사용하더라도 hbm2ddl을 사용하여 초기 마이그레이션 스크립트를 생성 할 수 있습니다. 에서 이 기사 , 당신은 당신이 jOOQ 표 모델로 JPA 엔티티 모델을 결합 할 수있는 방법을 볼 수 있습니다.


27

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">

2
<entry key = "hibernate.hbm2ddl.auto"value = "none">은 어떻습니까?
VNT

17

앱에서 문자열을 사용하지 않고 미리 정의 된 상수를 찾고 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";

5
왜 거의 500 vole up으로 700+ 라인 긴 소스 파일에 대한 대답이 바로 대답입니까?
Pavel Niedoba

... 그 질문은 말이되지 않습니다. 왜 일이 있습니까? 내가 왜 여기있어?
specializt

8
  • validate: 스키마의 유효성을 검사하며 데이터베이스에는 아무런 변화가 없습니다.
  • update: 현재 실행 쿼리로 스키마를 업데이트합니다.
  • create: 매번 새 스키마를 작성하고 이전 데이터를 제거합니다.
  • create-drop: 애플리케이션이 중지되거나 SessionFactory가 명시 적으로 닫힐 때 스키마를 삭제합니다.

'공식적인'문서 참조는 무엇입니까? -그냥 궁금해 ...
Dirk Schumacher

7

나는 당신이에 집중해야한다고 생각

SchemaExport Class 

이 클래스는 구성을 동적으로 설정하므로 가장 적합한 제품군을 선택할 수 있습니다 ...

결제 [SchemaExport]


4

validate: 스키마의 유효성을 검사하고 DB를 변경하지 않습니다.
맵핑 파일에 새 컬럼을 추가하고 삽입 조작을 수행한다고 가정하면 기존 스키마가 삽입하려는 오브젝트와 다르기 때문에 "XYZ 컬럼 누락"예외가 발생합니다. 새 열을 수동으로 추가하여 테이블을 변경 한 다음 삽입 작업을 수행하면 새 열과 함께 모든 열이 테이블에 확실히 삽입됩니다. 기존 스키마 / 테이블을 변경 / 변경하지 않음을 의미합니다.

update: 작업을 수행 할 때 데이터베이스의 기존 테이블을 변경합니다. 이 hbm2ddl 옵션을 사용하여 열을 추가하거나 제거 할 수 있습니다. 그러나 'NOT NULL'인 새 열을 추가하려는 경우 해당 특정 열을 DB에 추가하는 것을 무시합니다. 기존 테이블에 'NOT NULL'열을 추가하려면 테이블이 비어 있어야하므로.


3

5.0 이후 , 이제 전용에 그 값을 찾을 수 있습니다 Enum: org.hibernate.boot.SchemaAutoTooling(가치 향상 NONE5.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.SchemaAutoToolingorg.hibernate.tool.schema.Action공개적으로 노출되지 않습니다.

아래에서 DataSourcegambit를 사용 .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();
}

0

누가 기본값을 검색합니까?

스프링 부트 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;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.