2010-08-05 18 views
8

En una aplicación web que utiliza struts2 ejb hibernate, es posible decirle a la aplicación que busque o cree una entidad para un nombre de unidad de persistencia específico, que está escrito en el archivo persistence.xml , en el tiempo de implementación?Cómo vincular una entidad a una unidad de persistencia específica

Tengo dos unidades de persistencia en persistence.xml, y una fuente de datos (incluyendo dos "local-tx-datasource") archivo xml en el nodo jboss.

Para aclarar, quiero decir, probé esto;

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

y no funciona .. Luego intentó esto y etc ..

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

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

y también he probado todas estas arriba con el "unitName = .." en lugar de "name = ..", pero nada se trabajó para mí ...

[SOLUCIONADO]

< .exclude-unlisted-clases> cierto < ./exclude-unlisted-cl asnos> ha resuelto mi problema

+0

Podría confirmar que combinó el ' true' con una lista de todas las clases de entidad (' com. mycompany.Foo 'etc.)? Preferiblemente edite esa información en la parte ** [SOLUCIONADA] ** de su pregunta. –

Respuesta

9

Actualización: Basado en su comentario (esto no es lo que entendí de la pregunta original), no creo que usted tiene cualquier otra opción de desactivar "descubrimiento" y enumerando explícitamente sus entidades en su respectiva unidad de persistencia:

<?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> 

no estoy al tanto de cualquier sintaxis en el nivel de la entidad que permite asignar a una unidad de persistencia.


No estoy seguro de haber entendido lo que estás tratando de hacer, pero si usted desea conseguir un Gerente de la entidad para una unidad de persistencia específica inyectada, que debe hacer:

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

    // ... 
} 

Si esto no es lo que quieres, aclara la pregunta.

+0

Al principio, gracias por su respuesta. Como sabemos, cuando agrego un @Entity anno. a una clase, buscará y creará la tabla en el DB justo mientras está en el tiempo de implementación. En mi aplicación, todas las entidades se buscan en una sola persistenceUnit y es incorrecta. Quiero decir, quiero que mis entidades sean buscadas o creadas en otro DB que se especifica en la otra persistenceUnit. Como resultado, quiero decir específicamente mi aplicación que las entidades seleccionadas deben buscarse o crearse solo para el objeto persistenceUnit seleccionado (que incluye la configuración correcta de base de datos). ¿Alguna idea? Gracias – Javatar

+0

Por cierto, vale la pena volver a decir que tengo dos unidades de persistencia en persistence.xml. Quiero decir, tengo dos configuraciones de conexión DB en mi aplicación y quiero usar una u otra dependiendo de las entidades que quiero. Quiero ser capaz de decir: "¡Oye, debería ver esta entidad como una tabla solo en ese DB (porque ya está allí) que puede encontrar la configuración del DB en ese nombre de unidad de persistencia! Entonces, use esta persistencia -unit para esta entidad " – Javatar

+0

true se resolvió mi problema, muchas gracias Pascal – Javatar

-1

@Pascal Thivent

No he probado el uso de múltiples EntityManager a la vez, pero mirando problema anteriormente mencionado esto puede ayudar si funciona.

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

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

+1

Bueno, esa es exactamente mi sugerencia. Pero parece que OP está buscando algo más. –

+0

Gracias Nayan. Sin embargo, el problema no es realmente la inyección de entitymanager. He agregado un comentario a la primera respuesta anterior. Si tiene alguna idea sobre el problema que mencioné, sería genial escuchar eso. – Javatar

+0

@Downvoter OP aclaró en el comentario que era diferente de la pregunta original; lo que salió mal para downvote innecesariamente. –

0

Lo que estamos buscando es probablemente <exclude-unlisted-classes>true</exclude-unlisted-classes>.

Comprobar la documentación sobre jboss.org:

En mi configuración que tenía dos bases de datos (digamos A y B) y quería dos unidades separadas de persistencia, en los que uno contenga todas las entidades, pero uno, mientras que el otro unidad de persistencia contiene la entidad restante. Mi persistenciaXML es el siguiente:

<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> 

Cuestiones relacionadas