无法在Spring应用程序中使用Flyway 1.6进行迁移 [英] Unable migrate using Flyway 1.6 in Spring application
问题描述
我有Roo生成的Spring MVC应用程序使用Hibernate连接到PostgreSQL.我正在尝试将Flyway 1.6作为bean集成到Spring应用程序上下文中. 某些事情阻止了"迁移的执行,并且由于Hibernate元数据验证而导致的上下文初始化出现错误. 使用Flyway 1.6 Maven插件执行迁移没有任何问题(干净,初始化,迁移).
I have Roo-generated Spring MVC application connected to PostgreSQL using Hibernate. I am trying to integrate Flyway 1.6 as a bean into Spring application context. "Something prevents" migrations from being executed and I'm getting error on context initialization caused by Hibernate metadata validation. There are no problems performing migrations using Flyway 1.6 Maven plugin (clean, init, migrate).
集成Flyway 1.5(以前的版本)就可以了.
Integration of Flyway 1.5 (previous version) works just fine.
为了使Flyway 1.6集成迁移正常工作,我应该怎么做? 我应该提供什么其他配置?
What should I do in order to make Flyway 1.6 integrated migrations work? What additional configuration should I provide?
环境:Ubuntu 11.10,Springsource Tool Suite 2.9.1(Eclipse 3.7.2),OpenJDK 6b23,Tomcat 7.0.23,PostgreSQL 8.4.9/9.1,Spring 3.0/3.1,Hibernate 3.6.4.Final,PostgreSQL本机驱动程序8.4 JDBC3/4内部版本702.
Environment: Ubuntu 11.10, Springsource Tool Suite 2.9.1 (Eclipse 3.7.2), OpenJDK 6b23, Tomcat 7.0.23, PostgreSQL 8.4.9/9.1, Spring 3.0/3.1, Hibernate 3.6.4.Final, PostgreSQL Native Driver 8.4 JDBC3/4 build 702.
pom.xml:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
...
<dependencies>
...
<dependency>
<groupId>com.googlecode.flyway</groupId>
<artifactId>flyway-core</artifactId>
<version>1.6</version>
<classifier/>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>com.googlecode.flyway</groupId>
<artifactId>flyway-maven-plugin</artifactId>
<version>1.6</version>
<configuration>
<driver>org.postgresql.Driver</driver>
<url>jdbc:postgresql://localhost:5432/library</url>
<baseDir>db/migration</baseDir>
<user>library</user>
<password>library</password>
</configuration>
</plugin>
...
</plugins>
</build>
</project>
database.properties:
database.properties:
database.password=library
database.url=jdbc\:postgresql\://localhost\:5432/library
database.username=library
database.driverClassName=org.postgresql.Driver
persistence.xml:
persistence.xml:
<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.PostgreSQLDialect"/>
<property name="hibernate.hbm2ddl.auto" value="validate"/>
<property name="hibernate.ejb.naming_strategy" value="org.hibernate.cfg.ImprovedNamingStrategy"/>
<property name="hibernate.connection.charSet" value="UTF-8"/>
</properties>
</persistence-unit>
</persistence>
Spring上下文配置:
Spring context configuration:
<beans xmlns="http://www.springframework.org/schema/beans" ...>
<context:property-placeholder location="classpath*:META-INF/spring/*.properties"/>
<context:spring-configured/>
<context:component-scan base-package="edu.sandbox.library">
<context:exclude-filter expression=".*_Roo_.*" type="regex"/>
<context:exclude-filter expression="org.springframework.stereotype.Controller" type="annotation"/>
</context:component-scan>
<bean class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" id="dataSource">
<property name="driverClassName" value="${database.driverClassName}"/>
<property name="url" value="${database.url}"/>
<property name="username" value="${database.username}"/>
<property name="password" value="${database.password}"/>
<property name="testOnBorrow" value="true"/>
<property name="testOnReturn" value="true"/>
<property name="testWhileIdle" value="true"/>
<property name="timeBetweenEvictionRunsMillis" value="1800000"/>
<property name="numTestsPerEvictionRun" value="3"/>
<property name="minEvictableIdleTimeMillis" value="1800000"/>
<property name="validationQuery" value="SELECT version();"/>
</bean>
<bean class="org.springframework.orm.jpa.JpaTransactionManager" id="transactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>
<tx:annotation-driven mode="aspectj" transaction-manager="transactionManager"/>
<bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" depends-on="flyway" id="entityManagerFactory">
<property name="persistenceUnitName" value="persistenceUnit"/>
<property name="dataSource" ref="dataSource"/>
</bean>
<bean class="com.googlecode.flyway.core.Flyway" id="flyway" init-method="migrate">
<property name="dataSource" ref="dataSource"/>
</bean>
</beans>
日志:
...
INFO org.springframework.beans.factory.support.DefaultListableBeanFactory - Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@19d03a4e: defining beans [org.springframework.beans.factory.config.PropertyPlaceholderConfigurer#0,org.springframework.context.config.internalBeanConfigurerAspect,org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.context.annotation.internalPersistenceAnnotationProcessor,dataSource,transactionManager,org.springframework.transaction.config.internalTransactionAspect,entityManagerFactory,flyway]; root of factory hierarchy
DEBUG com.googlecode.flyway.core.dbsupport.DbSupportFactory - Database: PostgreSQL
DEBUG com.googlecode.flyway.core.Flyway - Schema: public
DEBUG com.googlecode.flyway.core.util.ClassPathScanner - Scanning directory: file:/home/developer/projects/sandbox/t7-work/webapps/library/WEB-INF/classes/db/migration/
DEBUG com.googlecode.flyway.core.util.ClassPathScanner - Scanning directory: file:/home/developer/projects/sandbox/t7-work/webapps/library/WEB-INF/classes/db/migration/
INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Building JPA container EntityManagerFactory for persistence unit 'persistenceUnit'
...
INFO org.hibernate.tool.hbm2ddl.DatabaseMetadata - table not found: book
INFO org.springframework.beans.factory.support.DefaultListableBeanFactory - Destroying singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@43a4181c: defining beans [org.springframework.beans.factory.config.PropertyPlaceholderConfigurer#0,org.springframework.context.config.internalBeanConfigurerAspect,org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.context.annotation.internalPersistenceAnnotationProcessor,dataSource,transactionManager,org.springframework.transaction.config.internalTransactionAspect,entityManagerFactory,flyway]; root of factory hierarchy
ERROR org.springframework.web.context.ContextLoader - Context initialization failed org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'transactionManager' defined in file [/.../applicationContext.xml]: Cannot resolve reference to bean 'entityManagerFactory' while setting bean property 'entityManagerFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in file [/.../applicationContext.xml]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: persistenceUnit] Unable to build EntityManagerFactory
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:328)
...
推荐答案
似乎您可能面临与此相同的问题: https://github.com/flyway/flyway/issues/107
It seems you could be facing the same issue as this: https://github.com/flyway/flyway/issues/107
请对随附的广口瓶进行测试.如果它也对您有用,我将在接下来的几天以1.6.1的形式发布.
Please give the attached jar a test. If it also works for you, I'll release it as 1.6.1 in the next few days.
这篇关于无法在Spring应用程序中使用Flyway 1.6进行迁移的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!