【问题标题】:Java Hibernate, Liquibase supports cross databases and SQLite?Java Hibernate、Liquibase 支持跨数据库和SQLite?
【发布时间】:2017-11-15 11:28:50
【问题描述】:

我正在使用带有 Hibernate 5 的 Spring Boot 1.5.2 并尝试支持尽可能多的数据库(即:Hibernate 将在 SQLite 3 中创建所有表,然后我使用 Liquibase 作为抽象层来生成 XML 更改-Liquibase 声称的所有类型的受支持数据库的日志文件:supported databases)。

所以我在 pom.xml (Maven) 中添加了 Liquibase 的依赖项。

    <!-- 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 数据库生成更改日志 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.properties 中有一些配置连接到 SQLite3 数据库文件,然后我可以运行这个命令来创建一个变更日志文件。

mvn liquibase:generateChangeLog

由于 addPrimaryKey 元素,我无法在另一个不同的 SQLite 3 db 文件中重新创建输出更改日志:

<changeSet author="rasdaman (generated)" id="1497363976895-86">
     <addPrimaryKey columnNames="address_id" tableName="address"/>
</changeSet>

以及Java Spring Boot启动时的错误:

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 这样的抽象数据文件,可以毫无问题地导入任何常见数据库?如果您有什么建议,请指教!

谢谢,

【问题讨论】:

    标签: java spring hibernate sqlite liquibase


    【解决方案1】:

    问题是 Liquibase 不太支持 SQLite http://www.liquibase.org/documentation/changes/add_primary_key.html ,还有 Hibernate 需要第三方 SQLite 方言并且写入性能不好,所以我认为 Liquibase 可以很好地与其他数据库一起使用:postgresql,mysql ,超SQL,...

    【讨论】:

      猜你喜欢
      • 2011-02-10
      • 1970-01-01
      • 2019-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-07
      • 1970-01-01
      相关资源
      最近更新 更多