2013-10-24 2 views
2

내 프로젝트에서 나는 종종 데이터베이스에 JPA/Hibernate 스택을 사용한다.JPA/Hibernate : 데이터베이스 스키마 생성 및 첫 번째 실행시 데이터 가져 오기, 후속 실행시 스키마 업데이트

persistence.xml을 정의 할 때 몇 가지 옵션이 있습니다. hibernate.hbm2ddl.auto을 설정할 수 있습니다. create으로 설정하면 모든 응용 프로그램 실행시 테이블이 다시 생성됩니다 (영구 데이터는 물론 손실됩니다). hibernate.hbm2ddl.import_files으로 db fixture를 설정하여 초기 데이터를 가져올 수도 있습니다. update으로 설정하면 새 엔티티에 대한 테이블 만 생성됩니다 (기존 테이블의 지속 된 데이터는 보존됩니다). 설정 hibernate.hbm2ddl.auto처럼 행동 - (데이터베이스에는 테이블이없는 경우)

첫 번째 응용 프로그램의 실행에
  • :

    것은 개발하고이 같은 행동을하고자하는 동안이 그 편리되지 않는 것입니다 hibernate.hbm2ddl.autoupdate (예 : 새 엔티티에 대한 새 테이블 생성, 이전 엔티티에 대한 테이블/데이터 남기기)으로 설정되어있는 경우 - create (엔티티 기반 테이블 생성) 및

  • 을 가져옵니다.

이런 식으로 구현할 수 있습니까?

내 일반적인 스택에 대한 추가 정보 : Tomacat에서 실행되는 스프링 웹 응용 프로그램은 데이터베이스가 MySql이고 데이터베이스 액세스를 위해 JPA/Hibernate입니다.

persistence.xml 보통은

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> 
<persistence-unit name="persistenceUnit" transaction-type="RESOURCE_LOCAL"> 
     <provider>org.hibernate.ejb.HibernatePersistence</provider> 
     <properties> 
      <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect"/> 
      <!-- value="create" to build a new database on each run; value="update" to modify an existing database; value="create-drop" means the same as "create" but also drops tables when Hibernate closes; value="validate" makes no changes to the database --> 
      <property name="hibernate.hbm2ddl.auto" value="update"/> 
      <property name="hibernate.ejb.naming_strategy" value="org.hibernate.cfg.ImprovedNamingStrategy"/> 
      <property name="hibernate.connection.charSet" value="UTF-8"/> 
      <property name="hibernate.hbm2ddl.import_files" value="/META-INF/spring/import.sql"/> 
     </properties> 
    </persistence-unit> 
</persistence> 

당신이 내 응용 프로그램 구성/구조에 대한 다른 정보를 필요로하는 경우, 의견을 주시기 바랍니다.

답변

1

그냥 사용 update - 데이터베이스가 비어 있다면 updatecreate에 대한 결과는 동일합니다.

+0

감사합니다. 혼란 스럽긴하지만,'update'만으로는 충분하지 않습니다. 데이터베이스 생성에 대한 초기 데이터를 가져 오려고합니다. 나는 보통 초기 db fixture를 지정하기 위해'hibernate.hbm2ddl.import_files' 속성을 사용하지만이 접근법은'create' 또는'create-drop'으로 설정된'hibernate.hbm2ddl.auto'에서만 작동합니다. 이를 반영하기 위해 내 소식을 업데이트하겠습니다. –

1

나는 동일한 문제가 있었고 어떤 Hibernate/JPA 솔루션도 찾지 못했습니다. 아무런 Hibernate 솔루션도 옵션이 없습니까? liquibase을 사용하도록 제안 할 수 있습니다. 초기 sqls를 정의한 다음 liquibase가 시작될 때이를 실행합니다. 그것은 maven pluggin을 가지고 있으므로, pom에서 설정하고 maven과 함께 사용할 수 있습니다.

3

hbm2ddl.auto을 사용하면 값이 아닌 데이터베이스의 구조 만 업데이트 할 수 있습니다.

예를 들어

: 이제 당신은 당신이 오히려있을 것이라는 점을 찾아 잠시 후

@Version 
private Long version; 

가 있다고 가정 해 보자

@Version 
@Temporal(TemporalType.TIMESTAMP) 
private Date lastModified; 
Hibernate는 의미의 변화에 ​​대한 단서 많은이없는

의미와 그에 따라 필드를 변환하는 방법이나 설정 기본값을 확실히 알지 못합니다.

속성 hbm2ddl.autohbm2ddl.import_files은 수명이 짧은 (메모리 내) 데이터베이스 (따라서 자동화 된 통합 또는 승인 테스트)에는 편리하지만 프로덕션 환경에는 적합하지 않습니다.

나는 강하게scriptella 또는 liquibase 같은 것을 건의 할 것입니다. 나는 개인적으로 후자를 사용한다. 나단 (Nathan)은이 도구에 대한 훌륭한 업무를 수행합니다. 문서에는 약간의 세부 사항이 없습니다.

는 말했다되는 : 트릭을 할해야합니다 귀하의 응용 프로그램의 첫 시작에

-Dhibernate.hbm2ddl.auto=create -Dhibernate.hbm2ddl.import_files=foo.sql 

. persistence.xmlhbm2ddl.auto의 값을 update으로 설정하면됩니다.