Nom de l'unité de persistance dynamique JPA
J'ai besoin d'un moyen dynamique d'spécifier l'unité de persistance dans un EJB.
Exemple simplifié:
J'ai une demande à l'aide de plusieurs bases de données des banques de données.
Chacun des magasins de données sont structurellement les mêmes.
Selon le client qui se connecte à l'application, j'ai besoin d'accéder aux données de
une banque de données spécifique.
Donc, je voudrais utiliser la même EJB, de sorte que la logique d'entreprise n'est pas dupliqué,
mais alors il suffit de choisir la bonne unité de persistance basé sur le client.
Jusqu'à ce point, je n'ai injecté directement à l'entité gestionnaire de l'unité de persistance nom codé en dur.
Est il possible que je peux dynamiquement injecter de l'entité gestionnaire de la nécessaire unité de persistance attaché à l'EJB?
Aussi, pouvez-unités de persistance être ajoutés dynamiquement au cours de l'exécution?
J'ai actuellement pour spécifier l'unité de persistance dans l'persistence.xml fichier.
Idéalement, je voudrais créer des piscines sur le serveur jdbc/db1, jdbc/db2 etc tout le système est en cours d'exécution. Puis il suffit de l'ajouter à la centrale de base de données client et de le lier à un client, de sorte que lorsque le client se connecte, il va vérifier le nom de la piscine, et de l'utiliser lors de l'appel de l'EJB pour obtenir l'unité de persistance.
Je suis encore vraiment nouveau dans le développement Java EE. Toute aide serait grandement appréciée.
source d'informationauteur likenoother
Vous devez vous connecter pour publier un commentaire.
Dans le courant de la JPA version, ce n'est malheureusement pas possible de créer des unités de persistance de façon dynamique. Si cette fonctionnalité, il est important pour vous, vous pourriez envisager la création d'un TABLEAU de question pour elle à la JPA issue tracker: http://java.net/jira/browse/JPA_SPEC
À l'aide de la
@PersistenceContext
annotation, il n'est également pas possible de sélectionner de façon dynamique spécifique de l'unité de persistance. C'est en fait le domaine de la fragmentation, qui veille prolongée une fois essayé d'adresse, puis soudainement interrompu. Voir http://www.hibernate.org/subprojects/shards.htmlIl y a cependant une chose que vous pouvez faire pour obtenir un effet similaire.
Une approche consiste à créer un EJB Stateless/CDI usine bean, que vous injectez avec tous vos gestionnaires de l'entité. Le coût de ce qui est marginal, puisque ces grains seront mis en commun et les gestionnaires de l'entité ne sont pas si cher que ça d'être créé en premier lieu.
Si vous aussi vous voulez de les injecter basée sur une condition, cette condition devra être disponible à partir du contexte ou doit être spécifiée au point d'injection (mais si vous voulez le faire, vous pourriez tout aussi bien injecter le droit de l'entité gestionnaire directement).
Un kickoff exemple:
Et puis dans votre haricots:
Noter que vous devez Couture Persistance ici pour la
@TransactionScoped
annotation. Il peut également être plus facile, mais un peu plus détaillé, pour oublier l'injection de l'entité gestionnaire de transparence et d'injecter de l'ShardingEntityManagerFactory
place et obtenir le droit de manuellement.C'est probablement ce qui n'est d'aucune aide pour résoudre le problème, mais vous pouvez, comme de savoir que ce genre de problèmes est en cours de discussion pour la mise en œuvre de la JPA 2.1
Cela ressemble à un de ces cas de multilocataire:
Proposition de Multilocataire Soutien en JPA 2.1 JSR-338
Vous pouvez utiliser la même unité de persistance pour cela. Vous avez juste besoin de fournir une des propriétés de la Carte lorsque vous appelez createEntityManagerFactory() avec l'url/source de données que vous souhaitez utiliser.
Juste une idée, vous ne savez pas si ça vous aidera:
Vous pouvez ouvrir un inputStream pour lire la
persistence.xml
fichier et remplacer ces lignes:Puis splash une connexion config de l'écran où l'utilisateur se connecte, et de définir la connexion selon les privilèges d'utilisateur sur ce fichier, puis de lancer l'application principale
Pas sûr si ça va aider, c'est juste une idée.
Dépend de l'application et de la logique métier.