# OSGi und JPA



## Gelöschtes Mitglied 5909 (11. Jan 2010)

Ich habe Services die mit Entities über interfaces arbeiten. Diese Services möchte ich in ein eigenes Bundle packen.
Die Entities (und noch ein bischen mehr) sollen in einem anderen Bundle liegen, 
damit ich später ggf. weitere Bundles mit weiteren Entities hinzufügen kann.

Dadurch gibt es aber ein Problem: ich brauche pro Bundle eine persistence.xml,
da ich ja die Entities eintragen muss. Dadurch habe ich dann ja verschiedene EntityManager.
Da meine Services den EntityManager brauchen, müsste ich Pro Bundle also von meinen
Services eine Instanz anlegen. Wenn ich jetzt eine Ebene drüber meine Services verwenden will,
brauche ich pro Bundle eine Service-Instanz und muss auchnoch wissen mit welcher Entity ich welchen Service verwende.
Da die Logik von den Services nicht unbedingt etwas Entity spezifisches machen (Die Entities implementieren Interface(s))
ist das natürlich äußerst unschön. 

Soweit ich weiß gib es keine Möglichkeit dem EntityManager z.B. beim laden eines Bundles zu sagen 
"hey hier ist noch ne Entity, Foo.class" oder sowas in der Art. 

Gibt es irgendwas, das ich übersehen habe?

Meine Idee wäre z.B. mit Jaxb die verschiedenen persistence.xmls zu mergen.
Hat aber auch viele Nachteile:

- ich muss das alles selber machen
- was mach ich bei unterschiedlichen DataSources?

Hat da jemand eine Idee? Am liebsten wär mir: da haste n Bundle mit noch n paar Entities und gut ist


----------



## Noctarius (11. Jan 2010)

Das Entity Bundle stellt nur die Klassen zur Verfügung. Die persistence.xml braucht nur das Bundle welches später die Entity Klassen nutzen soll.


----------



## Gelöschtes Mitglied 5909 (11. Jan 2010)

Dann muss ich dort aber genau die eingetragen haben die deployed sind. 
Das ist nicht gerade OSGi-isch würde ich behaupten.

Vielleicht ist des kleine Bildchen Hilfreich:







DAOs machen nur dumm CRUD. Die High Level API macht mehr (sind diese Services) und kann ggf auch den EntityManager verwenden (rechts). Wenn ich jetzt ein Bundle mit DAO und Entity Deploye sollte im Idealfall z.b. der Rechte Service ohne weiteres Funktionieren.

Bei deinem Vorgehen müsste ich in Logik 1-n immer alle Entities in der Persistence.xml eingetragen haben.
Verstehst du das Problem? Die Daos haben noch Factories und die Services auch. Bei den Daos ist das kein Problem, wenn die persistence.xml im Entity Bundle ist, aber dann bei den Services.
Und in den Logik Bundles wollte ich nur ungern mit EntityManagern rumhantieren.


----------



## Noctarius (11. Jan 2010)

Irgendwie ist mir ein Schaubild grad nicht ganz klar. Wieso hast du 3 High Level DB Api Bundles?

Dynamic-JPA Overview <- Vielleicht ist das was du suchst


----------



## Gelöschtes Mitglied 5909 (11. Jan 2010)

Weil ich ggf. mehrere Allgemeine und und mehrere Spezielle APIs habe und außerdem trennen möchte.

Kleines Beispiel (hat aber mit meiner Anwendung garnix zu tun)

Ich habe Produkte: Bucher, DVDs, Musik, Hifi-Kram und so weiter.

Jetzt habe ich einen Dienst der Die Sachen verkauft.

Später kommt ein Dienst dazu der manche davon ausleihen kann. 

Dann kommt einer dazu der sie versteigert usw.

Hat wie gesagt mit meinem Anwendungsszenario nix zu tun, aber alles in ein Bundle zu stecken wäre nicht gut.
Der Link mit Dynamic JPA sieht gut aus, werde ich mir mal anschauen. Kannte ich noch nicht und macht anscheinend das was ich selber machen wollte.


----------



## Noctarius (11. Jan 2010)

Ich würde eine DB API machen und die anderen Services darauf aufbauen lassen


----------



## Gelöschtes Mitglied 5909 (13. Jan 2010)

Das ist ja echt ein scheiß. Mit dynamic-jpa gibts Classloaderprobleme, und ein Forum oder sonstiges gibts dazu nicht.
Läuft wohl darauf raus dass ich mir den EntityManager für Die jeweiligen Entities holen muss.
Damit ich nicht Pro Klasse sondern Pro Bundle einen EntityManager erzeugen muss,
kann ich das abhängig vom ClassLoader machen. 

Wundert mich dass man bei Onkel google dazu so wenig findet...


----------



## Noctarius (13. Jan 2010)

Wieso gibt es da Classloaderprobleme? Was hast du denn ex- bzw. importiert?


----------



## Gelöschtes Mitglied 5909 (13. Jan 2010)

Das liegt nicht dadran was ich ex oder importiert habe, sondern anscheinend daran,
dass der PersistenceProvider - ClassLoader mit den Bundles und den Libs nicht klar kommt.
Obwohl das Projekt ja auch deshalb gemacht wurde.


----------



## Noctarius (13. Jan 2010)

Ich hab mir ein extra Vendor Bundle gemacht welches entsprechend einen Service exportiert


----------



## Gelöschtes Mitglied 5909 (13. Jan 2010)

Meinst du damit den Oracle Driver und so? das hab ich auch


----------



## Gelöschtes Mitglied 5909 (14. Jan 2010)

Habs mit ClassLoader Variante gemacht


----------

