En aplicaciones Java EE 6 en el que estoy usando .la oreja de embalaje, me gustaría crear una unidad de persistencia que se puede acceder a partir de los componentes en diferentes .los archivos jar.

Sin embargo, no estoy seguro de cómo definir esta unidad de persistencia. Con la @PersistenceContext anotación de la búsqueda sólo tiene éxito si el nombre coincide con una unidad de persistencia se define en el local persistence.xml archivo.

Es posible referirse a externa unidades de persistencia?

InformationsquelleAutor bamoida2010 | 2010-11-01

7 Comentarios

  1. 47

    Aquí están las secciones pertinentes de la JPA 2.0 especificación:

    8.2 Unidad De Persistencia De Envases

    Una unidad de persistencia se define por un
    persistence.xml archivo. El archivo jar o
    directorio cuyo META-INF directorio
    contiene la persistence.xml archivo
    denomina la raíz de la persistencia
    unidad. En entornos Java EE, la
    de la raíz de una unidad de persistencia debe ser uno
    de los siguientes:

    • un EJB-JAR archivo
    • la WEB-INF/classes directorio de un archivo WAR[80]
    • un archivo jar en el WEB-INF/lib de un archivo WAR
    • un archivo jar en el directorio de biblioteca EAR
    • una aplicación cliente archivo jar

    No es necesario que un EJB-JAR o
    La GUERRA de archivo que contiene una unidad de persistencia
    de ser embalado en un OÍDO, a menos que el
    unidad de persistencia contiene persistencia
    clases además de las contenidas
    dentro de los EJB-JAR o WAR. Véase La Sección
    8.2.1.6.

    NOTA: Persistencia Java 1.0 apoyó el uso de un archivo jar en la raíz de la
    El OÍDO como la raíz de una unidad de persistencia.
    Este uso no está soportado.
    Aplicaciones portátiles deben usar el OÍDO directorio de la biblioteca para este caso
    en lugar
    . Ver [9].

    Una unidad de persistencia debe tener un nombre.
    Sólo una unidad de persistencia de cualquier
    el nombre debe ser definido dentro de una sola
    EJB-JAR archivo, dentro de una sola GUERRA
    archivo, dentro de una sola aplicación
    jar del cliente, o dentro de un OÍDO. Ver
    La Sección 8.2.2, «La Persistencia De La Unidad De
    Ámbito de aplicación».

    La persistence.xml archivo puede ser utilizado
    designar a más de una persistencia
    unidad dentro del mismo ámbito.

    Todas las clases de persistencia se define en el
    nivel de Java EE OÍDO debe ser
    accesible para todos los demás Java EE
    componentes en la aplicación
    – es decir,
    cargado por el cargador de clases de la aplicación
    – de tal forma que si la misma clase de entidad de referencia en dos diferentes Java EE
    componentes (que puede ser el uso de
    diferentes unidades de persistencia), el
    referencia de clase es el mismo
    clase.

    Y más adelante:

    8.2.2 Persistencia Ámbito De La Unidad

    Un EJB-JAR, la GUERRA, la aplicación cliente
    jar, o el OÍDO puede definir una persistencia
    unidad.

    Cuando se hace referencia a una unidad de persistencia
    el uso de la unitName anotación
    elemento o persistence-unit-name
    descriptor de despliegue elemento, el
    la visibilidad ámbito de la persistencia
    la unidad está determinada por su punto de
    definición:

    • Una unidad de persistencia que se define en el nivel de un EJB-JAR, WAR, o
      aplicación cliente frasco es en el ámbito de
      que EJB-JAR, de GUERRA, o de la aplicación jar
      respectivamente y es visible para el
      los componentes definidos en el frasco o en la guerra.
    • Una unidad de persistencia que se define en el nivel de la OREJA es generalmente
      visible a todos los componentes de la
      aplicación
      . Sin embargo, si una persistencia
      unidad del mismo nombre está definido por un
      EJB-JAR, de GUERRA, o de la solicitud de archivo jar
      dentro de la OREJA, la unidad de persistencia
      de ese nombre definido a nivel de la OREJA, se
      no será visible para los componentes
      definido por la que EJB-JAR, WAR, o
      archivo jar de aplicación a menos que el
      la persistencia de la unidad de referencia se utiliza el
      la persistencia nombre de la unidad de # sintaxis para
      especifique un nombre de ruta de acceso para eliminar la ambigüedad de
      la de referencia.
      Cuando el # sintaxis es
      se utiliza, el nombre de la ruta es relativa a la
      referencia componente de aplicación jar
      archivo. Por ejemplo, la sintaxis
      ../lib/persistenceUnitRoot.jar#myPersistenceUnit
      se refiere a una unidad de persistencia cuya
      nombre, tal como se especifica en el elemento de nombre
      de la persistence.xml archivo, es
      myPersistenceUnit y para que el
      relación nombre de ruta de acceso de la raíz de la
      unidad de persistencia es
      ../lib/persistenceUnitRoot.jar. El
      # sintaxis puede ser utilizado con el unitName anotación de los elementos o
      persistence-unit-name implementación
      descriptor para hacer referencia a un elemento
      unidad de persistencia se define al nivel de la OREJA.

    También es necesario incluir las clases de entidad frasco en un manifiesto de la pu de la jarra http://wiki.eclipse.org/Packaging_and_Deploying_EclipseLink_JPA_Applications_(ELUG)

    Para resumir, usted debería ser capaz de definir las entidades y la unidad de persistencia en el nivel superior de la OREJA y a utilizarlos de los otros módulos.

    Es solo que no estoy seguro de entender lo que has intentado y qué problema(s) que se enfrentan.

    • qué tenemos que hacer ninguna manifestación de la diversión? estoy utilizando el metamodelo clases en la web y seguir recibiendo – No [EntityType] fue encontrado por la clase de la clave [com.aaa] en el Metamodelo – por favor, compruebe que la [Entidad] clase de la que se hace referencia en persistence.xml el uso de una <clase>com.aa</clase> inmueble o un mundial <excluir-sin clasificar-clases>false</exclude-sin clasificar-clases> elemento.
    • En mi test de Arquillian pongo la persistencia del recipiente en /lib, y anotado entityManager con @PersistenceContext(unitName = "lib/myPersistence.jar#PU-name") y se puso inyecta correctamente. Gracias por la sugerencia!
  2. 14

    El problema podría ser resuelto mediante la colocación de un persistence.xml en un archivo jar que se encuentra en el oído del directorio lib.

    La persistence.xml debe contener los archivos jar que incluye a las Entidades.
    Tuve que dar la ruta de acceso relativa a los archivos jar.
    Mi oído irectory estructura

    |-ear--
           |-lib--|... some libs ...
           |      |--my-persistence-xml.jar
           |-ejb-with-entities1.jar
           |-ejb-with-entities2.jar

    Mi persistence.xml para jboss 7.1.1

    <persistence-unit name="my-pu" transaction-type="JTA">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <jta-data-source>java:jboss/datasources/mypu</jta-data-source>
        <jar-file>../ejb-with-entities1.jar</jar-file>
        <jar-file>../ejb-with-entities1.jar</jar-file>
        <properties>
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"/>
            <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
            <property name="hibernate.show_sql" value="true"/>
            <property name="hibernate.format_sql" value="true" />
        </properties>
     </persistence-unit>

    Espero que esto ayude

  3. 8

    Todo lo que usted necesita

    EAR +
        |- META-INF +
        |       - persistence.xml
        |- ejb1-module.jar
        |- ejb2-module.jar
    
    
    <?xml version="1.0" encoding="UTF-8"?>
    <persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">
        <persistence-unit name="my-persistence-unit">
            <provider>org.hibernate.ejb.HibernatePersistence</provider>
            <jta-data-source>MyDataSource</jta-data-source>
            <!-- Note: it's relative to `persistence-module.jar` file location in EAR -->
            <jar-file>../ejb1-module.jar</jar-file>
            <jar-file>../ejb2-module.jar</jar-file>
            <properties>
                ...
    
            </properties>
        </persistence-unit>
    </persistence>
  4. 5

    Ejemplo, el trabajo de la OREJA de diseño para Glassfish:

    EAR +
        |- lib +
        |      |- core-module.jar
        |      \- persistence-module.jar +
        |                                 \- META-INF +
        |                                              \- persistence.xml
        |- ejb1-module.jar
        \- ejb2-module.jar

    Módulos EJB puede ser cualquiera de los archivos jar o explotó directorios.

    En este caso persistence.xml como pueden ser:

    <?xml version="1.0" encoding="UTF-8"?>
    <persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">
        <persistence-unit name="my-persistence-unit">
            <provider>org.hibernate.ejb.HibernatePersistence</provider>
            <jta-data-source>MyDataSource</jta-data-source>
            <!-- Note: it's relative to `persistence-module.jar` file location in EAR -->
            <jar-file>../ejb1-module.jar</jar-file>
            <jar-file>../ejb2-module.jar</jar-file>
            <properties>
                <property name="hibernate.current_session_context_class" value="jta"/>
                <property name="hibernate.id.new_generator_mappings" value="true"/>
                <property name="hibernate.dialect"      value="org.hibernate.dialect.PostgreSQL82Dialect"/>
                <property name="hibernate.show_sql"     value="true"/>
                <property name="hibernate.format_sql"   value="true"/>
                <property name="hibernate.hbm2ddl.auto" value="update"/>
            </properties>
        </persistence-unit>
    </persistence>

    Tiene que actualizar <jar-file> referencias si utiliza el módulo de control de versiones (por ejemplo,ejb1-module-1.0-SNAPSHOT.jar).

    Objetos abstractos con @MappedSuperclass anotación y EntityManager de inyección pueden ser colocados en cualquier envase. Este frasco no necesita ser mencionado en persistence.xml. Por ejemplo, puede crear core-module.jar con PersistableEntity.java:

    public class PersistableEntity {
        @Id
        @GeneratedValue
        private Long id;
    
        public Long getId() { return id; }
    
        public Integer getVersion() { return version; }
    }

    Y PersistableEntityManager.java:

    public class PersistableEntityManager<T extends PersistableEntity> {
        @PersistenceContext
        protected EntityManager em;
    }

    Este core-module.jar podría ser utilizado por todos tus proyectos con diferentes unidades de persistencia.
    Usted acaba de heredar de sus Entidades y Ejb y evitar repetitivo.
    Echa un vistazo ejemplo bilionix-core en github.

    • Tenga en cuenta que si usted está usando Netbeans, usted debe tener su Persistance-Entities-Module.jar como dependencia de biblioteca [== add JAR/carpeta en la RMB>propiedades del proyecto] (no en el proyecto de la dependencia [== Agregar proyecto en RMB->propiedades del proyecto]). Esto se puede hacer a partir de cualquiera de proyecto EJB o el OÍDO proyecto.
    • Me gustan esos dos ejemplos que dan al final… Pero me pregunto… cuando hay más de una Unidad de Persistencia (PU), luego que uno de ellos será utilizado en PersistableEntityManager? Va a ser el predeterminado? E. g. la definida en standalone.xml (en el caso de WildFly) como este: <subsystem xmlns="urn:jboss:domain:ee:4.0"> ... <default-bindings datasource="java:jboss/datasources/ExampleDS" .../> ... </subsystem> ?
  5. 1

    Probar con este:

    1. Configurar OÍDO application.xml de archivo de esta forma:

      http://xmlns.jcp.org/xml/ns/javaee/application_7.xsd»
      version=»7″>
      YourEEApplication

      <initialize-in-order>true</initialize-in-order> <!-- This is the most important thing -->
      
      <module>
          <ejb>YourEJBModule1.jar</ejb>
      </module>
      <module>
          <ejb>YourEJBModule2.jar</ejb>
      </module>
      ......
      <module>
          <ejb>YourEJBModuleX.jar</ejb>
      </module>
      
      <module>
          <web>
              <web-uri>YourWebModule.war</web-uri>
              <context-root>YourWebModule</context-root>
          </web>
      </module>

    2. En su EJB proyectos YourEJBModule1, YourEJBModule2… y YourEJBModuleX:

    Inyectar Contexto de Persistencia whitout la unitName propiedad:

    @PersistenceContext(type=PersistenceContextType.TRANSACTION)
        private EntityManager em; //get & set
    1. Para cada módulo EJB persistence.xml archivo:

    YourEJBModule1:

    <?xml version="1.0" encoding="UTF-8"?>
    <persistence version="2.1"
        xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
        <persistence-unit name="PersistenceUnit1"
            transaction-type="JTA">
            <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    
            <jta-data-source>jdbc/YourDataSource</jta-data-source>
            <class>com.example.Foo1</class>
            <!-- Other properties -->
        </persistence-unit>
    </persistence>

    YourEJBModule2:

    <?xml version="1.0" encoding="UTF-8"?>
    ...
        <persistence-unit name="PersistenceUnit2"
            transaction-type="JTA">
            <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    
            <jta-data-source>jdbc/YourDataSource</jta-data-source>
            <jar-file>YourEJBModule1.jar</jar-file>
            <class>com.example.Foo2</class>
            <!-- Other properties -->
        </persistence-unit>
    ...

    YourEJBModuleX:

    <?xml version="1.0" encoding="UTF-8"?>
    ...
        <persistence-unit name="PersistenceUnitX"
            transaction-type="JTA">
            <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    
            <jta-data-source>jdbc/YourDataSource</jta-data-source>
            <jar-file>YourEJBModule1.jar</jar-file>
            <jar-file>YourEJBModule2.jar</jar-file>
            ......
            <class>com.example.FooX</class>
            <!-- Other properties -->
        </persistence-unit>
    ...

    En la base de datos existen varios esquemas, uno por cada módulo EJB, puede acceder a ellos a través de jta-data-source

    (Implementado en Glassfish 4)

  6. -1

    Esto es lo que hice.

    1) Paquete de la persistencia de los archivos de configuración en un archivo jar. El archivo jar contendrá:

    • META-INF/persistence.xml (y orm.xml si usted usa uno)
    • Crear un «lib» de la carpeta en el OÍDO proyecto y el palo del frasco en el que hay

    2) Paquete de la entidad asociada clases en otro frasco:

    • Poner este archivo jar en su GlassFish dominio/carpeta lib (o cualquier carpeta lib equiv en otros servidores)
    • Al principio me liado la jarra en el OÍDO «lib» de la carpeta pero las clases no se encontraron
    • Si alguien sabe una mejor manera de manejar esto, por favor explique

    La Contexto de Persistencia debe ser accesible a todos los EJB y Web Apps incluido en su Aplicación Empresarial.

  7. -1

    Quería lograr compartido persistencia módulo EJB sin OREJA proyecto.

    Esto es posible por

    1. mover todos persistencia de entidades para separar proyecto EJB (no se mueven persistance.xml para nuevo proyecto, sólo las clases son necesarias
    2. la elaboración de este proyecto EJB
    3. envío de proyecto GlassFish server mediante
    scpAsSudo ~/NetbeansProjects/UnifyEntities/dist/UnifyEntities.jar [email protected]:/opt/glassfish3/domains/domain1/lib/ext

    Divertirse!

Dejar respuesta

Please enter your comment!
Please enter your name here