2009-03-19 18 views
8

Invece di avere le azioni del database sparse in quattro (osgi) pacchetti, tutti ci fanno cose leggermente diverse. Voglio creare un (semplice) bundle OSGi responsabile di tutti i problemi di persistenza. Sento che non è così semplice come sembra a causa della cosa "unique classloader per bundle". Quindi quello che davvero apprezzerei è se qualcuno conosce la soluzione (s) per questo tipo di problema.OSGi + Hibernate

risposta

4

(Se si utilizza Hibernate Annotations)

Salvare tutti i caricatori di classe Entità quando il fascio Hibernate viene informato una classe annotata.

Quindi fare qualcosa di simile prima di costruire SessionFactory.

ClassLoad cl = Thread.currentThread().getContextClassLoader(); 
try { 
Thread.currentThread().setContextClassLoader(yourClassLoader); 
factory = cfg.buildSessionFactory(); 
}finally { 
Thread.currentThread().setContextClassLoader(cl); // restore the original class loader 
} 
5

Ci sono due modi in cui posso pensare di risolvere il problema di classloading.

  • Sei legato a uno specifico framework OSGi o vuoi rimanere il più compatibile possibile? O puoi usare l'equinozio per la tua implementazione? In Equinox hai un meccanismo chiamato Buddy Classloading. Questa aggiunta consente di aumentare la visibilità di alcune classi tra diversi bundle OSGi. Se sei interessato a questo argomento, vorrei indirizzarti a questi due articoli: Understanding how Eclipse plug-ins work with OSGi, Eclipse - a tale of two VMs (and many classloaders).
  • Se si desidera mantenere indipendente l'implementazione di OSGi, si potrebbe prendere in considerazione l'estrazione delle classi, che si desidera mantenere, in un pacchetto separato da cui dipendono sia il pacchetto Hibernate che gli altri bundle. In questo modo, tutti hanno accesso alla definizione di classe delle classi persistenti.
1

Ho appena trovato un metodo interessante nella classe/API Bundle.

public java.lang.Class loadClass(java.lang.String name) throws java.lang.ClassNotFoundException 

Questo deve risolvere alcuni problemi del caricatore di classe?

1

ho intenzione di raccomandare di stare lontano dalla classe compagno di carico in quanto è specifico per Eclipse implementazione Equinox e, a mio parere, le persone a farlo funzionare, ma non capisco perché e ognuno finisce come un amico di tutti gli altri. Ciò impedisce di comprendere correttamente come funziona il caricamento di classi OSGi e i pattern che è necessario utilizzare (caricatori di classi compositi, caricamento della classe di contesto, servizi OSGi, ...) per lavorare con esso.

Se il bundle di persistenza conosce in anticipo quali tipi deve persistenza, il pacchetto può importare tutti i pacchetti richiesti (Require-Bundle è malvagità) che contengono le classi di dominio.

La gestione del caricatore di classe di contesto (come nella risposta di Roger) può essere d'aiuto con Hibernate, anche se suggerirei di usare qualcosa come Spring dm per nasconderlo dietro un servizio OSGi.