2009-12-23 21 views
7

Ahora tengo un programa de Java cuyas clases son actualmente POJOs y se almacenan en memoria volátil. Estos deben persistir. Según entiendo, dos opciones populares son JDO y Java Persistence API. Para alguien que sabe poco sobre SQL, Torque, etc., ¿cuál es la forma más fácil de agregar persistencia a los datos de mi programa?¿Cuál es la forma más fácil de persistir en los objetos java?

+3

Para todo lo que es (no) sagrado, mantente lo más lejos posible de Torque. – ChssPly76

Respuesta

7

La forma tradicional de serializar al sistema de archivos es usar Java Serialisation. Sin embargo, debe implementar Serializable en todas partes.

Una solución más simple es serializar a XML (y luego volcar al sistema de archivos) usando XStream. No necesita implementar ninguna interfaz, y la mayoría de las cosas se serializan y deserializan sin más intervención. Puede personalizar aún más la serialización si es necesario. El único problema que he tenido es serialising una clase interna sin serialising intencionalmente la clase externa que contiene (esto es debido a la implícita referencia this)

6

Serialice los objetos al sistema de archivos si no conoce SQL o bases de datos relacionales.

Deberá aprender JDBC para usar JDO, JPA, Hibernate o cualquier otra cosa. A menos que tus POJO sean terriblemente complejos, te recomiendo que comiences allí y sigas subiendo.

Asegúrese de conocer la normalización y el diseño adecuado de los índices.

+0

Para usar JDO, JPA o Hibernate, claramente no necesita conocer JDBC ya que ese es el punto de esas API.Utilizan JDBC bajo las cubiertas cuando persisten en RDBMS, por lo que la complejidad está oculta para usted – DataNucleus

+3

No estoy de acuerdo, no es aconsejable usarlos sin conocer JDBC. La complejidad está oculta, pero es una abstracción permeable. – duffymo

+1

No es una abstracción que gotea con JDO, aunque ciertamente JPA e Hibernate están estrechamente vinculados a JDBC. Depende de qué API el encuestador decida ir – DataNucleus

2

Parece que es posible que desee continuar en una base de datos. Sin embargo, para evitar las complejidades de un DB, una solución simple para persistentes POJOs al sistema de archivos es serializarlos en un documento XML. La API de Java 1.6 incluye el marco JAXB que se encuentra en el paquete javax.xml.bind. Para utilizar JAXB que Anotación esencialmente su POJO y crear métodos marshal y unmarshal así:

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

Digamos que usted persiste una instancia de Foo donde mbar es de 42 a continuación, esta solución podría producir un archivo XML de este modo:

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

DataNucleus oculta todo el marshalling y unmarshalling del usuario y simplemente agrega anotaciones JDO o JPA a las clases que desean persistir. Menos código. Menos para manejar – DataNucleus

5

La forma más sencilla que encontré hasta ahora es db4o:

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

Además, hay maneras realmente agradables de consultar de otras maneras.

+0

Tristemente: en octubre de 2014, Actian se negó a continuar buscando y promocionando activamente la oferta de productos comerciales db4o para nuevos clientes. http://supportservices.actian.com/versant/default.html – Jonathan

5

Si la serialización es una opción, considere usar una API de prevalencia como prevalayer o Space4J (más reciente). Acerca de la prevalencia de objetos:

La prevalencia es un concepto iniciado por Klaus Wuestefeld sobre cómo almacenar datos de una manera orientada a objetos reales, utilizando solo instantáneas de memoria, registros de transacciones y serialización.

Consulte this article para obtener más información sobre este tema (más en Google).

+3

Space4j también ofrece clústeres e indexaciones transparentes. – TraderJoeChicago

2

DataNucleus es la forma más fácil, ya que proporciona las API JDO y JPA para la persistencia en prácticamente cualquier tipo de almacén de datos que siempre desee. ¿Por qué escribir todo ese código JAXB en una de las otras respuestas cuando DataNucleus lo hace por usted? Todo respaldado por los estándares de Java

Cuestiones relacionadas