IT Share you

Hibernate를 사용하여 초기 데이터를 데이터베이스로 가져 오는 방법은 무엇입니까?

shareyou 2020. 11. 25. 21:40
반응형

Hibernate를 사용하여 초기 데이터를 데이터베이스로 가져 오는 방법은 무엇입니까?


응용 프로그램을 배포 할 때 배포를 단순화하기 위해 종종 Hibernate의 기능을 사용하여 데이터베이스 스키마를 생성합니다. 이는 hibernate.hbm2ddl.auto 속성을 구성하여 쉽게 달성 할 수 있습니다.

그러나 경우에 따라 일부 초기 데이터를 데이터베이스에 삽입해야합니다 (예 : 루트 사용자). 일종의로드 텍스트 파일로 최대 절전 모드를 통해이를 달성 할 수있는 방법이 있습니까?

그렇게 할 코드를 쉽게 프로그래밍 할 수 있다는 것을 알고 있지만 구성을 통해 동일한 작업을 수행하는 데 도움이되는 유틸리티가 이미 있는지 궁금합니다.


"Hibernate fixtures"에서 검색하여 이것을 찾았습니다.

Hibernate는 엔티티 관리자 팩토리가 생성 될 때 데이터베이스를 생성 할 것입니다 (실제로는 엔티티 관리자 팩토리에 의해 Hibernate의 SessionFactory가 생성 될 때). import.sql이라는 파일이 클래스 경로 ( '/import.sql')의 루트에 존재하는 경우 Hibernate는 데이터베이스 스키마 생성 후 파일에서 읽은 SQL 문을 실행합니다. Hibernate가 스키마를 생성하기 전에 스키마를 비운다는 것을 기억하는 것이 중요합니다 (스키마를 구축하는 과정에서 생성 될 모든 테이블, 제약 조건 또는 기타 데이터베이스 객체를 삭제합니다).

출처 : http://www.velocityreviews.com/forums/t667849-hibernate-quotfixturesquot-or-database-population.html

시도해보고 작동하는지 알려주십시오!


클래스 경로에 import.sql을 추가하면 잘 작동하며 hbm2ddl은 파일이 있는지 확인하고 실행합니다. 유일한 추가 세부 사항은 각 SQL 명령이 자체 행에 있어야한다는 것입니다. 그렇지 않으면 실행에 실패합니다.

또는 hbm2ddl.auto로 설정된 경우에만 작동합니다 .createcreate-drop


최대 절전 모드 구성에 최대 절전 속성 hibernate.hbm2ddl.import_files추가 합니다. 생성 할 hibernate.hbm2ddl.auto 속성을 변경합니다. 데이터를 삽입하려면 초기 SQL 코드와 함께 / classes 디렉토리에 initial_data.sql을 추가하십시오. Hibernate는 데이터베이스 스키마를 생성 한 후에 이것을 실행합니다.

<bean id="sessionFactory"
    class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">${hibernate.dialect}</prop>
            <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
            <prop key="hibernate.hbm2ddl.auto">create</prop>
            <prop key="hibernate.hbm2ddl.import_files">initial_data.sql</prop>
        </props>
    </property>
</bean>

hibernate 구성에 속성을 추가하지 않으려면 / classes 디렉토리에 import.sql 파일을 만들고 hibernate.hbm2ddl.auto 속성이 create와 같으면 기본적으로이를 사용합니다.


hbm2ddl.auto그리고 hbm2ddl.import_files속성은

(데이터베이스 변경 관리 도구로 오용되는 경우)

다른 곳 에서 언급 했듯이 데이터베이스 변경 관리를 위해 hibernate.hbm2ddl.auto사용 hibernate.hbm2ddl.import_files에는 몇 가지 심각한 단점이 있습니다.

  1. 구조 만 변경할 수 있습니다. 기존 값을 덮어 쓰거나 최악의 경우 단순히 Nirvana로 전송 될 수 있습니다. liquibase 또는 scriptella 와 같은 도구가 없으면 ETL 기능 이 없습니다 .
  2. 이 방법에는 거래가 없습니다. 구조 및 데이터 문은 트랜잭션 관리자가 인수하기 전에 실행됩니다. 256 개 중 42 번째 문에 오류가 있다고 가정 해 보겠습니다. 데이터베이스는 현재 일관성이없는 상태입니다.
  3. Imvho, 당신은 투명성과 통제력을 잃습니다. scriptella 스크립트 또는 liquibase 변경 세트가 있거나 일반적으로 도메인 모델의 변경 사항과 함께 커밋되는 곳에서 도메인 모델을 변경하고 (기본적으로) 최대 절전 모드가 수행 할 작업을 찾을 수 있기를 바랍니다. (그렇지 않지만 다른 이야기입니다.)
  4. 통합, 시스템 및 승인 테스트 의 경우 테스트 데이터베이스가 프로덕션 데이터베이스 와 완전히 동일한 상태 라고 가정 합니다. 수동으로 추적해야합니다 (행운을 빕니다!;)). 실수를하더라도 작은 실수만으로도 충분하며 그 결과는 매우 치명적일 수 있습니다.

저는 개인적으로 데이터베이스 변경 관리에 liquibase를 사용하고 유지 관리 작업을 줄이기 위해 다음 워크 플로를 개발했습니다.

  • 내 마지막 릴리스 구조 의 명령 줄에서 변경 로그 생성
  • 내 최신 데이터베이스의 변경 로그 생성
  • 두 변경 로그를 수동으로 비교합니다 (일반적으로 변경 사항은 그다지 크지 않으며, 만약 그렇다면 일반적으로 liquibases diff 명령 의 단점 중 하나를 충족 합니다.
  • 변경 세트 생성

customChange 를 구현 해야하는 복잡한 변경의 경우에도 롤백 정의, 테스트 및 문서화를 포함하여 몇 시간 만에이를 수행 할 수 있습니다. 사소한 변경의 경우 몇 분이면됩니다. 기본적으로 약간 더 많은 작업을 수행해야하지만 (1 일 이내에 4 개의 데이터베이스 구성에 대해 사용자 정의 된 변경 세트를 작성했습니다) 데이터베이스를 일관된 상태로 유지하기 위해 가능한 모든 작업을 수행했다는 사실에 안심할 수 있습니다.


이 문제로 몇 시간이 지나고 나는 아주 오래된 게시물이지만 내가 찾은 것을 공유하기로 결정했습니다.

제대로 작동하려면 다음을 수행해야했습니다.

  • hbmddlcreate또는로 설정create-drop
  • 클래스 경로 루트의 file.sql; 제 경우에는 resources폴더에 넣고 maven을 사용하고 있습니다.
  • 한 줄의 각 SQL 명령
  • 각 file.sql 파일의 시작 부분에 빈 줄이 있어야합니다 ==>이 줄에 대한 이유를 모르겠지만 빈 줄을 삽입하지 않으면 실행시 서버에서 첫 번째 문자 근처에 구문 오류가 있습니다.

도움이되기를 바랍니다.


import.sql의 형식이 올바른지 확인하세요. 테스트 할 한 줄 삽입 문으로 시작합니다.

참고 URL : https://stackoverflow.com/questions/673802/how-to-import-initial-data-to-database-with-hibernate

반응형