2012-04-18 60 views
2

我使用Hibernate将Roo生成的Spring MVC应用程序连接到PostgreSQL。我试图将Flyway 1.6作为一个bean集成到Spring应用程序上下文中。 “有些东西阻止”迁移被执行,并且由于Hibernate元数据验证导致上下文初始化出错。 使用Flyway 1.6 Maven插件(clean,init,migrate)执行迁移没有问题。在Spring应用程序中无法迁移使用Flyway 1.6

Flyway 1.5(以前的版本)的整合工作得很好。

我应该怎么做才能让Flyway 1.6集成迁移工作? 我应该提供哪些额外配置?环境:Ubuntu 11.10,Springsource工具套件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

的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.password=library 
database.url=jdbc\:postgresql\://localhost\:5432/library 
database.username=library 
database.driverClassName=org.postgresql.Driver 

的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上下文配置:

<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.s[email protected]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.s[email protected]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) 
... 

回答

0

看来你可能会面临同样的问题,因为这样的:https://github.com/flyway/flyway/issues/107

请给附加的罐子a试验。如果它也适用于你,我会在接下来的几天内将它释放为1.6.1。

+0

一切正常[flyway-core-1.7-SNAPSHOT.jar](http://code.google.com/p/flyway/issues/detail?id=242#c4)。 非常感谢。期待Flyway的下一个版本 - 一个非常有价值的DB迁移工具。祝你好运! – Artemas 2012-04-19 11:38:16

+0

感谢您的反馈!总是让我开心:-) 1.6.1已经解决了。 – 2012-04-21 12:02:37

0

添加尾随/baseDir属性值(as mentioned)似乎是迁飞1.6解决方法:

<bean class="com.googlecode.flyway.core.Flyway" id="flyway" init-method="migrate"> 
    <property name="dataSource" ref="dataSource"/> 
    <property name="baseDir" value="db/migration/"/> 
</bean> 

迁移按预期运行,产生以下日志:

... 
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 - Found resource: db/migration/V1__initial.sql 
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/ 
DEBUG com.googlecode.flyway.core.util.ClassPathScanner - Found resource: db/migration/V1__initial.sql 
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.migration.sql.SqlScript - Found statement at line 17: CREATE TABLE public.schema_version (
... 
DEBUG com.googlecode.flyway.core.migration.sql.SqlStatement - Executing SQL: CREATE INDEX schema_version_current_version_index ON public.schema_version (current_version) 
INFO com.googlecode.flyway.core.metadatatable.MetaDataTable - Metadata table created: schema_version (Schema: public) 
INFO com.googlecode.flyway.core.migration.DbMigrator - Current schema version: null 
INFO com.googlecode.flyway.core.migration.DbMigrator - Migrating to version 1 
... 
INFO com.googlecode.flyway.core.migration.DbMigrator - Successfully applied 1 migration (execution time 00:00.161s). 
... 
相关问题