# Datenbank zur Laufzeit wählen (JPA)



## Eddi11 (28. Jun 2011)

Hallo,

ich schreibe zur Zeit eine Desktopapplikation, die auf eine Datenbank zugreift.
Mich würde interessieren, ob es möglich ist JPA zu benutzen aber die Datenbankverbindung erst zur Laufzeit des Programms festzulegen und nicht hart in die persistence.xml zu schreiben.
Diese Methode finde ich nicht sehr gut, da man das Programm dann ja leider nur mit diesem einen Server benutzen kann.

Ich hoffe das mein vorhaben möglich ist und das jemand weiß, wie ich das umsetzen kann.
Habe leider bisher nichts brauchbares gefunden.

Gruß
Eddi


----------



## Gelöschtes Mitglied 5909 (28. Jun 2011)

Schau mal hier:

PersistenceUnitProperties (EclipseLink 2.3.0, build 'v20110604-r9504' API Reference)

Damit kannst du quasi Programmatisch das ganze konfigurieren


----------



## Eddi11 (1. Jul 2011)

Ja genau sowas habe ich gesucht. Danke sehr.
Allerdings habe ich noch eine Frage dazu:

Da steht ja das die Werte in der "persistence.xml" überschrieben werden.
In meinem MainFrame habe ich die Zeile entsprechend abgeändert, dass die Werte aus den Map benutzt werden. Das funktioniert auch soweit.

Wenn ich jetzt ein zweites Fenster erstelle mit NetBeans, wird die folgende Zeile automatisch generiert.

```
Persistence.createEntityManagerFactory("persistenceUnit").createEntityManager();
```

Muss ich die PropertyMap jetzt an jedes Fenster übergeben, oder reicht es, wenn ich dies einmal im MainFrame mache? Weil angeblich wird die persistence.xml ja überschrieben 

Gruß
Eddi


----------



## JanHH (3. Jul 2011)

Irgendwie macht deine Frage nicht viel Sinn, bzw. es geht wohl eher um die Struktur der Applikation. Die codezeile da ist auch unsinnig, denn Du willst doch wohl kaum bei jedem Mal, wo Du einen entityManager brauchst, auch die entityManagerFactory neu erzeugen!?

Und auch wenn man mehrere Fenster hat.. es handelt sich ja immer noch um die Fenster ein und derselben Anwendung.

Normalerweise hat man innerhalb der Anwendung eine entityManagerFactory, die zu Beginn erzeugt wird, auf die man dann zugreift, wenn man einen entityManager braucht. Ich wüsste jetzt auch nicht, was daran schwierig zu realisieren sein sollte.


----------



## Soahc (16. Jul 2011)

Ist es möglich die Properties der PersistenceUnit aus der persistence.xml zur Laufzeit zu verändern?


----------



## Noctarius (16. Jul 2011)

Naja man könnte sie selber einlesen, die Werte ändern und dann damit den EntityManager holen. Direkt verändern ist glaub ich nachträglich nicht mehr möglich (ohne Trickkiste wie Reflection).


----------



## JohannisderKaeufer (16. Jul 2011)

Was mir zu dem Thema grundsätzlich einfällt ist:

JNDI

Sofern JNDI zur Verfügung steht, kann man in der persistence.xml auf eine Datasource verweisen, die per JNDI zur Verfügung gestellt werden muß. 
Dort kann man die jeweilige DB, samt Treiber-Gedöhns zumindest vor dem Start der Anwendung zur Verfügung stellen lassen.


----------



## Eddi11 (23. Jul 2011)

JanHH hat gesagt.:


> Irgendwie macht deine Frage nicht viel Sinn, bzw. es geht wohl eher um die Struktur der Applikation. Die codezeile da ist auch unsinnig, denn Du willst doch wohl kaum bei jedem Mal, wo Du einen entityManager brauchst, auch die entityManagerFactory neu erzeugen!?
> 
> Und auch wenn man mehrere Fenster hat.. es handelt sich ja immer noch um die Fenster ein und derselben Anwendung.
> 
> Normalerweise hat man innerhalb der Anwendung eine entityManagerFactory, die zu Beginn erzeugt wird, auf die man dann zugreift, wenn man einen entityManager braucht. Ich wüsste jetzt auch nicht, was daran schwierig zu realisieren sein sollte.



Am liebsten würde ich natürlich auf den EntityManager zugreifen den ich im Hauptfenster angelegt habe.
Ich benutze NetBeans um mir die GUI zu erzeugen. Wenn ich z.B. auf eine Tabelle Rechtsklick -> Bind -> elements mache, kann ich mir die Tabelle ja aus der Datenbank füllen lassen.
Mit der Methode erzeugt er allerdings auch die entityManagerFactory neu.
Ich habe keine Möglichkeit gefunden meinen übergebenen zu benutzen, weil wenn ich den erzeugten lösche dann wird auch die Query zum füllen der Tabelle auf 'null' gesetzt :Bahnhof:

Hat vielleicht jemand eine Idee wie das am einfachsten gehen kann?
Ansonsten muss ich die Tabelle wohl manuell füllen


----------



## Gelöschtes Mitglied 5909 (25. Jul 2011)

Was hat das mit einem Hauptfenster, der GUI generell oder Netbeans zu tun? Nutzt du irgendwelche Wizards um den kram machen zu wollen?
Das wird über die Wizards sicherlich nicht gehn, denn das was du da machen willst ist nicht gerade ein Standardfall


----------

