OSGi + Ruhezustand

8

Anstatt Datenbankaktionen in vier (osgi) Bundles zu verteilen, tun alle etwas unterschiedliche Dinge. Ich möchte ein (einfaches) OSGi-Paket erstellen, das für alle Persistenzprobleme zuständig ist. Ich denke, das ist nicht so einfach, wie es sich anhört, wegen der "einzigartigen Classloader pro Bündel" Sache. Was ich wirklich schätzen würde ist, wenn jemand die Lösung (en) für diese Art von Problem kennt.

    
James McMahon 19.03.2009, 16:39
quelle

5 Antworten

4

(Wenn Sie Hibernate-Anmerkungen verwenden)

Speichern Sie alle Entities-Klassenlader, wenn das Hibernate-Paket über eine mit Anmerkungen versehene Klasse informiert wird.

Dann machen Sie so etwas, bevor Sie Ihre SessionFactory erstellen.

%Vor%     
Schildmeijer 05.04.2009, 10:04
quelle
5

Es gibt zwei Möglichkeiten, das Classloading-Problem zu lösen.

  • Sind Sie an ein bestimmtes OSGi-Framework gebunden oder möchten Sie so kompatibel wie möglich bleiben? Oder können Sie die Tagundnachtgleiche für Ihre Implementierung verwenden? In Equinox haben Sie einen Mechanismus namens Buddy Classloading. Mit diesem Zusatz können Sie die Sichtbarkeit bestimmter Klassen zwischen verschiedenen OSGi-Bundles erhöhen. Wenn Sie an diesem Thema interessiert sind, möchte ich Sie auf diese beiden Artikel verweisen: Verständnis wie Eclipse-Plug-Ins mit OSGi funktionieren , Eclipse - eine Geschichte von zwei VMs (und vielen Klassenlatern) .
  • Wenn Sie es vorziehen, die OSGi-Implementierung unabhängig zu halten, dann sollten Sie Ihre Klassen, die Sie persistieren möchten, in ein separates Paket extrahieren, von dem sowohl das Hibernate-Bundle als auch Ihre anderen Pakete abhängen. Auf diese Weise haben alle Zugriff auf die Klassendefinition der persistenten Klassen.
Stefan Schmidt 19.03.2009 19:38
quelle
1

Habe gerade eine interessante Methode in der Bundle-Klasse / API gefunden.

%Vor%

Dies muss einige Klassenladeprobleme lösen?

    
26.03.2009 21:17
quelle
1

Ich werde empfehlen, sich vom Laden der Buddy-Klassen fernzuhalten, da es spezifisch für Eclipse's Equinox-Implementierung ist und meiner Meinung nach funktioniert es, aber sie verstehen nicht, warum und jeder als Kumpel von allen endet sonst. Dadurch können Sie nicht mehr verstehen, wie OSGi Classloading funktioniert und welche Patterns Sie verwenden müssen (zusammengesetzte Klassenladeprogramme, Laden von Kontextklassen, OSGi-Services usw.), um damit zu arbeiten.

Wenn Ihr Persistenzbündel im Voraus weiß, welche Typen beibehalten werden müssen, kann das Bundle alle erforderlichen Pakete (Require-Bundle ist böse) importieren, die Ihre Domänenklassen enthalten.

Das Verwalten des Context-Class-Loaders (wie in der Antwort von Roger) kann Hibernate helfen, obwohl ich vorschlagen würde, etwas wie Spring dm zu verwenden, um das hinter einem OSGi-Service zu verbergen.

    
Steven Dick 13.04.2009 19:31
quelle
0

Hibernate unterstützt OSGi , aber es ist ein laufende Bemühungen .

    
Jarek Przygódzki 31.07.2015 05:45
quelle

Tags und Links