Java对象持久化的最简单方法是什么?

8

目前,我有一个Java程序,其类当前为POJO,并存储在易失性内存中。这些需要被持久化。据我所了解,两个流行的选择是JDO和Java持久化API。对于不太了解SQL、Torque等知识的人来说,哪种方法是将持久性添加到我的程序数据最简单的方法?


3
凡是(不)神圣的东西,尽量避开扭矩。请注意,这里的 "Torque" 是一个特定名词,指的是某个人、地方或事物。 - ChssPly76
6个回答

8
传统的将数据串行化到文件系统的方式是使用Java Serialisation。然而,您需要在所有地方实现Serializable接口。
更简单的解决方案是使用XStream将数据串行化为XML(然后转储到文件系统)。您不需要实现任何接口,大多数内容都可以自动进行串行化和反串行化。如果需要,您可以进一步定制串行化。我遇到的唯一问题是在没有有意串行化包含外部类的情况下串行化内部类(这是由于隐式的this引用所致)。

6

如果您不了解SQL或关系型数据库,则可以将对象序列化到文件系统中。

如果要使用JDO、JPA、Hibernate或其他任何技术,您需要学习JDBC。除非您的POJO非常复杂,否则建议从此处开始,并逐步深入。

确保您了解规范化和索引的正确设计。


要使用 JDO、JPA 或 Hibernate,显然不需要了解 JDBC,因为这些 API 的目的就是如此。它们在将数据持久化到关系型数据库时会在底层使用 JDBC,因此该复杂性对您来说是隐藏的。 - DataNucleus
3
我不同意-在了解JDBC之前使用它们是不可取的。虽然复杂性被隐藏起来,但这是一个泄漏的抽象。 - duffymo
1
使用JDO并不是一个泄漏的抽象,尽管JPA和Hibernate与JDBC紧密相关。这取决于提问者决定使用哪个API。 - DataNucleus
1
我不太了解JDO的抽象程度,但我不建议任何人在不了解关系数据库的情况下进行持久化。 - duffymo

5

我目前遇到的最简单的方法是使用db4o

ObjectContainer db = Db4o.openFile(location);
db.store(myObject);
List<MyObject> myObjects = db.query(MyObject.class);

此外,还有一些非常好的查询方式。


遗憾的是:在2014年10月,Actian决定不再积极推广和推动商业db4o产品为新客户提供服务。http://supportservices.actian.com/versant/default.html - Jonathan

5
如果序列化是一种选择,考虑使用类似于prevalayerSpace4J(更近期)的持久性API。关于对象普及性:

普及性是由Klaus Wuestefeld提出的一个概念,用于以真正的面向对象方式存储数据,仅使用内存快照、事务日志和序列化。

请查看this article以了解更多信息(在Google上有更多信息)。


3
Space4j还提供透明的集群和索引功能。 - TraderJoeChicago
链接似乎已经失效了 - Space4J.org现在变成了另外一个东西。 - m02ph3u5

2

听起来你可能想要将数据持久化到数据库中,但是为了避免数据库的复杂性,一种简单的解决方案是将POJO对象序列化到XML文档中进行持久化。Java 1.6 API中包含了javax.xml.bind包中的JAXB框架。使用JAXB时,你只需要给你的POJO对象添加注释,并创建marshal和unmarshal方法即可:

@XmlRootElement(name="Foo")
public class Foo {

   @XmlElement(name="Bar")
   public int mBar;

   public static void marshal(Foo foo, OutputStream out) IOException {      
      try {
         JAXBContext jc = JAXBContext.newInstance(Foo.class);
         Marshaller marshaller = jc.createMarshaller();
         marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
         marshaller.marshal(qaConfig, out);
      }
      catch (JAXBException ex) {
         throw new IOException(ex);
      }
      finally {
         out.close();
      }
   }

   public static Foo unmarshal(InputStream in) throws IOException {

      try {
         JAXBContext jc = JAXBContext.newInstance(Foo.class);
         Unmarshaller unmarshaller = jc.createUnmarshaller();

         return (Foo)unmarshaller.unmarshal(in);
      }
      catch (JAXBException ex) {
         throw new IOException(ex);
      }
      finally {
         in.close();
      }
   }
}

假设您持久化了一个mBar为42的Foo实例,那么该解决方案将生成以下XML文件:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Foo>
   <Bar>42</Bar>
</Foo>

1
DataNucleus将所有的编组和解组操作都隐藏在用户背后,用户只需要在想要持久化的类上添加JDO或JPA注释即可。代码更少,处理的事情也更少。 - DataNucleus

2
DataNucleus是最简单的方法,因为它提供了JDO和JPA API,可以将持久化存储到几乎任何你想要的数据存储中。当DataNucleus为你完成所有这些JAXB代码时,为什么要在其他答案中编写它们呢?所有这些都支持Java标准,并且是开源的。”
“声明:本回答的作者与DataNucleus项目有关联。”

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