Unable to migrate using Flyway 1.6 in Spring application

I have a Roo-generated Spring MVC application related to PostgreSQL using Hibernate. I am trying to integrate Flyway 1.6 as a bean in the context of a Spring application. Something is stopping the migration from executing, and I get an error initializing the context caused by the Hibernate metadata check. There is no problem performing the migration using the Flyway 1.6 Maven plugin (clean, init, migrate).

Integration Flyway 1.5 (previous version) works fine.

What to do to integrate Flyway 1.6 migration? What additional configuration should I provide?

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 8.4 JDBC3 source driver / 4 assembly 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 contextual 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> 

Journal:

 ... INFO org.springframework.beans.factory.support.DefaultListableBeanFactory - Pre-instantiating singletons in org.s pringframework.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.s pringframework.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) ... 
+2
source share
2 answers

It seems you are facing the same problem like this: https://github.com/flyway/flyway/issues/107

Please attach the attached test jar. If it also works for you, I will release it as 1.6.1 in the next few days.

0
source

Adding the final value of the / to baseDir ( as indicated ) seems to be a workaround for Flyway 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> 

Migrations are performed as expected, and produce the following log:

 ... 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). ... 
0
source

Source: https://habr.com/ru/post/1489759/


All Articles