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
(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
}
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.
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?
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.
Hibernate does support OSGi ma è un ongoing effort.
- 1. Utilizzo libreria non osgi in un'applicazione osgi
- 2. OSGi vs Spring vs Struts vs EJB vs Hibernate - una domanda totalmente newbie
- 3. Quando un frammento OSGi è collegato all'host?
- 4. Avvio del bundle OSGi
- 5. Aggiornamento bundle OSGi all'avvio
- 6. OSGi e server applicazioni
- 7. Struttura pacchetto bundle OSGi
- 8. Managing OSGi Dipendenza inferno
- 9. OSGi o Impala?
- 10. Avvia programmaticamente OSGi (Equinox)?
- 11. MEF OSGi for .NET?
- 12. granularità moduli/bundle OSGi
- 13. OSGi Threading Model
- 14. perchè si usa osgi?
- 15. OSGi e Java EE - JOSGiEE?
- 16. OSGi vs jboss hot deploy
- 17. JPA con OSGi DS esempio
- 18. Punto di pareggio per OSGi
- 19. Come utilizzare servlet con osgi
- 20. Stampa percorso classe bundle OSGI?
- 21. OSGI Bundle vs vaso dipendenza
- 22. Intervalli di versione valida OSGI
- 23. utilizzando osgi per sviluppare un'applicazione
- 24. OSGi: Blueprint vs DM Primavera
- 25. Come avviare console OSGi (Equinox)
- 26. Cerca servizi OSGI per proprietà
- 27. OSGI runtime all'interno del server Java EE tradizionale
- 28. Come posso condividere librerie non OSGi tra bundle in un contenitore OSGi?
- 29. Per incorporare OSGi nel contenitore servlet o nel contenitore servlet in OSGi?
- 30. OSGI JNDI consente la coesistenza con chiamate JNDI dal codice non OSGI?