# Java Objekte in einer Datenbank speichern



## funlow (7. Jun 2016)

Hallo,

meine Frage ist kann man Objekte in einer Datenbank speichern ?

Es geht hier um das mal ein bisschen näher auszuführen um eine Spielkarte für ein Spiel die in einer Datenbank gespeichert werden soll. Man kann das zwar auch in einer java Klasse speichern, aber da Nutzer selber noch Karten erstellen sollen finde ich es Sinnvoller in einer Datenbank zu speichern in Form eines String Int o.ä. . Da diese Karte mit einem Objekt dargestellt wird ist es möglich, ein solches Objekt in der Datenbank ohne selber dafür die Codierung umständlich selber festzulegen, zu speichern und auch wieder wenn man die Karte laden möchte ein Objekt aus dem in der Datenbank gespeichertem String Int Wert zu erzeugen?

Habe irgendwie gelesen, das es mit Serializable mit einem Input und Output Stream möglich sein soll aber steig so noch nicht ganz durch

Vielen dank schon einmal für die Hilfe


----------



## Viktim (8. Jun 2016)

du kannst dir ja eine ID (vilt bietet sich hier der wert der Karte an) für jedes Bild überlegen (bsp: Ass = 1, Zwei = 2, Drei = 3 usw.) und in eine Tabelle Speichern.
In eine Andere Tabelle Speicherst du dann die Farben (auch nummeriert).

Und in der Tabelle Spielkarte stehen dann so sachen wie:

ID | Bezeichnung | BILD_ID | FARBE_ID
1  | Herz Ass        | 1            | 1
2  | Herz Zwei       | 2            | 1
3  | Herz Drei        | 3            | 1

Ist so zwar kein Objekt aber Bevor du gar keine Antwort kriegst, sag ich dir lieber was womit du vieleicht etwas anfangen kannst


----------



## JStein52 (8. Jun 2016)

Das geht so sicher aber dann hast du genau das was du nicht wolltest: du musst die Codierung zum sichern und laden selber schreiben. Aber schau dir mal JPA (Java Persitency API) an. das ist eigentlich das was du willst.


----------



## funlow (8. Jun 2016)

Viktim dein Ansatz würde im Grunde gehen aber das ist genau das was ich vermeiden will da die Spielkarte( Es gibt hier um ein Spielbrett nicht um karten) aus Feldern besteht die eine Menge Eigenschaften haben, woraus sich für deine Lösung eine riesige Menge an Möglichkeiten ergeben die man abdecken muss.

Ich hab das ganze Jetzt sogar hinbekommen und über einen Byte.ArrayOutputStream realisiert sodass aus dem Objekt ein ByteArray erzeugt wird, das ich dann entweder mit den einzelnen Bytes die im Array liegen in der Datenbank speichern kann oder vielleicht auch das Array an sich ( Bin mir noch nicht sicher ob man das Array in der Datenbank speichern kann) Aus dem ByteArray kann man dann wieder über einen InputStream das Objekt mit dem ByteArray wiederherstellen.

```
package test;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.ByteArrayInputStream;
import java.io.ObjectInputStream;
import java.io.Serializable;

public class Test {

    /**
     * @param args the command line arguments
     * Hendrik
     */
    public static void main(String[] args) throws IOException, ClassNotFoundException {
     
      Human test = new Human(27,"Sven","Deutschland");
      ObjectOutputStream output;
      ObjectInputStream input;
  
      ByteArrayOutputStream os = new ByteArrayOutputStream(256);
      output = new ObjectOutputStream(os);
      output.writeObject(test);
      output.flush();
      byte[] testArray1 = new byte[256];
      testArray1 = os.toByteArray();
      byte[] testArray = new byte[256];
      for(int i = 0; i<testArray1.length;i++){

          System.out.println(testArray1[i]);
          testArray[i] = testArray1[i];
      }

      System.out.println(testArray);
      output.close();
     
// InputStream
      input = new ObjectInputStream(new ByteArrayInputStream(testArray));
      Human in = (Human) input.readObject();
      System.out.println("Alter:" + in.Age +"Name:" + in.Name + "Land:" + in.Country);
     
       
    }
   
}

class Human implements Serializable{
   private static final long serialVersionUID = 1125135436L;
   int Age;
   String Name;
   String Country;
  
  public Human(int Age, String Name, String Country){
      this.Age=Age;
      this.Name=Name;
      this.Country=Country;
  }
}
```

Das ist jetzt das was ich habe das funktioniert auch so nur bin ich mir auch nicht wirklich sicher welche größe das ByteArray in diesem fall haben muss, ob das jetzt von der Komplexität der Klasse abhängig ist oder ob das sogar egal ist


----------



## JStein52 (8. Jun 2016)

funlow hat gesagt.:


> das ich dann entweder mit den einzelnen Bytes die im Array liegen in der Datenbank speichern kann oder vielleicht auch das Array an sich ( Bin mir noch nicht sicher ob man das Array in der Datenbank speichern kann)


Das klingt ein bisschen verworren. Du könntest natürlich so ein ByteArray als BLOB in der Datenbank speichern aber was hast du dann davon ? Wenn du deine Objekte nur speichern willst um sie z.B. beim nächsten Programmaufruf wieder zur Verfügung zu haben ist das was du jetzt gemacht hast der richtige Weg.


----------

