哪些步骤使用 Spring-Boot 和 JPA 启用 SQLite?
Which steps enable SQLite with Spring-Boot and JPA?
为了 运行 SQLite 和 Spring-boot(版本 1.2.3.RELEASE)应用程序,我做了以下三个步骤:
使用 Spring boot and SQLite
中的 SQLiteDialect class
提供一个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 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.
看来我必须:
删除无意义的
日本帕:
数据库:SQLITE
上面的配置,
- 改为提供一些 "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,所谓的 策略 class 是 org.hibernate.dialect.Dialect
class 的功能实现。对于最常见的数据库,有一个快捷方式,然后您可以使用 database
属性 并简单地指定数据库(如 ORACLE
、DB2
等)。但是 SQLite 不存在,您需要配置特定的方言。
要指定方言,您可以使用 database-platform
属性 并传递要使用的方言。
jpa:
database-platform: that.custom.SQLiteDialect
如果您想为 MySQL 指定一个特定的方言(例如),这也适用于 org.hibernate.dialect.MySQL5InnoDBDialect
等任何其他方言。
为了 运行 SQLite 和 Spring-boot(版本 1.2.3.RELEASE)应用程序,我做了以下三个步骤:
使用 Spring boot and SQLite
中的 SQLiteDialect class
提供一个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 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.
看来我必须:
删除无意义的
日本帕: 数据库:SQLITE
上面的配置,
- 改为提供一些 "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,所谓的 策略 class 是 org.hibernate.dialect.Dialect
class 的功能实现。对于最常见的数据库,有一个快捷方式,然后您可以使用 database
属性 并简单地指定数据库(如 ORACLE
、DB2
等)。但是 SQLite 不存在,您需要配置特定的方言。
要指定方言,您可以使用 database-platform
属性 并传递要使用的方言。
jpa:
database-platform: that.custom.SQLiteDialect
如果您想为 MySQL 指定一个特定的方言(例如),这也适用于 org.hibernate.dialect.MySQL5InnoDBDialect
等任何其他方言。