2009-12-23 63 views
7

现在我有java程序,它的类当前是POJO并存储在易失性存储器中。这些需要坚持。据我所知,两种流行的选择是JDO和Java持久性API。对于对SQL,Torque等知之甚少的人来说,这是将持久性添加到我的程序数据中的最简单方法?坚持java对象最简单的方法是什么?

+3

对于所有(非)神圣的东西,尽可能远离扭矩。 – ChssPly76 2009-12-23 21:28:36

回答

7

序列化到文件系统的传统方式是使用Java Serialisation。但是,您需要随处实施Serializable

更简单的解决方案是使用XStream将XML序列化(然后转储到文件系统)。你不需要实现任何接口,并且大部分东西都是串行化和反序列化的,无需进一步干预。如果需要,您可以进一步自定义序列化。我曾经有过唯一的问题是序列化的一个内部类没有故意连载含有外部类(这是由于隐this参考)

6

如果您不知道SQL或关系数据库,则将对象序列化到文件系统。

您必须学习JDBC以使用JDO,JPA,Hibernate或其他任何东西。除非你的POJO非常复杂,否则我会建议从那里开始并继续努力。

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

+0

要使用JDO,JPA或Hibernate,您显然不需要知道JDBC,因为这是这些API的要点。他们在坚持使用RDBMS时使用JDBC,这样复杂性就隐藏起来了 – DataNucleus 2009-12-25 19:07:43

+3

我不同意 - 不建议在不知道JDBC的情况下使用它们。复杂性是隐藏的,但它是一个抽象的漏洞。 – duffymo 2009-12-25 20:26:39

+1

不是JDO的泄漏抽象,尽管JPA和Hibernate肯定与JDBC紧密相关。取决于提问者决定去哪个API – DataNucleus 2009-12-26 09:20:16

2

听起来像你可能想坚持一个数据库。但是,为了避免DB的复杂性,将POJO持久化到文件系统的一个简单解决方案是将它们序列化为XML文档。 Java 1.6 API包含javax.xml.bind包中的JAXB框架。要使用JAXB你基本上是注释你的POJO和创建编组和取消编组方法,像这样:

@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(); 
     } 
    } 
} 

比方说你坚持美孚的一个实例,其中毫巴是42,那么这个解决会产生像这样的XML文件:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<Foo> 
    <Bar>42</Bar> 
</Foo> 
+1

DataNucleus隐藏了用户的所有编组和解组,并且他们只是将JDO或JPA注释添加到他们想要保留的类中。代码较少。较少处理 – DataNucleus 2009-12-25 19:08:22

5

我的印象是又来到了最简单的方法是db4o

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

另外还有其他方式的非常好的方法来查询。

+0

不幸的是:2014年10月,Actian拒绝继续积极追求和推广针对新客户的商用db4o产品。 http://supportservices.actian.com/versant/default.html – Jonathan 2017-04-20 07:31:56

5

如果序列化是一个选项,请考虑使用流行API,如prevalayerSpace4J(更新)。关于对象患病率:

患病率是由克劳斯Wuestefeld如何将数据存储在一个真正的面向对象的方式,只用内存快照,事务日志和系列化开始的概念。

请检查this article以了解有关此主题的更多信息(Google上的更多内容)。

+3

Space4j还提供透明的群集和索引。 – TraderJoeChicago 2011-09-13 02:00:28

2

DataNucleus是最简单的方法,因为它提供了JDO和JPA API,用于持久化几乎任何您想要的数据存储类型。为什么在DataNucleus为你做的时候,为什么要在其他回复中写入所有JAXB代码呢?全部由Java标准支持

相关问题