是否可以将持久化对象保存到文件系统中?

12

我想使用Hibernate将持久化对象保存到文件系统,而不需要使用SQL数据库。

这种做法可行吗?


你的意思是不使用Hibernate来连接SQL数据库吗? - everton
3
OP似乎想要使用Hibernate API将数据持久化到文件系统,而不是SQL数据库。 - mcfinnigan
Hibernate基本上是一个对象关系映射工具。如果你不想要关系部分,为什么还要使用Hibernate呢? - skaffman
@Ben Crowhurst,你真的需要使用Hibernate吗?还是你对其他解决方案也持开放态度? - everton
我完全接受替代方法,只要它是可维护的。 - Ben Crowhurst
7个回答

4
Hibernate是基于JDBC的,所以你只需要一个JDBC驱动程序和匹配的Hibernate方言即可。然而,JDBC基本上是SQL的抽象,所以无论你使用什么,它看起来、走起来和呱呱叫都像一个SQL数据库——你可能会选择使用一个并避免很多麻烦。此外,任何这样的解决方案在大小和复杂性上都与轻量级Java数据库(如Derby)相当。当然,如果你不一定要使用Hibernate,还有许多其他选择。

那么SQLite呢?它非常接近在文件系统上持久化数据,尽管它是作为SQL数据库完成的。 - Bjarke Freund-Hansen
@bjarkef:是的,但它是用C语言编写的,所以如果你想在Java应用程序中使用它,你将失去平台独立性(或者必须包含多个副本)。 - Michael Borgwardt
@Michael Borgwardt:实际上,SQLite 有 JDBC 驱动程序,甚至还有一个 Hibernate 方言。然而,不建议使用它:与其他嵌入式数据库相比,其实现非常缓慢。 - parasietje
@parasietje:当然,有JDBC驱动程序,但是当JDBC驱动程序调用本地代码(可能通过JNI)编译为Windows,而您正在运行OSX时,这并没有帮助您。 - Michael Borgwardt

2

看起来如果使用JDBC纯文本驱动程序可能是技术上可行的;然而,我还没有看到任何开源软件提供写入访问权限; 我在sourceforge上找到的一个只支持读取。


还有一个使用XML文件的Ashpool:http://wiki.robrohan.com/Ashpool.html - GeertPt

2
我想你已经有了一个实体模型,我想你不希望失去这个模型,也不希望失去其中包含的关系。实体模型是指定要转换为关系数据库的。

Hibernate和其他JPA提供程序(如EclipseLink)将此实体模型转换为SQL。他们使用JDBC驱动程序提供与SQL数据库的连接。因此,您需要保留它。

正确的问题是:是否有人知道一种嵌入式Java SQL数据库,可以从Java中启动?这样的数据库有很多,在本主题中提到:

  • HyperSQL:将结果存储在SQL明文文件中,可以轻松导入任何其他数据库
  • H2:使用二进制文件,JAR文件大小低
  • Derby:使用二进制文件
  • Ashpool:将数据存储在XML结构化文件中

我曾在一个小数据项目中使用HyperSQL,在一个具有巨大数据库(2Gb甚至更多)的项目中使用Apache Derby。Apache Derby 在这些巨大的数据库上表现更好。


1

我不确定您的具体需求,但可能是以下之一:

1 - 如果您只是想摆脱SQL,可以使用NoSQL数据库。
Hibernate通过Hibernate OGM支持它(http://www.hibernate.org/subprojects/ogm)。 有一些数据库,如Cassandra、MongoDB、CouchDB、Hadoop...您可以在这里找到一些建议Here

2 - 现在,如果您不想使用数据库服务器(始终运行服务进程),可以使用Apache Derby。它就像任何其他SQL一样,但不需要服务器。它使用一个单独的文件来保存数据。您可以轻松地将所有数据库与程序一起传输。
看一下:http://db.apache.org/derby/

3 - 如果您真的想要一些纯文本文件,可以像Michael Borgwardt所说的那样做。但我不知道在这种情况下是否使用Hibernate是一个好主意。


0

H2HyperSQL都支持嵌入式模式(在JVM内部运行而不是在单独的服务器上运行)和保存到本地文件;这些仍然是SQL数据库,但使用Hibernate时没有太多其他选择。


0

嗯,既然问题仍然未得到解决,而且提问者表示接受新的方法/建议,那么我就来提供我的(虽然有点迟但没关系)。

你知道Prevayler吗?它是一个Java Prevalence实现,将所有业务对象保存在RAM中,并在文件系统中维护快照/更改日志,因此非常快速和可靠。如果发生任何崩溃,它将恢复上一个状态并重新应用每个更改。

此外,它非常容易设置和运行在您的应用程序中。


-5

当然可以,您可以简单地使用Java的文件io功能,需要遵循以下步骤:

  1. 创建一个File对象
  2. 创建一个FileInputStream对象(尽管有其他使用其他类的方法)
  3. 将此对象封装在Buffer对象中或者直接放在java.util.Scanner中。
  4. 使用前面步骤中创建的对象的特定写函数。

请注意,您的对象必须实现Serializable接口。 请参阅下面的链接


7
我认为问题背后的整个想法是通过Hibernate API来实现它。 - ŁukaszBachman
我最近在我的项目中尝试过这个,但不知何故我没有找到解决方案,所以我只能使用我的核心Java基础知识。Hibernate支持从平面文件读取,但写入对象到文件要么还没有得到支持,要么是我没有找到相关方法... - Amit

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