문제

나는 사용한다:

  • EJB3/JPA(최대 절전 모드)
  • MySQL 5

데이터베이스 마이그레이션을 지원하는 시스템을 설정해야 합니다.LiquiBase를 사용하려고 시도했지만 Hibernate와 함께 사용하기에는 아직 충분히 성숙하지 않은 것 같습니다.

내가 하고 싶은 것은:

  • 프로덕션 환경에 애플리케이션 버전 1.0이 있습니다.
  • 버전 2.0의 애플리케이션을 개발하고 테스트했습니다.
  • 데이터 손실 없이 프로덕션 환경에서 애플리케이션 데이터베이스를 업데이트하고 싶습니다.

사실 저는 새 제품을 사용하고 싶습니다. persistence.xml 기존 데이터베이스와 새 데이터베이스 사이의 "델타"를 생성할 수 있는 프로덕션 데이터베이스입니다.hbm2ddl이 "업데이트" 모드에 있을 때 실행되는 SQL 코드를 검색할 수 있기를 원합니다.

이 SQL 코드는 발생할 수 있는 데이터 손실을 방지하기 위해 수정됩니다(drop+create=rename 등...). hbm2ddl.auto=update.

나는 그것이 가능하다고 생각한다. 왜냐하면 Hibernate가 새로운 버전을 배포할 때 그것을 하기 때문이다. hbm2ddl.auto=update.하지만 나는 Ant 작업에서 그것을 할 수 있기를 원합니다. hibernatetool.

인터넷에서 이에 대한 많은 정보를 찾을 수 없으므로 누군가가 이미 여기에서 그런 일을 했고 나를 도울 수 있는지 궁금합니다.

나는 다음을 수행했습니다.

<hibernatetool destdir="${dist}">
            <!--
            <jdbcconfiguration propertyfile="hibtest.properties"></jdbcconfiguration>
            -->
            <jpaconfiguration persistenceunit="server-pu" />
            <classpath>
                <fileset dir="${core.lib.server}" includes="*.jar" />
                <fileset dir="${core.lib.runtime}" includes="*.jar" />
                <fileset dir="${core.lib.build}" includes="*.jar" />
                <pathelement location="${core.class}" />
                <pathelement location="${core.etc}" />
            </classpath>
            <hbm2ddl outputfilename="schema-delta.sql" format="true"
                export="false" update="true" />
</hibernatetool>

어떻게 해야 할지 잘 모르겠습니다. 생성 SQL 파일을 얻을 수 있었지만 델타만 원합니다.update="true" 를 입력해야 하나요?애플리케이션 서버 외부의 지속성 단위와 함께 jpaconfig를 사용할 수 있습니까? (db 설정은 Glassfish의 JNDI 리소스에 설정되어 있습니다.)(시도했지만 DB를 찾을 수 없습니다)

나는 또한 <jdbcconfiguration propertyfile="hibtest.properties"></jdbcconfiguration> 또는 데이터베이스 속성 설정 persistence.xml JNDI 리소스를 사용하는 대신.

다음 오류가 발생했습니다.

BUILD FAILED
/home/slorber/workspace/build/build.xml:899: org.hibernate.exception.JDBCConnectionException: Getting database metadata
    at org.hibernate.tool.ant.HibernateToolTask.reportException(HibernateToolTask.java:226)
    at org.hibernate.tool.ant.HibernateToolTask.execute(HibernateToolTask.java:189)
    at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:288)
    at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:105)
    at org.apache.tools.ant.Task.perform(Task.java:348)
    at org.apache.tools.ant.Target.execute(Target.java:357)
    at org.apache.tools.ant.Target.performTasks(Target.java:385)
    at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1329)
    at org.apache.tools.ant.Project.executeTarget(Project.java:1298)
    at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41)
    at org.eclipse.ant.internal.ui.antsupport.EclipseDefaultExecutor.executeTargets(EclipseDefaultExecutor.java:32)
    at org.apache.tools.ant.Project.executeTargets(Project.java:1181)
    at org.eclipse.ant.internal.ui.antsupport.InternalAntRunner.run(InternalAntRunner.java:423)
    at org.eclipse.ant.internal.ui.antsupport.InternalAntRunner.main(InternalAntRunner.java:137)
Caused by: org.hibernate.exception.JDBCConnectionException: Getting database metadata
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:97)
    at org.hibernate.cfg.reveng.dialect.AbstractMetaDataDialect.getMetaData(AbstractMetaDataDialect.java:64)
    at org.hibernate.cfg.reveng.dialect.AbstractMetaDataDialect.caseForSearch(AbstractMetaDataDialect.java:163)
    at org.hibernate.cfg.reveng.dialect.JDBCMetaDataDialect.getTables(JDBCMetaDataDialect.java:22)
    at org.hibernate.cfg.reveng.JDBCReader.processTables(JDBCReader.java:476)
    at org.hibernate.cfg.reveng.JDBCReader.readDatabaseSchema(JDBCReader.java:74)
    at org.hibernate.cfg.reveng.JDBCReader.readDatabaseSchema(JDBCReader.java:860)
    at org.hibernate.cfg.JDBCBinder.readDatabaseSchema(JDBCBinder.java:115)
    at org.hibernate.cfg.JDBCBinder.readFromDatabase(JDBCBinder.java:88)
    at org.hibernate.cfg.JDBCMetaDataConfiguration.readFromJDBC(JDBCMetaDataConfiguration.java:42)
    at org.hibernate.tool.ant.JDBCConfigurationTask.doConfiguration(JDBCConfigurationTask.java:81)
    at org.hibernate.tool.ant.ConfigurationTask.getConfiguration(ConfigurationTask.java:55)
    at org.hibernate.tool.ant.HibernateToolTask.getConfiguration(HibernateToolTask.java:302)
    at org.hibernate.tool.ant.Hbm2DDLExporterTask.createExporter(Hbm2DDLExporterTask.java:51)
    at org.hibernate.tool.ant.ExporterTask.execute(ExporterTask.java:39)
    at org.hibernate.tool.ant.HibernateToolTask.execute(HibernateToolTask.java:186)
    ... 15 more
Caused by: java.sql.SQLException: No suitable driver found for jdbc:mysql:3306//localhost/db
    at java.sql.DriverManager.getConnection(DriverManager.java:602)
    at java.sql.DriverManager.getConnection(DriverManager.java:154)
    at org.hibernate.connection.DriverManagerConnectionProvider.getConnection(DriverManagerConnectionProvider.java:133)
    at org.hibernate.cfg.reveng.dialect.AbstractMetaDataDialect.getConnection(AbstractMetaDataDialect.java:122)
    at org.hibernate.cfg.reveng.dialect.AbstractMetaDataDialect.getMetaData(AbstractMetaDataDialect.java:61)
    ... 29 more
--- Nested Exception ---
org.hibernate.exception.JDBCConnectionException: Getting database metadata
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:97)
    at org.hibernate.cfg.reveng.dialect.AbstractMetaDataDialect.getMetaData(AbstractMetaDataDialect.java:64)
    at org.hibernate.cfg.reveng.dialect.AbstractMetaDataDialect.caseForSearch(AbstractMetaDataDialect.java:163)
    at org.hibernate.cfg.reveng.dialect.JDBCMetaDataDialect.getTables(JDBCMetaDataDialect.java:22)
    at org.hibernate.cfg.reveng.JDBCReader.processTables(JDBCReader.java:476)
    at org.hibernate.cfg.reveng.JDBCReader.readDatabaseSchema(JDBCReader.java:74)
    at org.hibernate.cfg.reveng.JDBCReader.readDatabaseSchema(JDBCReader.java:860)
    at org.hibernate.cfg.JDBCBinder.readDatabaseSchema(JDBCBinder.java:115)
    at org.hibernate.cfg.JDBCBinder.readFromDatabase(JDBCBinder.java:88)
    at org.hibernate.cfg.JDBCMetaDataConfiguration.readFromJDBC(JDBCMetaDataConfiguration.java:42)
    at org.hibernate.tool.ant.JDBCConfigurationTask.doConfiguration(JDBCConfigurationTask.java:81)
    at org.hibernate.tool.ant.ConfigurationTask.getConfiguration(ConfigurationTask.java:55)
    at org.hibernate.tool.ant.HibernateToolTask.getConfiguration(HibernateToolTask.java:302)
    at org.hibernate.tool.ant.Hbm2DDLExporterTask.createExporter(Hbm2DDLExporterTask.java:51)
    at org.hibernate.tool.ant.ExporterTask.execute(ExporterTask.java:39)
    at org.hibernate.tool.ant.HibernateToolTask.execute(HibernateToolTask.java:186)
    at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:288)
    at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:105)
    at org.apache.tools.ant.Task.perform(Task.java:348)
    at org.apache.tools.ant.Target.execute(Target.java:357)
    at org.apache.tools.ant.Target.performTasks(Target.java:385)
    at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1329)
    at org.apache.tools.ant.Project.executeTarget(Project.java:1298)
    at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41)
    at org.eclipse.ant.internal.ui.antsupport.EclipseDefaultExecutor.executeTargets(EclipseDefaultExecutor.java:32)
    at org.apache.tools.ant.Project.executeTargets(Project.java:1181)
    at org.eclipse.ant.internal.ui.antsupport.InternalAntRunner.run(InternalAntRunner.java:423)
    at org.eclipse.ant.internal.ui.antsupport.InternalAntRunner.main(InternalAntRunner.java:137)
Caused by: java.sql.SQLException: No suitable driver found for jdbc:mysql:3306//localhost/db
    at java.sql.DriverManager.getConnection(DriverManager.java:602)
    at java.sql.DriverManager.getConnection(DriverManager.java:154)
    at org.hibernate.connection.DriverManagerConnectionProvider.getConnection(DriverManagerConnectionProvider.java:133)
    at org.hibernate.cfg.reveng.dialect.AbstractMetaDataDialect.getConnection(AbstractMetaDataDialect.java:122)
    at org.hibernate.cfg.reveng.dialect.AbstractMetaDataDialect.getMetaData(AbstractMetaDataDialect.java:61)
    ... 29 more

저는 MySQL을 사용하고 있으며 JDBC 속성은 다음과 같습니다.

hibernate.dialect=org.hibernate.dialect.MySQLInnoDBDialect
hibernate.connection.driver_class=com.mysql.jdbc.Driver
hibernate.connection.url=jdbc:mysql:3306//localhost/db
hibernate.connection.username=root
hibernate.connection.password=root
hibernate.connection.show_sql=true

내 JDBC MySQL 드라이버가 ${core.lib.server}: mysql-connector-java-5.1.7-bin.jar.(나도 클래스패스에 넣으려고 했으나 <fileset dir="/home/slorber/workspace/core/lib/server" includes="*.jar" />.)

또한 Ant(Eclipse 플러그인)의 실행 구성 클래스 경로에도 추가했습니다.

그래서 내 질문은 다음과 같습니다

  • 내가 원하는 것을 하기 위해 뭔가 잘못한 걸까?
  • 이것이 Hibernate 프레임워크를 사용하여 DB 마이그레이션을 수행하는 방식입니까?(수작업으로 만든 SQL 파일에 모든 DB 변경 사항을 기록하지 않으면 어떻게 하시겠습니까?)
도움이 되었습니까?

해결책

Hbm2ddl에는 직접 호출할 수 있는 API가 있습니다.기존 ant 작업이 원하는 작업을 수행하지 않는 경우 언제든지 hbm2ddl 호출을 직접 수행할 수 있습니다. 실행 문을 실제로 실행하거나 hbm2ddl 실행 메서드를 오버로드하는 대신 실행 문을 기록하는 오버로드된 jdbc 드라이버를 최대 절전 모드로 전달할 수도 있습니다.

또한 모든 종류의 diff를 통해 liquibase를 사용하고 xml 파일을 수동으로 생성하는 방법을 살펴봐야 한다고 덧붙이고 싶습니다.생성된 SQL이 올바른지 검증해야 한다는 점을 인식하고 개발하면서 한 번에 한 단계씩 SQL을 생성하는 것이 쉽기 때문에 그것이 옳다는 것을 알게 됩니다.

우리는 최대 절전 모드를 사용하며 liquibase 최대 절전 모드 통합을 사용하는 대신 최대 절전 모드 매핑을 업데이트하고 통합 테스트를 실행하여 실패하는지 확인하고 필요한 liquibase 변경 세트(테이블 추가, 열 추가, 열 이름 바꾸기 등)를 생성한 다음 다시 - 테스트를 실행하고 통과하는지 확인하세요.단계별로 변경 로그를 작성하는 것은 건전성 검사 이상의 차이점에 의존하지 않고도 일반적인 개발 리듬에 잘 맞습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top