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

Which steps enable SQLite with Spring-Boot and JPA?

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

  1. 使用 Spring boot and SQLite

  2. 中的 SQLiteDialect class
  3. 提供一个JDBC驱动;我们用了 org.xerial:sqlite-jdbc (http://mvnrepository.com/artifact/org.xerial/sqlite-jdbc/3.8.7)

  4. 配置数据源;这里有一个 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 class 没有 SQLITE 值,遗憾的是。 但是,spring 文档 (http://docs.spring.io/spring-framework/docs/2.5.6/api/org/springframework/orm/jpa/vendor/Database.html) 指出:

If a given PersistenceProvider supports a database not listed here, the strategy class can still be specified using the fully-qualified class name.

看来我必须:

  1. 删除无意义的

    日本帕: 数据库:SQLITE

上面的配置,

  1. 改为提供一些 "strategy class"。

我走的路对吗?

"strategy class" 是什么意思以及如何获得或实施它?

更新

解决:根据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

似乎根本不需要实施 "strategy class"。
我现在知道了:删除的 jpa: database: SQLITE 行(对应于 org.springframework.orm.jpa.vendor.Database class)根本不是强制性的。这是一种方便的方式——适用于大多数数据库,但不适用于 SQLite。

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

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

要指定方言,您可以使用 database-platform 属性 并传递要使用的方言。

jpa:
    database-platform: that.custom.SQLiteDialect

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