哪些步骤可通过Spring-Boot和JPA启用SQLite?

shf*_*ful 5 java sqlite jpa spring-data spring-boot

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

  1. 使用Spring Boot和SQLite中的SQLiteDialect类

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

  3. 配置数据源;这里是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
    
    Run Code Online (Sandbox Code Playgroud)

现在,这还不够。它以“没有枚举常量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]
Run Code Online (Sandbox Code Playgroud)

不幸的是,确实org.springframework.orm.jpa.vendor.Database类没有SQLITE值。但是,spring文档(http://docs.spring.io/spring-framework/docs/2.5.6/api/org/springframework/orm/jpa/vendor/Database.html)指出:

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

看来我必须:

  1. 删除毫无意义

    jpa:数据库:SQLITE

上面的配置部分,以及

  1. 而是提供一些“战略课”。

我在正确的道路上吗?

它们对“战略课”意味着什么,以及如何获得或实施?

更新

解决方案:根据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
Run Code Online (Sandbox Code Playgroud)

似乎根本不需要实施“战略课”。
我现在知道了:删除的jpa: database: SQLITE行(与org.springframework.orm.jpa.vendor.Database类相对应)根本不是强制性的。这是一种方便的方法-对于大多数数据库,但对于SQLite而言。

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

M. *_*num 2

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

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

jpa:
    database-platform: that.custom.SQLiteDialect
Run Code Online (Sandbox Code Playgroud)

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