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
로 설정된 경우에만 작동합니다 .create
create-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
에는 몇 가지 심각한 단점이 있습니다.
- 구조 만 변경할 수 있습니다. 기존 값을 덮어 쓰거나 최악의 경우 단순히 Nirvana로 전송 될 수 있습니다. liquibase 또는 scriptella 와 같은 도구가 없으면 ETL 기능 이 없습니다 .
- 이 방법에는 거래가 없습니다. 구조 및 데이터 문은 트랜잭션 관리자가 인수하기 전에 실행됩니다. 256 개 중 42 번째 문에 오류가 있다고 가정 해 보겠습니다. 데이터베이스는 현재 일관성이없는 상태입니다.
- Imvho, 당신은 투명성과 통제력을 잃습니다. scriptella 스크립트 또는 liquibase 변경 세트가 있거나 일반적으로 도메인 모델의 변경 사항과 함께 커밋되는 곳에서 도메인 모델을 변경하고 (기본적으로) 최대 절전 모드가 수행 할 작업을 찾을 수 있기를 바랍니다. (그렇지 않지만 다른 이야기입니다.)
- 통합, 시스템 및 승인 테스트 의 경우 테스트 데이터베이스가 프로덕션 데이터베이스 와 완전히 동일한 상태 라고 가정 합니다. 수동으로 추적해야합니다 (행운을 빕니다!;)). 실수를하더라도 작은 실수만으로도 충분하며 그 결과는 매우 치명적일 수 있습니다.
저는 개인적으로 데이터베이스 변경 관리에 liquibase를 사용하고 유지 관리 작업을 줄이기 위해 다음 워크 플로를 개발했습니다.
- 내 마지막 릴리스 구조 의 명령 줄에서 변경 로그 생성
- 내 최신 데이터베이스의 변경 로그 생성
- 두 변경 로그를 수동으로 비교합니다 (일반적으로 변경 사항은 그다지 크지 않으며, 만약 그렇다면 일반적으로 liquibases diff 명령 의 단점 중 하나를 충족 합니다.
- 변경 세트 생성
customChange 를 구현 해야하는 복잡한 변경의 경우에도 롤백 정의, 테스트 및 문서화를 포함하여 몇 시간 만에이를 수행 할 수 있습니다. 사소한 변경의 경우 몇 분이면됩니다. 기본적으로 약간 더 많은 작업을 수행해야하지만 (1 일 이내에 4 개의 데이터베이스 구성에 대해 사용자 정의 된 변경 세트를 작성했습니다) 데이터베이스를 일관된 상태로 유지하기 위해 가능한 모든 작업을 수행했다는 사실에 안심할 수 있습니다.
이 문제로 몇 시간이 지나고 나는 아주 오래된 게시물이지만 내가 찾은 것을 공유하기로 결정했습니다.
제대로 작동하려면 다음을 수행해야했습니다.
hbmddl
create
또는로 설정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
'IT Share you' 카테고리의 다른 글
x-www-form-urlencoded를 사용하여 Angular2를 POST로 강제 실행하는 방법 (0) | 2020.11.25 |
---|---|
Android WebView에서 YouTube 동영상 재생을 중지하는 방법은 무엇입니까? (0) | 2020.11.25 |
Android에서 Android 확인 null 또는 빈 문자열 (0) | 2020.11.25 |
Ruby에서 시간을 가장 가까운 15 분으로 내림하는 방법은 무엇입니까? (0) | 2020.11.25 |
PHP에서 함수를 덮어 쓸 수 있습니까? (0) | 2020.11.25 |