2010-08-05 4 views
8

Dans une application Web utilisant struts2 ejb hibernate, est-il possible d'indiquer à l'application de rechercher ou de créer une entité pour un nom d'unité de persistance spécifique, qui est écrit dans le fichier persistence.xml , dans le temps de déploiement?Comment lier une entité à une unité de persistance spécifique

J'ai deux persistance-unité dans persistence.xml, et une source de données (y compris deux "XML-tx-datasource") fichier XML sous le nœud jboss.

Pour clearifier, je veux dire, j'ai essayé cela;

@Entity 
@PersistenceContext(unitName="MY JNDI NAME specified in persistence.xml") 
public abstract class Vehicle { 

et ne marche pas le travail .. Ensuite, essayé et etc ..

@PersistenceContext(name="MY PERSISTENCE UNIT NAME specified in persistence.xml") 

@PersistenceUnit(name="MY PERSISTENCE UNIT NAME specified in persistence.xml") 

et aussi j'essayé ces ci-dessus avec le "NomUnité = .." au lieu de "name = .." mais quoi que ce soit est travaillé pour moi ...

[RESOLU]

< .exclude-unlisted-classes> true < ./exclude-unlisted-cl ânes> a résolu mon problème

+0

Pouvez-vous confirmer que vous avez combiné le ' true' avec la liste de toutes les classes d'entités (' com. mycompany.Foo 'etc.)? De préférence, modifiez cette information dans la partie ** [RESOLU] ** de votre question. –

Répondre

9

Mise à jour: Sur la base de votre commentaire (ce n'est pas ce que je compris de la question initiale), je ne pense pas que vous avez une autre option que de désactiver la « découverte » et la liste explicitement vos entités dans leur unité de persistance respective:

<?xml version="1.0" encoding="UTF-8"?> 
<persistence 
    xmlns="http://java.sun.com/xml/ns/persistence" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" 
    version="2.0"> 

    <persistence-unit name="MyPu1" transaction-type="RESOURCE_LOCAL"> 
    <provider>org.hibernate.ejb.HibernatePersistence</provider> 
    <class>com.mycompany.Foo</class> 
    ... 
    <exclude-unlisted-classes>true</exclude-unlisted-classes> 
    <properties> 
     <!-- H2 in memory --> 
     <property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/> 
     <property name="javax.persistence.jdbc.url" value="jdbc:h2:mem:test"/> 
     <property name="javax.persistence.jdbc.username" value="APP"/> 
     <property name="javax.persistence.jdbc.password" value="APP"/> 
     <property name="hibernate.hbm2ddl.auto" value="update"/> 
    </properties> 
    </persistence-unit> 

    <persistence-unit name="MyPu2" transaction-type="RESOURCE_LOCAL"> 
    <provider>org.hibernate.ejb.HibernatePersistence</provider> 
    <class>com.mycompany.Bar</class> 
    ... 
    <exclude-unlisted-classes>true</exclude-unlisted-classes> 
    <properties> 
     <!-- Derby server --> 
     <property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.ClientDriver"/> 
     <property name="javax.persistence.jdbc.user" value="APP"/> 
     <property name="javax.persistence.jdbc.password" value="APP"/> 
     <property name="javax.persistence.jdbc.url" value="jdbc:derby://localhost:1527/Pu2;create=true"/> 
     <property name="hibernate.hbm2ddl.auto" value="update"/> 
    </properties> 
    </persistence-unit> 
</persistence> 

Je ne suis pas au courant d'aucune syntaxe au niveau de l'entité permettant d'attribuer à une unité de persistance.


Je ne suis pas sûr d'avoir compris ce que vous essayez de faire, mais si vous voulez obtenir un gestionnaire d'entité pour une unité de persistance spécifique injectée, vous devez faire:

@Stateless 
public class FooBean implements Foo { 
    @PersistenceContext(unitName="MyPu1") 
    EntityManager em1; 

    // ... 
} 

Si ce n'est pas ce que vous voulez, s'il vous plaît clarifier la question.

+0

Au début, merci pour votre réponse. Comme nous le savons, quand j'ajoute un anno @Entity. à une classe, il cherchera et devrait créer la table dans la DB juste pendant le temps de déploiement. Dans mon application, toutes les entités sont recherchées dans un seul persistenceUnit et ce n'est pas la bonne. Je veux dire, je veux que mes entités soient recherchées ou créées dans un autre DB qui est spécifié dans l'autre persistenceUnit. En conséquence, je veux spécifiquement dire à mon application que les entités sélectionnées doivent être recherchées ou créées uniquement pour l'objet persistenceUnit sélectionné (qui inclut les bons paramètres de base de données). Une idée? Merci – Javatar

+0

BTW, il vaut la peine de dire à nouveau que j'ai deux persistance-unité dans persistence.xml. Je veux dire, j'ai deux paramètres de connexion DB dans mon application et je veux utiliser l'un ou l'autre dépend des entités que je veux. Je veux être capable de dire, "Hé, vous devriez voir cette entité comme une table dans seulement ce DB (parce qu'il est déjà là) que vous pouvez trouver les paramètres de la DB dans ce nom de l'unité de persistance! Donc, utilisez cette persistance -unit pour cette entité " – Javatar

+0

true est résolu mon problème, merci beaucoup Pascal – Javatar

-1

@Pascal Thivent

Je ne l'ai pas essayé d'utiliser plusieurs EntityManager à la fois, mais regardant problème ci-dessus mentionné cela peut aider si cela fonctionne.

@PersistenceContext(unitName="MyPu1") EntityManager em1;

@PersistenceContext(unitName="MyPu2") EntityManager em2;

+1

Eh bien, c'est exactement ma suggestion. Mais il semble que le PO cherche autre chose. –

+0

Merci Nayan. Cependant, le problème ne concerne pas vraiment l'injection d'entitymanager. J'ai ajouté un commentaire à la première réponse ci-dessus. Si vous avez une idée du problème que j'ai mentionné, je serais ravi de l'entendre. – Javatar

+0

@Downvoter OP clarifié dans le commentaire qui était différent de la question originale; ce qui ne va pas à downvote inutilement. –

0

Qu'est-ce que vous cherchez est probablement <exclude-unlisted-classes>true</exclude-unlisted-classes>.

Consultez la documentation sur jboss.org:

Dans ma configuration, j'ai eu deux bases de données (disons A et B) et je voulais deux unités de persistance séparées, où l'on contient toutes les entités, mais l'un, tandis que l'autre L'unité de persistance contient l'entité restante. Ma persistancexml ressemble à ceci:

<persistence xmlns="http://java.sun.com/xml/ns/persistence" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" 
version="2.0"> 
<persistence-unit name="A" transaction-type="RESOURCE_LOCAL"> 
    <provider>org.hibernate.ejb.HibernatePersistence</provider> 
    <properties> 
     <property name="hibernate.dialect" value="${hibernate.dialect}" /> 
    </properties> 
</persistence-unit> 

<persistence-unit name="B" transaction-type="RESOURCE_LOCAL"> 
    <provider>org.hibernate.ejb.HibernatePersistence</provider> 
    <exclude-unlisted-classes>true</exclude-unlisted-classes> 
    <properties> 
     <property name="hibernate.dialect" value="${rud.hibernate.dialect}"/> 
    </properties> 
    <class>com.sgk.Person</class> 
</persistence-unit> 

Questions connexes