spring Java Hibernate,Liquibase支持跨数据库和SQLite?
我在Hibernate 5中使用Spring Boot 1.5.2,并尝试支持尽可能多的数据库(即:Hibernate将在SQLite 3中创建所有表,然后我使用Liquibase作为抽象层,为Liquibase声称:supported databases的所有支持的数据库生成XML更改日志文件)
所以我在pom中添加了对液化酶的依赖性。xml(Maven)
<!-- Database schema versions migration -->
<dependency>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-core</artifactId>
<version>3.5.3</version>
</dependency>
<dependency>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-maven-plugin</artifactId>
<version>3.4.1</version>
</dependency>
以及一个从Hibernate创建的数据库生成changelog XML文件的插件
<!-- Database schema versions migration -->
<plugin>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-maven-plugin</artifactId>
<version>3.5.3</version>
<configuration>
<propertyFile>src/main/resources/liquibase.properties</propertyFile>
</configuration>
</plugin>
我在liquibase中有一些配置。属性连接到SQLite3数据文件,然后我可以运行这个命令来创建一个变更日志文件
mvn liquibase:generateChangeLog
由于addPrimaryKey元素,我无法在另一个不同的SQLite 3 db文件中重新创建输出更改日志:
<changeSet author="rasdaman (generated)" id="1497363976895-86">
<addPrimaryKey columnNames="address_id" tableName="address"/>
</changeSet>
Java Spring启动时出现的错误:
addPrimaryKey is not supported on sqlite,
classpath:/database_versions/db.changelog-master.xml::1497366115846-62::rasdaman (generated)
at liquibase.changelog.DatabaseChangeLog.validate(DatabaseChangeLog.java:266)
at liquibase.Liquibase.update(Liquibase.java:210)
at liquibase.Liquibase.update(Liquibase.java:192)
at liquibase.integration.spring.SpringLiquibase.performUpdate(SpringLiquibase.java:431)
at liquibase.integration.spring.SpringLiquibase.afterPropertiesSet(SpringLiquibase.java:388)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1687)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1624)
如果我使用Liquibase从SQLite生成的输出文件,并允许Spring Boot从Postgresql数据源启动,我会遇到另一个错误:
org.springframework.beans.factory.BeanCreationException: Error creating
bean with name 'liquibase' defined in class path resource
[org/springframework/boot/autoconfigure/liquibase/LiquibaseAutoConfiguration$LiquibaseConfiguration.class]: Invocation of init method failed; nested exception is liquibase.exception.MigrationFailedException: Migration failed for change set classpath:/database_versions/db.changelog-master.xml::1497366115846-1:: (generated):
Reason: liquibase.exception.DatabaseException: ERROR: syntax error at or near "("
Position: 72 [Failed SQL: CREATE TABLE public."HT_abstract_coverage" (abstract_coverage_id BIGINT(2000000000, 10) NOT NULL, hib_sess_id CHAR(36))]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1628)
所以我似乎没有另一个工具来自动生成像XML这样的抽象数据文件,它可以毫无问题地导入到任何公共数据库?如果您有任何建议,请告知
谢谢
# 1 楼答案
问题是Liquibase不能很好地支持SQLite http://www.liquibase.org/documentation/changes/add_primary_key.html,Hibernate也需要第三方SQLite方言,写入性能不好,所以我认为Liquibase可以很好地与其他数据库配合使用,如postgresql、mysql、hyperSQL等