哪些步骤可以使用 Spring-Boot 和 JPA 启用 SQLite?

Posted

技术标签:

【中文标题】哪些步骤可以使用 Spring-Boot 和 JPA 启用 SQLite?【英文标题】:Which steps enable SQLite with Spring-Boot and JPA? 【发布时间】:2015-06-22 16:22:04 【问题描述】:

要使用 Spring-boot(版本 1.2.3.RELEASE)应用程序运行 SQLite,我执行了以下三个步骤:

    使用来自Spring boot and SQLite的SQLiteDialect类

    提供 JDBC 驱动程序;我们用了 org.xerial:sqlite-jdbc (http://mvnrepository.com/artifact/org.xerial/sqlite-jdbc/3.8.7)

    配置数据源;这里有一个 spring-boot .yml 文件:

       spring:
      datasource:
        url: jdbc:sqlite:<full-path-to-file>.db
        username: ...
        password: ...
        driverClassName: org.sqlite.JDBC
        ...
      jpa:
        database: SQLITE
        dialect: that.custom.SQLiteDialect
        hibernate:
          ddl-auto: update
    

现在,这还不够。它以“No enum constant org.springframework.orm.jpa.vendor.Database.SQLITE”错误结束:

Field error in object 'spring.jpa' on field 'database': rejected value [SQLITE]; codes [typeMismatch.spring.jpa.database,typeMismatch.database,typeMismatch.org.springframework.orm.jpa.vendor.Database,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [spring.jpa.database,database]; arguments []; default message [database]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'org.springframework.orm.jpa.vendor.Database' for property 'database'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type java.lang.String to type org.springframework.orm.jpa.vendor.Database for value 'SQLITE'; nested exception is java.lang.IllegalArgumentException: No enum constant org.springframework.orm.jpa.vendor.Database.SQLITE]

确实,org.springframework.orm.jpa.vendor.Database 类没有 SQLITE 值,遗憾的是。 然而,spring doc (http://docs.spring.io/spring-framework/docs/2.5.6/api/org/springframework/orm/jpa/vendor/Database.html) 声明:

如果给定的 PersistenceProvider 支持此处未列出的数据库,则仍可以使用完全限定的类名指定策略类。

看来我必须这样做:

    删除无意义的

    jpa: 数据库:SQLITE

上面的配置,和

    改为提供一些“策略类”。

我走对了吗?

“策略类”是什么意思,如何获取或实现它?

更新

解决方案:根据 M. Deinum 的评论,正确的配置为:

       spring:
      datasource:
        url: jdbc:sqlite:<full-path-to-file>.db
        username: ...
        password: ...
        driverClassName: org.sqlite.JDBC
        ...
      jpa:
        database-platform: that.custom.SQLiteDialect
        hibernate:
          ddl-auto: update

似乎根本不需要实施“战略课程”。 我现在明白了:删除的 jpa: database: SQLITE 行(对应于 org.springframework.orm.jpa.vendor.Database 类)根本不是强制性的。这是一种方便的方式——适用于大多数数据库,但不适用于 SQLite。

备注:使用 Hibernate 时,database-platform=... 条目与 Hibernate 特定配置中的 hibernate.dialect=that.custom.SQLiteDialect 类似,效果相同。

【问题讨论】:

dialect重命名为database-platform并重启。 按照您的建议(并删除 jpa:DATABASE:SQLITE )确实解决了这个问题!太好了,这最终应该是一个答案? 【参考方案1】:

对于 Hibernate,所谓的 策略类org.hibernate.dialect.Dialect 类的功能实现。对于最常见的数据库,有一个捷径,然后您可以使用database 属性并简单地指定数据库(如ORACLEDB2 等)。但是,SQLite 不存在,您需要配置特定的方言。

要指定方言,您可以使用database-platform 属性,然后将要使用的方言传递给它。

jpa:
    database-platform: that.custom.SQLiteDialect

如果您想为 mysql 指定一个特定的方言(例如),这也适用于任何其他方言,如 org.hibernate.dialect.MySQL5InnoDBDialect

【讨论】:

以上是关于哪些步骤可以使用 Spring-Boot 和 JPA 启用 SQLite?的主要内容,如果未能解决你的问题,请参考以下文章

spring-boot项目的docker集成化部署

spring-boot学习一:使用Spring Initializr快速创建Spring boot项目

使用war将spring-boot和angular 7应用程序部署到tomcat 8.5中

JSON Extractor/jp@gc - JSON Path Extractor 举例2

使用AOP校验用户登录和异常处理-2020-10-26

spring-boot集成PageHelper和通用Mapper