Question

Au lieu d’avoir des actions de base de données dispersées dans quatre bundles (osgi), elles font toutes des choses légèrement différentes. Je souhaite créer un (simple) bundle OSGi responsable de tous les problèmes de persistance. Je pense que ce n’est pas aussi simple que cela puisse paraître en raison du & "Chargeur de classe unique par paquet &"; chose. Donc, ce que j'apprécierais vraiment, c’est que si quelqu'un connaisse la (les) solution (s) à ce type de problème.

Était-ce utile?

La solution

(Si vous utilisez des annotations Hibernate)

Enregistrez tous les chargeurs de classe Entities lorsque le groupe Hibernate est informé d'une classe annotée.

Faites quelque chose comme cela avant de construire votre SessionFactory.

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

Autres conseils

Je peux penser à deux façons de résoudre le problème du chargement de classes.

  • Êtes-vous lié à un OSGi-Framework spécifique ou souhaitez-vous rester aussi compatible que possible? Ou pouvez-vous utiliser l'équinoxe pour votre implémentation? Dans Equinox, vous avez un mécanisme appelé Buddy Classloading. Cet ajout vous permet d’augmenter la visibilité de certaines classes entre différents OSGi-Bundles. Si vous êtes intéressé par ce sujet, je voudrais vous diriger vers ces deux articles: Comprendre le fonctionnement des plug-ins Eclipse avec OSGi , Eclipse - une histoire de deux machines virtuelles (et de nombreux chargeurs de classe) .
  • Si vous préférez rester indépendant de la mise en œuvre OSGi, vous pouvez envisager d'extraire vos classes, que vous souhaitez conserver, dans un bundle distinct dont dépendent à la fois Hibernate-Bundle et vos autres bundles. De cette façon, ils ont tous accès à la définition de classe des classes persistantes.

Je viens de trouver une méthode intéressante dans la classe / api Bundle.

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

Cela doit résoudre certains problèmes de chargeur de classe?

Je vais recommander de rester à l'écart du chargement en classe d'amis, car il est spécifique à la mise en oeuvre d'Equinipse dans Equinox et, à mon avis, les gens le font fonctionner mais ils ne comprennent pas pourquoi et tout le monde finit par devenir un ami de tout le monde. autre. Cela vous empêche de bien comprendre le fonctionnement du chargement de classes OSGi et les modèles à utiliser (chargeurs de classes composites, chargement de classes de contexte, services OSGi, ...) pour les utiliser.

Si votre groupe de persistance sait à l'avance quels types il doit conserver, il peut importer tous les packages requis (Require-Bundle is evil) contenant vos classes de domaine.

La gestion du chargeur de classes de contexte (comme dans la réponse de Roger) peut vous aider avec Hibernate, bien que je suggère d'utiliser quelque chose comme Spring dm pour le masquer derrière un service OSGi.

Hibernate prend en charge OSGi , mais il s’agit d’un effort en cours .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top