# Hibernate: ArrayList in DB speichern und auslesen



## Donke5 (22. Dez 2010)

Hallo,

ich habe ein Projekt, bei dem ich eine ArrayList, die Attribut einer Klasse ist in der DB speichern und daraus wieder auslesen will.
Konkret geht es um Anträge, die als Attribut ihre Antragspositionen in der Arraylist haben.

Vorhin hat es schon einmal problemlos geklappt, komischerweise geht es aber seit mehreren Stunden nicht mehr. Habe jetzt rumprobiert bis zum erbrechen, aber ich komme einfach nicht drauf...

Hier mal eine kleine Testklasse mit der ich die Daten erzeuge, speichere und auslese:


```
public class testDatenAnlegen {
    
        public static void main (String args[]) {
           Antrag antrag1 = new Antrag();
            Antragsposition pos1 = new Antragsposition();
            Antragsposition pos2 = new Antragsposition();

            antrag1.setGewSemester(5);
            antrag1.setMatrNr(300580);
            antrag1.setNote(1.3);

            pos1.setAntragsIDID(2);
            pos1.setHsID(1);
            pos1.setPrioritaet(1);
            pos1.setPosID(1);
            pos1.setAuswahlgesprID(0);

            pos2.setAntragsIDID(2);
            pos2.setHsID(2);
            pos2.setPrioritaet(2); 
            pos2.setPosID(2);
            pos2.setAuswahlgesprID(0);

            antrag1.addAntragsposition(pos1);
            antrag1.addAntragsposition(pos2);

            antrag1.antragSpeichern(antrag1);


        ArrayList <Antrag> antragsListe = new ArrayList();
        Session session = InitSessionFactory.getInstance().getCurrentSession();
        Transaction tx = session.beginTransaction();
        Query query = session.createQuery("from Antrag");
        List<Antrag> list = query.list();
        java.util.Iterator<Antrag> iter = list.iterator();
        while (iter.hasNext()) {
            antragsListe.add(iter.next());
        }
        tx.commit();

        Antrag antragAusDB = antragsListe.get(0);
```
Hier noch ein Ausschnitt meiner Klasse Antrag:

```
@Entity
@SequenceGenerator(name = "antrag_seq", sequenceName = "antrag_id_seq")
public class Antrag implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int antragsID;
    private int matrNr;
    private int gewSemester;
    private double note;    
    private ArrayList <Antragsposition> antragspositionsListe = new ArrayList();
```

Sieht da jemand woran das liegt?

Nachtrag: Es kommt übrigens der korrekte Auftrag aus der DB zurück.
Nur ist die Arraylist im Attribut des Auftrags leer.


----------



## SlaterB (22. Dez 2010)

was geht denn nicht, was hat das mit einer ArrayList zu tun?
die main-Methode sieht so aus, als möchtest du einen Antrag in der DB speichern,
das macht schrecklicherweise das Objekt selber:
> antrag1.antragSpeichern(antrag1);

die zugehörige Methode postest du aber nicht, klappt das Speichern oder ist das das Problem?

danach lädst du ganz normal Antrag-Objekte aus der DB,
gibt es dort Probleme, werden keine Objekte geladen?

was du mit den geladenen Objekten ansonsten anstellst, ob du  sie in einer ArrayList speicherst oder per Netzwerk nach Tokio schickst,
das hat nun wirklich nichts mit der DB zu tun

edit:
> Nur ist die Arraylist im Attribut des Auftrags leer. 

ok, ist denn dieses Attribut gemappt, sofern du das beurteilen kannst?
steht irgendwo (Annotations, XML-Dateien) irgendeine Art Info an das Programm, wo diese Daten zu speichern sind?
ist Antragsposition gemappt?

funktionieren die anderen Attribute wie gewSemester?


----------



## Donke5 (22. Dez 2010)

Antragsposition ist nicht gemappt. Dafür aber der Antrag.
Ich dachte da die Positionen ja ein Teil des Antrags sind bräuchte ich dafür keine extra Entitätsklasse.
Die anderen Attribute wie gewSemester funktionieren auch.

Du sagst "schrecklicherweise speichert das Objekt selber". Vorher hatte ich eine Klasse mit Methoden, die für die Speicherung der Daten in der DB zuständig war. Ist das eine bessere Lösung?

Das Speichern des Antrags klappte bis gerade eben. Seit neuestem bekomme ich folgende Exception:


```
Exception in thread "main" org.hibernate.type.SerializationException: could not serialize
        at org.hibernate.util.SerializationHelper.serialize(SerializationHelper.java:158)
        at org.hibernate.util.SerializationHelper.serialize(SerializationHelper.java:178)
        at org.hibernate.type.SerializableType.toBytes(SerializableType.java:78)
        at org.hibernate.type.SerializableType.deepCopyNotNull(SerializableType.java:74)
        at org.hibernate.type.MutableType.deepCopy(MutableType.java:25)
        at org.hibernate.type.TypeFactory.deepCopy(TypeFactory.java:374)
        at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:280)
        at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:181)
        at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:107)
        at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:187)
        at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:172)
        at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:94)
        at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70)
        at org.hibernate.impl.SessionImpl.fireSaveOrUpdate(SessionImpl.java:507)
        at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:499)
        at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:495)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.hibernate.context.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:301)
        at $Proxy7.saveOrUpdate(Unknown Source)
        at fachklassen.Antrag.antragSpeichern(Antrag.java:179)
        at fachklassen.testDatenAnlegen.main(testDatenAnlegen.java:45)
Caused by: java.io.NotSerializableException: fachklassen.Antragsposition
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1156)
        at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:326)
        at java.util.ArrayList.writeObject(ArrayList.java:570)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:945)
        at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1461)
        at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1392)
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1150)
        at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:326)
        at org.hibernate.util.SerializationHelper.serialize(SerializationHelper.java:154)
        ... 23 more
Java Result: 1
```


----------



## SlaterB (22. Dez 2010)

das ist doch was, 
ich weiß nichi ob und wie Antragsposition von selber gespeichert wird (jedenfalls nicht bei Hibernate so wie ich es kenne), 
aber wenn du schon bei Antrag 'implements Serializable' hast, dann ist es ja keine Arbeit, das bei Antragsposition auch reinzuschreiben

und ja, ich wäre eher für getrennte Aufgaben, ein Objekt muss sich nicht unbedingt selber speichern,
aber das ist ein Neben-Schönheitsthema


----------



## ARadauer (22. Dez 2010)

> Vorher hatte ich eine Klasse mit Methoden, die für die Speicherung der Daten in der DB zuständig war. Ist das eine bessere Lösung?


ja DAO Pattern bzw Repository Pattern


----------

