2009-12-23 7 views
7

Im Moment habe ich Java-Programm, deren Klassen sind derzeit POJOs und in flüchtigen Speicher gespeichert. Diese müssen beibehalten werden. Wie ich es verstehe, sind zwei beliebte Optionen JDO und Java Persistence API. Für jemanden, der wenig über SQL, Torque usw. weiß, was die einfachste Möglichkeit ist, den Programmdaten Persistenz hinzuzufügen?Was ist der einfachste Weg, um Java-Objekte zu erhalten?

+3

Für alles, was (un) heilig ist, bleiben Sie so weit wie möglich von Torque entfernt. – ChssPly76

Antwort

7

Die herkömmliche Methode zur Serialisierung in das Dateisystem besteht in der Verwendung von Java Serialisation. Sie müssen jedoch Serializable überall implementieren.

Eine einfachere Lösung besteht darin, mit XStream in XML zu serialisieren (und dann im Dateisystem abzulegen). Sie müssen keine Schnittstellen implementieren, und die meisten serialisieren und deserialisieren ohne weitere Eingriffe. Sie können die Serialisierung bei Bedarf weiter anpassen. Das einzige Problem, das ich je hatte eine innere Klasse Serialisierung ohne absichtlich enthalten äußeren Klasse Serialisierung (dies ist aufgrund der impliziten this Referenz)

6

Serialisieren Sie die Objekte im Dateisystem, wenn Sie SQL oder relationale Datenbanken nicht kennen.

Sie müssen JDBC lernen, JDO, JPA, Hibernate oder irgendetwas anderes zu verwenden. Wenn Ihre POJOs nicht schrecklich komplex sind, würde ich Ihnen empfehlen, dort anzufangen und sich hochzuarbeiten.

Stellen Sie sicher, dass Sie etwas über die Normalisierung und das korrekte Design von Indizes erfahren.

+0

Um JDO, JPA oder Hibernate zu verwenden, müssen Sie JDBC natürlich nicht kennen, da dies der Punkt dieser APIs ist.Sie verwenden JDBC unter den Abdeckungen, wenn sie auf RDBMS bestehen, so dass die Komplexität vor Ihnen verborgen ist. – DataNucleus

+3

Ich stimme nicht zu - es ist nicht ratsam, sie zu verwenden, ohne JDBC zu kennen. Die Komplexität ist verborgen, aber es ist eine undichte Abstraktion. – duffymo

+1

Keine durchlässige Abstraktion mit JDO, obwohl JPA und Hibernate sicherlich stark an JDBC gebunden sind. Hängt davon ab, welche API der Fragesteller wählt – DataNucleus

2

Klingt, als ob Sie in einer DB persistieren möchten. Um jedoch die Komplexität einer Datenbank zu vermeiden, besteht eine einfache Lösung für die Speicherung von POJOs im Dateisystem darin, sie in ein XML-Dokument zu serialisieren. Die Java 1.6-API enthält das JAXB-Framework, das im javax.xml.bind-Paket enthalten ist. Um JAXB verwenden Sie im Wesentlichen Annotation Ihre POJO und erstellen Methoden Marschall und Abstellungs wie so:

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

sagen Hier können Sie eine Instanz von Foo bestehen bleiben, wo mBar 42 dann würde diese Lösung eine XML-Datei erzeugen in etwa so:

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

DataNucleus verbirgt das gesamte Marshalling und das Unmarshalling vom Benutzer und fügt einfach JDO- oder JPA-Anmerkungen zu den Klassen hinzu, die persistent sein sollen. Weniger Code Weniger zu handhaben – DataNucleus

5

Der einfachste Weg, ich auf noch gekommen ist db4o:

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

Außerdem gibt es wirklich schöne Möglichkeiten, auf andere Weise zu fragen.

+0

Leider: Im Oktober 2014 lehnte Actian es ab, das kommerzielle db4o-Produktangebot für neue Kunden weiter aktiv zu verfolgen und zu fördern. http://supportservices.actian.com/versant/default.html – Jonathan

5

Wenn die Serialisierung eine Option ist, sollten Sie eine Prävalenz-API wie prevalayer oder Space4J (aktueller) verwenden. Über Objekt Prävalenz:

Prävalenz ist ein Konzept, begann Klaus Wuestefeld wie die Daten zu speichern, in einem realen Objekt orientiert, nur Speicherabbildern verwenden, Transaktionsprotokolle und Serialisierung.

Überprüfen Sie this article, um mehr zu diesem Thema zu erfahren (mehr auf Google).

+3

Space4j bietet auch transparente Cluster und Indexierung. – TraderJoeChicago

2

DataNucleus ist der einfachste Weg, da es JDO- und JPA-APIs für die Persistenz zu so ziemlich jeder Art von Datenspeicher bereitstellt, die Sie jemals wollen. Warum schreiben Sie den gesamten JAXB-Code in eine der anderen Antworten, wenn DataNucleus dies für Sie tut? Alle von Java-Standards unterstützt