Java HSQLDB和Liquibase,表已存在:DATABASECHANGELOGLOCK
我试图用liquibase和HSQLDB实现单元测试。 一切正常。但由于某些原因,当liquibase尝试在数据库上应用更改日志时,我得到: 我无法理解为什么会发生这种事 上下文只引发一次。我看不到以前有人创建过这个表 HSQLDB也在内存中运行。所以有一个新的例子 有什么想法吗? 以下是我的上下文和maven插件配置: 马文:Java HSQLDB和Liquibase,表已存在:DATABASECHANGELOGLOCK,java,maven,integration-testing,hsqldb,liquibase,Java,Maven,Integration Testing,Hsqldb,Liquibase,我试图用liquibase和HSQLDB实现单元测试。 一切正常。但由于某些原因,当liquibase尝试在数据库上应用更改日志时,我得到: 我无法理解为什么会发生这种事 上下文只引发一次。我看不到以前有人创建过这个表 HSQLDB也在内存中运行。所以有一个新的例子 有什么想法吗? 以下是我的上下文和maven插件配置: 马文: 阿维尼·莫霍神父 HSQLDBMaven插件 1.0.0 启动hsqldb 预集成测试 开始 停止hsqldb 整合后测试 停止 您正在运行哪个版本的liquiba
阿维尼·莫霍神父
HSQLDBMaven插件
1.0.0
启动hsqldb
预集成测试
开始
停止hsqldb
整合后测试
停止
您正在运行哪个版本的liquibase?谢谢。我认为答案与您需要调用ChangeLogHistoryServiceFactory.getInstance().reset()的答案相同在你清理数据库的地方,我最终会检查出来,移动到嵌入式mysql实例进行集成测试。但我更喜欢较轻的版本。你在同一数据库上使用不同的变更日志文件(例如,不同文件夹中的副本)吗?
INFO 14:19 14/06/14:liquibase: Successfully acquired change log lock
INFO 14:19 14/06/14:liquibase: Creating database history table with name: PUBLIC.DATABASECHANGELOG
2014-06-14 14:19:03,923 [DEBUG] [NewPooledConnection,handleThrowable(),430] - com.mchange.v2.c3p0.impl.NewPooledConnection@281fb795 handling a throwable.
java.sql.SQLException: Table already exists: DATABASECHANGELOGLOCK in statement [CREATE TABLE PUBLIC.DATABASECHANGELOGLOCK]
at org.hsqldb.jdbc.Util.sqlException(Unknown Source)
at org.hsqldb.jdbc.jdbcStatement.fetchResult(Unknown Source)
at org.hsqldb.jdbc.jdbcStatement.execute(Unknown Source)
at com.mchange.v2.c3p0.impl.NewProxyStatement.execute(NewProxyStatement.java:1006)
repository.connectionString = jdbc:hsqldb:mem:testdb
repository.driver = org.hsqldb.jdbcDriver
repository.username = SA
repository.password =
repository.hibernate.dialect = org.hibernate.dialect.H2Dialect
repository.hibernate.showSQL = true
repository.hibernate.onStartup = verify
public com.mchange.v2.c3p0.ComboPooledDataSource dataSource() throws PropertyVetoException {
com.mchange.v2.c3p0.ComboPooledDataSource ds = new ComboPooledDataSource();
ds.setDriverClass(REPOSITORY_DRIVER);
ds.setJdbcUrl(REPOSITORY_CONNTION_STRING);
ds.setUser(REPOSITORY_USERNAME);
ds.setPassword(REPOSITORY_PASSWORD);
ds.setAcquireIncrement(5);
ds.setIdleConnectionTestPeriod(60);
ds.setMaxPoolSize(10);
ds.setMaxStatements(50);
ds.setMinPoolSize(5);
return ds;
}
@Bean
@Autowired
public HibernateTransactionManager transactionManager(LocalSessionFactoryBean annotationSessionFactoryBean) {
return new HibernateTransactionManager(annotationSessionFactoryBean.getObject());
}
@Bean
@Autowired
public LocalSessionFactoryBean sessionFactory(ComboPooledDataSource dataSource) {
LocalSessionFactoryBean localSessionFactoryBean = new LocalSessionFactoryBean();
localSessionFactoryBean.setDataSource(dataSource);
localSessionFactoryBean.setPackagesToScan(new String[] { "X.Y.Z" });
localSessionFactoryBean.setHibernateProperties(hibernateProperties());
return localSessionFactoryBean;
}
@Bean
@Autowired
public SpringLiquibase liquibae(ComboPooledDataSource dataSource){
SpringLiquibase springLiquibase = new SpringLiquibase();
springLiquibase.setDataSource(dataSource);
springLiquibase.setContexts("dev,test");
springLiquibase.setChangeLog("classpath:db/db.changelog-master.xml");
return springLiquibase;
}
private Properties hibernateProperties() {
Properties hibernateProperties = new Properties();
hibernateProperties.setProperty("dialect", REPOSITORY_HIBERNATE_DIALECT);
hibernateProperties.setProperty("show_sql", REPOSITORY_HIBERNATE_SHOWSQL);
hibernateProperties.setProperty("hibernate.hbm2ddl.auto", REPOSITORY_HIBERNATE_ONSTARTUP);
return hibernateProperties;
}
<plugin>
<!-- current version -->
<groupId>fr.avianey.mojo</groupId>
<artifactId>hsqldb-maven-plugin</artifactId>
<version>1.0.0</version>
<!-- call start and stop -->
<executions>
<execution>
<id>start-hsqldb</id>
<phase>pre-integration-test</phase>
<goals>
<goal>start</goal>
</goals>
</execution>
<execution>
<id>stop-hsqldb</id>
<phase>post-integration-test</phase>
<goals>
<goal>stop</goal>
</goals>
</execution>
</executions>
</plugin>