哪些步骤可以使用 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
属性并简单地指定数据库(如ORACLE
、DB2
等)。但是,SQLite 不存在,您需要配置特定的方言。
要指定方言,您可以使用database-platform
属性,然后将要使用的方言传递给它。
jpa:
database-platform: that.custom.SQLiteDialect
如果您想为 mysql 指定一个特定的方言(例如),这也适用于任何其他方言,如 org.hibernate.dialect.MySQL5InnoDBDialect
。
【讨论】:
以上是关于哪些步骤可以使用 Spring-Boot 和 JPA 启用 SQLite?的主要内容,如果未能解决你的问题,请参考以下文章
spring-boot学习一:使用Spring Initializr快速创建Spring boot项目
使用war将spring-boot和angular 7应用程序部署到tomcat 8.5中