G
Gelöschtes Mitglied 5909
Gast
Hallo Zusammen,
mal wieder eine kleine Frage zu JPA (EclipseLink 2.0).
Ich habe mir eine eigene kleine EntityManagerFactory gebaut, welche verschiedene "Standardproperties" für die PersistenceUnits setzt. Prinzipiell würde es auch ohne gehn, aber dann kommt da noch OSGi ins Spiel. Denn in der Factory verwende ich den
OSGi Persistenceprovider, anders habe ich es nicht hingekriegt. (Man muss den Classloader bzw die Klasse mitgeben)
JPA-PersistenceUnits in die Manifest eintragen und dann normal Persistence.createEntityManagerFactory ging nicht. Auf der EclipseLink seite gibt es lustigerweise zwei Beispiele, eins mit dem OSGi Persistenceprovider und eins mit der Manifest. Aber es hat soweit funktioniert.
Jetzt habe ich immer wieder festgestellt, dass bei Änderungen auf der Datenbank (händisch) EclipseLink dies nicht mitkriegt.
Erste Lösung: EclipseLink Cache komplett abschalten. Gesagt getan und es schien auch alles zu klappen. Aber irgendwie dann doch nicht immer. Denn es hat die Änderungen zum Teil doch nicht mitgekriegt. Wenn ich ein EntityManager#clear reinpacke, dann funktionierts, aber das kann doch eigentlich nicht sein.
Dann hab ich heut mal weiter geforscht und anscheinend liegt es daran, dass ich die JPA EntityManagers Cache (in meiner eigenen EMF).
Die Methode von oben schaut zuerst nach, ob ein EntityManager für diese PersistenceUnit existiert.
Wenn nicht wird einer über den Mechanismus den ich oben beschrieben habe erzeugt und dann
in ne statische Map<String, EntityManager> gesteckt.
D.h. pro OSGi Domain Bundle (entspricht einer PersistenceUnit) existiert genau ein EntityManager. Ich dachte auch das ist gut, da ich ansonsten unnötig viele Connections offen habe. Außerdem kapsel ich die JPA EntityManagerFactory quasi durch meine Eigene weg, da ich ja sonst jedesmal den PersistenceProvider Code und so habe. Die eigene EntityManagerFactory verwende ich beim erzeugen der DAOs. Soweit funktioniert der Code, wenn ich jedesmal in den DAOs ein #clear aufrufe, dann krieg ich auch die richtigen Ergebnisse. Die PKs stimmen mit denen aus der DB überein und equals und hashcode sind auch überschrieben.
Jetzt habe ich zum "Spaß" mal statt die EntityManagers die original JPA EMFs in meiner eigenen EMF gecachet. Und dann rufe ich jedesmal createEntityManager auf. Dann tauch das oben beschriebene Problem komischerweise nicht auf?!?!?!?
Das hat mich ehrlichgesagt sehr verwirrt. Vorher hatte jedes DAO der gleichen PersistenceUnit den gleichen EntityManager.
Jetzt hat jedes DAO seinen eigenen EM. Und es scheint so zu funktionieren.
Wenn ich aber bedenke, dass ich Entity X lade, dann auf der DB was ändere und dann Entity X nochmal lade, die Entity sich aber nicht verändert und jetzt mit eigenem EM funktioniert es - warum? Vorher wurde auch beides mit ein und dem selben EM geladen.
Aber viel wichtiger: Egal warum - wie macht man es richtig? Jedes mal einen neuen EntityManager erzeugen - ja / nein?
Verwende ich den gleichen EntityManager in allen CRUD/finder Methoden im DAO (halte ich mir eine Referenz auf den EM)? Erzeuge ich in jeder DAO Methode einen neuen EntityManager? Ist das erzeugen teuer? Das erzeugen der EntityManagerFactory wird wohl das teure sein...
Spring DM darf ich leider nicht nutzen...
mal wieder eine kleine Frage zu JPA (EclipseLink 2.0).
Ich habe mir eine eigene kleine EntityManagerFactory gebaut, welche verschiedene "Standardproperties" für die PersistenceUnits setzt. Prinzipiell würde es auch ohne gehn, aber dann kommt da noch OSGi ins Spiel. Denn in der Factory verwende ich den
OSGi Persistenceprovider, anders habe ich es nicht hingekriegt. (Man muss den Classloader bzw die Klasse mitgeben)
Java:
public synchronized EntityManager getEntityManager(Class<?> clazz, String persistenceUnit) {
//...
}
JPA-PersistenceUnits in die Manifest eintragen und dann normal Persistence.createEntityManagerFactory ging nicht. Auf der EclipseLink seite gibt es lustigerweise zwei Beispiele, eins mit dem OSGi Persistenceprovider und eins mit der Manifest. Aber es hat soweit funktioniert.
Jetzt habe ich immer wieder festgestellt, dass bei Änderungen auf der Datenbank (händisch) EclipseLink dies nicht mitkriegt.
Erste Lösung: EclipseLink Cache komplett abschalten. Gesagt getan und es schien auch alles zu klappen. Aber irgendwie dann doch nicht immer. Denn es hat die Änderungen zum Teil doch nicht mitgekriegt. Wenn ich ein EntityManager#clear reinpacke, dann funktionierts, aber das kann doch eigentlich nicht sein.
Dann hab ich heut mal weiter geforscht und anscheinend liegt es daran, dass ich die JPA EntityManagers Cache (in meiner eigenen EMF).
Die Methode von oben schaut zuerst nach, ob ein EntityManager für diese PersistenceUnit existiert.
Wenn nicht wird einer über den Mechanismus den ich oben beschrieben habe erzeugt und dann
in ne statische Map<String, EntityManager> gesteckt.
D.h. pro OSGi Domain Bundle (entspricht einer PersistenceUnit) existiert genau ein EntityManager. Ich dachte auch das ist gut, da ich ansonsten unnötig viele Connections offen habe. Außerdem kapsel ich die JPA EntityManagerFactory quasi durch meine Eigene weg, da ich ja sonst jedesmal den PersistenceProvider Code und so habe. Die eigene EntityManagerFactory verwende ich beim erzeugen der DAOs. Soweit funktioniert der Code, wenn ich jedesmal in den DAOs ein #clear aufrufe, dann krieg ich auch die richtigen Ergebnisse. Die PKs stimmen mit denen aus der DB überein und equals und hashcode sind auch überschrieben.
Jetzt habe ich zum "Spaß" mal statt die EntityManagers die original JPA EMFs in meiner eigenen EMF gecachet. Und dann rufe ich jedesmal createEntityManager auf. Dann tauch das oben beschriebene Problem komischerweise nicht auf?!?!?!?
Das hat mich ehrlichgesagt sehr verwirrt. Vorher hatte jedes DAO der gleichen PersistenceUnit den gleichen EntityManager.
Jetzt hat jedes DAO seinen eigenen EM. Und es scheint so zu funktionieren.
Wenn ich aber bedenke, dass ich Entity X lade, dann auf der DB was ändere und dann Entity X nochmal lade, die Entity sich aber nicht verändert und jetzt mit eigenem EM funktioniert es - warum? Vorher wurde auch beides mit ein und dem selben EM geladen.
Aber viel wichtiger: Egal warum - wie macht man es richtig? Jedes mal einen neuen EntityManager erzeugen - ja / nein?
Verwende ich den gleichen EntityManager in allen CRUD/finder Methoden im DAO (halte ich mir eine Referenz auf den EM)? Erzeuge ich in jeder DAO Methode einen neuen EntityManager? Ist das erzeugen teuer? Das erzeugen der EntityManagerFactory wird wohl das teure sein...
Spring DM darf ich leider nicht nutzen...