Hibernate是否完全支持SQLite?

58

Jboss Hibernate在其维基页面SupportedDatabases2中没有提及对SQLite的支持。

这个Stack Overflow的帖子也提到了同样的问题:Hibernate+SQLite+Netbeans

您能否请您指出这个问题?我想在Swing桌面应用程序中使用嵌入式SQLite和Hibernate。

我还在评估Derby(JavaDB),因为它也可以被嵌入,并且是JDK的一部分。


3
你看过 H2 数据库吗?它占用空间小,可以嵌入到应用中,并且与 Hibernate 配合使用效果很好。 - Jason Sperske
谢谢Jason。我刚刚做了一个快速比较,H2看起来很有趣。我会和我的团队讨论一下。 - Atul
1
一个非常成熟和稳定的,100% Java RDBMS 可以在 HSQLDB 中使用,该数据库已经开发了将近20年。可以在 http://www.hsqldb.org 上下载数据库和 JDBC 4+ 驱动程序。 - scottb
5个回答

60

有几种SQLite方言。

Hibernate 3:

https://github.com/kemitix/sqlite-dialect

<dependency>
    <groupId>net.kemitix</groupId>
    <artifactId>sqlite-dialect</artifactId>
    <version>0.1.0</version>
</dependency>  

Hibernate 配置:

hibernate.dialect = org.hibernate.dialect.SQLiteDialect

Hibernate 4:

https://github.com/EnigmaBridge/hibernate4-sqlite-dialect

<dependency>
    <groupId>com.enigmabridge</groupId>
    <artifactId>hibernate4-sqlite-dialect</artifactId>
    <version>0.1.2</version>
</dependency>

Hibernate 配置:

hibernate.dialect = com.enigmabridge.hibernate.dialect.SQLiteDialect

注意:本仓库作者已变更。基于 gwenn 仓库。

Hibernate 5:

https://github.com/gwenn/sqlite-dialect/

作者与Hibernate团队合作,将其直接集成到Hibernate中。该过程在此问题中跟踪。

添加此依赖项:

    <dependency>
        <groupId>com.github.gwenn</groupId>
        <artifactId>sqlite-dialect</artifactId>
        <version>0.1.2</version>
    </dependency>

Hibernate配置:

hibernate.dialect = org.sqlite.hibernate.dialect.SQLiteDialect

2
使用jitpack.io解决方案来处理Hibernate 5,我发现所需的属性应该是:hibernate.dialect=org.hibernate.dialect.identity.SQLiteDialect,但仍然无法正常工作。我得到了一个异常,其消息如下:org.hibernate.boot.registry.selector.spi.StrategySelectionException: Unable to resolve name [org.hibernate.dialect.identity.SQLiteDialect] as strategy [org.hibernate.dialect.Dialect]这是在Hibernate 5.0.12版本中出现的。 - MiguelMunoz
2
Hibernate 5版本已发布到Maven,以下内容可以在此处找到:https://search.maven.org/artifact/com.github.gwenn/sqlite-dialect/0.1.0/jar - JWCompDev
3
最新的Hibernate 5代码与答案中的类名不同。方言应该是:org.sqlite.hibernate.dialect.SQLiteDialect - Camilo Sanchez
Hibernate 6 的更新? - Gradyn Wursten

18

由于SQLite是用C编写的嵌入式数据库,适用于类C环境,并且编译成本地代码,因此Hibernate(或任何ORM)支持的更改并不太高。Java是跨平台的,使用平台相关的依赖项会有点奇怪。在Android上,使用SQLite,但平台提供了一个JDBC驱动程序。

通常,Windows二进制文件可兼容不同的Windows版本 - 只要体系结构保持不变即可。如果查看SQLite下载页面,您会注意到有一个32位预构建的Windows二进制文件。这个可以在几乎任何Windows版本上使用(也许除了Windows RT),但是不能在Linux或OS X上使用。为了从Java中使用SQLite,您需要包含特定操作系统/体系结构的正确二进制文件,从而使Java应用程序具有平台相关性。这通常不是您想要的。

如果您正在构建Swing桌面应用程序,并希望使用嵌入式数据库,则我的建议是使用Java嵌入式数据库,例如H2HSQLDerby。后者还随Oracle Java一起提供,作为JavaDB。所有这些都被支持为hibernate方言(有关方言的完整列表,请参见方言类:https://github.com/hibernate/hibernate-orm/tree/master/hibernate-core/src/main/java/org/hibernate/dialect

如@akostadinov所指出,您可能需要考虑其他因素,例如SQLite是用本地代码编写的,因此可能具有更好的性能。最终,只有建立系统的人才能决定哪个数据库是最好的。


9
我理解了你对于“休眠”(Hibernate)的观点,但是关于平台依赖性,SQLite 的文档指出:“SQLite 数据库是一个单独的磁盘文件。此外,文件格式是跨平台的。在一台机器上创建的数据库可以被复制到另一台架构不同的机器上使用。SQLite 数据库可以在 32 位和 64 位计算机以及大端和小端架构之间传输并且是可移植的。” - Atul
4
数据库文件在不同平台间是可移植的,但是访问这些文件的代码属于本地代码,因此需要为每个想要运行该代码的平台进行编译。 - mthmulders
1
是的,但他可能还需要SQLite提供的性能和功能。 - akostadinov
2
SQLite并不仅限于“类C环境”,用C编写的代码可以编译为许多平台。SQLite可在Windows、Mac、Linux和许多处理器架构上使用。通过使用适当的方言和正确配置的数据源以及良好的SQLite JDBC驱动程序(https://github.com/xerial/sqlite-jdbc),可以使用Hibernate使用SQLite。 - peceps
2
平台无关性的论点并不是很好,因为Hibernate确实支持一些非平台无关的数据库,比如MS SQL(甚至在受支持的数据库列表中排名第三)。 - Osman-pasha
显示剩余10条评论

7
如果您需要使用Hibernate来操作SQLite数据库,那么您需要一个自定义方言。网上似乎有几个实现可供选择。
我试过了这个:https://github.com/gwenn/sqlite-dialect ,它在Hibernate 3中对我有效(但我认为它需要一些更新才能适用于Hibernate 4)。请注意,您必须自己编译代码,然后将hibernate.dialect配置属性设置为org.hibernate.dialect.SQLiteDialect
其他实现可以参考:http://code.google.com/p/hibernate-sqlite/https://gist.github.com/virasak/54436

4

据我所知,SQLite在SQL语法方面非常宽容,因此可能有效。我没有在Hibernate中广泛使用过SQLite,但尝试将其与Infinispan一起使用并取得了一些成功。我找到的最佳推荐的原始SQLite JDBC驱动程序缺少一些JDBC标准方法,因此我必须对其进行修补才能使其正常工作。

我认为你可以尝试将其与Hibernate一起使用,并查看是否有效。这可能有助于您了解我如何将其与Infinispan一起使用:

https://issues.jboss.org/browse/ISPN-2980

我知道这不是您想要看到的确切答案,但我决定回答,因为我认为没有其他人能以更有帮助的方式回答。至少在当时我搜索更多信息时,我找不到。


3

Hibernate 6开始,SQLite成为Hibernate存储库中的社区方言之一

添加以下依赖项:

Gradle:

implementation("org.hibernate.orm:hibernate-community-dialects:6.1.6.Final")

Maven:

<dependency>
    <groupId>org.hibernate.orm</groupId>
    <artifactId>hibernate-community-dialects</artifactId>
    <version>6.1.6.Final</version>
</dependency>

并将其设置为 Hibernate 方言:

org.hibernate.community.dialect.SQLiteDialect

在这个Hibernate GitHub讨论中,了解更多关于Hibernate社区维护的方言。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接