2009-12-23 33 views
7

In questo momento ho un programma java le cui classi sono attualmente POJO e memorizzate nella memoria volatile. Questi devono essere persistenti. A quanto ho capito, due scelte popolari sono JDO e Java Persistence API. Per qualcuno che sa poco di SQL, Torque, ecc. Qual è il modo più semplice per aggiungere persistenza ai dati del mio programma?Qual è il modo più semplice per mantenere oggetti java?

+3

Per tutto ciò che è (dis) santo, resta il più lontano possibile da Torque. – ChssPly76

risposta

7

Il modo tradizionale di serializzare sul filesystem è utilizzare Java Serialisation. Tuttavia è necessario implementare Serializable ovunque.

Una soluzione più semplice consiste nel serializzare in XML (e quindi eseguire il dump nel file system) utilizzando XStream. Non è necessario implementare alcuna interfaccia e la maggior parte di tutte le serializzazioni e deserializzazioni senza ulteriori interventi. È possibile personalizzare ulteriormente la serializzazione, se necessario. L'unico problema che abbia mai avuto è serializzazione di una classe interna, senza serializzazione intenzionalmente la classe esterna che contiene (questo è dovuto al implicita this riferimento)

6

Serializzare gli oggetti nel file system se non si conoscono database SQL o relazionali.

Dovrai imparare JDBC per usare JDO, JPA, Hibernate o qualsiasi altra cosa. A meno che i tuoi POJO non siano complessi, ti consiglio di iniziare da lì e di iniziare a lavorare.

Assicurati di conoscere la normalizzazione e la corretta progettazione degli indici.

+0

Per utilizzare JDO, JPA o Hibernate, non è necessario conoscere JDBC poiché questo è il punto di tali API.Usano JDBC sotto le copertine quando persistono in RDBMS, in modo che la complessità sia nascosta da te – DataNucleus

+3

Non sono d'accordo - non è consigliabile usarli senza conoscere JDBC. La complessità è nascosta, ma è un'astrazione che perde. – duffymo

+1

Non un'astrazione che perde con JDO, anche se certamente JPA e Hibernate sono fortemente legati a JDBC. Dipende da quale API l'interrogante decide di andare – DataNucleus

2

Sembra che si desideri mantenere un DB. Tuttavia, per evitare le complessità di un DB una soluzione semplice per persistere POJO al file system è serializzarli su un documento XML. L'API Java 1.6 include il framework JAXB trovato nel pacchetto javax.xml.bind. Per utilizzare JAXB si essenzialmente annotazione tuo POJO e creare maresciallo e unmarshalling metodi in questo modo:

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

Diciamo che persistono un'istanza di Foo dove mBar è 42, allora questa soluzione produrrebbe un file XML in questo modo:

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

DataNucleus nasconde l'intero marshalling e unmarshalling all'utente e aggiunge semplicemente annotazioni JDO o JPA alle classi che desidera mantenere. Meno codice Meno da gestire – DataNucleus

5

Il modo più semplice mi sono imbattuto finora è db4o:

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

In più ci sono modi davvero interessanti di interrogare in altri modi.

+0

Purtroppo: nell'ottobre 2014, Actian ha rifiutato di continuare a perseguire e promuovere attivamente l'offerta di prodotti commerciali db4o per i nuovi clienti. http://supportservices.actian.com/versant/default.html – Jonathan

5

Se la serializzazione è un'opzione, è consigliabile utilizzare un'API di prevalenza come prevalayer o Space4J (più recente). Informazioni sulla prevalenza degli oggetti:

Prevalence è un concetto iniziato da Klaus Wuestefeld su come memorizzare i dati in modo orientato agli oggetti reali, utilizzando solo snapshot di memoria, registri delle transazioni e serializzazione.

Controllare this article per ulteriori informazioni su questo argomento (ulteriori informazioni su Google).

+3

Space4j offre anche cluster e indicizzazione trasparenti. – TraderJoeChicago

2

DataNucleus è il modo più semplice in quanto fornisce le API JDO e JPA per la persistenza in quasi tutti i tipi di archivio dati che si vorrebbe. Perché scrivere tutto il codice JAXB in una delle altre risposte quando DataNucleus lo fa per te? Il tutto supportato dagli standard Java

Problemi correlati