Pregunta

Soy nuevo en EJB 3 y la APP.

He creado un origen de datos en el servidor de aplicaciones que es jdbc/AppDataSource. El valor por defecto persistencia proveedor se deja como com.ibm.websphere.persistence.PersistenceProviderImpl. Y salí de la fuente de datos de nombre JNDI JTA defecto como AppDataSource sí. En realidad estoy confundido en cuanto a JTA y no JTA. Lo que los diferencia?

Me genera las entidades y crea un objeto EntityTransaction en el grano. Al llamar a los métodos persist() y commit(), me sale un error:

javax.ejb.EJBException: See nested exception; nested exception is: <openjpa-1.2.1-SNAPSHOT-r422266:686069 fatal user error> org.apache.openjpa.persistence.ArgumentException: A JDBC Driver or DataSource class name must be specified in the ConnectionDriverName property.
Caused by: <openjpa-1.2.1-SNAPSHOT-r422266:686069 fatal user error> org.apache.openjpa.persistence.ArgumentException: A JDBC Driver or DataSource class name must be specified in the ConnectionDriverName property.

¿Cómo funciona openjpa entra en el cuadro aquí?

A partir de ahora, mi persistence.xml contiene sólo los nombres de las clases entidad.

¿Cómo puedo hacer que use los valores de servidor de aplicaciones por defecto para la fuente de datos. Porque, ¿cómo puedo proporcionar los detalles del proveedor JPA y del origen de datos detalles en el persistence.xml?

Por favor, proporcionar a sus entradas.

¿Fue útil?

Solución

Esta pregunta en realidad implica muchos conceptos y no voy a cubrir todas ellas en detalle. Para obtener detalles más exhaustivos, sugiero la lectura de la totalidad Capítulo 5 - responsables de la Entidad y contextos de persistencia de la especificación 1.0 de la APP (y las otras secciones pertinentes mencionados al final de esta respuesta). en vez voy a tratar de describir el escenario más común en un entorno Java EE.

En un entorno EJB, se podría usar normalmente:

  • gestor de la entidad gestionada por contenedor (debe ser un gestor de la entidad JTA)
    • con ámbito de transacción en los granos sin estado de sesión (SLSB)
    • ampliada en los beans con estado de sesión (SFSB)
  • Gestión de transacciones JTA (y no las transacciones de recursos locales a menos que sea realmente lo que quiere)

Aquí es cómo un persistence.xml para un gestor de la entidad JTA que utiliza una fuente de datos con un nombre JNDI java:comp/env/jdbc/AppDataSource se puede configurar, OpenJPA ser el proveedor de persistencia que utiliza WebSphere:

<?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_1_0.xsd"
  version="1.0">
  <persistence-unit name="MyPu" transaction-type="JTA">
    <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
    <jta-data-source>java:comp/env/jdbc/AppDataSource</jta-data-source>
    <class>com.acme.domain.Foo</class>
    <class>com.acme.domain.Bar</class>
    <exclude-unlisted-classes>true</exclude-unlisted-classes>
    <properties>
      <!-- OpenJPA specific properties -->
      <property name="openjpa.TransactionMode" value="managed"/>
      <property name="openjpa.ConnectionFactoryMode" value="managed"/>
      <property name="openjpa.jdbc.DBDictionary" value="db2"/>
    </properties>
  </persistence-unit>
</persistence>

Para las propiedades OpenJPA, se refiere a la OpenJPA documentación .

Y aquí es cómo podría conseguir un contenedor administrado entidad gestora inyectado una SLSB (usando Transacciones gestionada por contenedor):

@Stateless
public class EmployeeServiceBean implements EmployeeService {
    @PersistenceContext(unitName="MyPu")
    private EntityManager em;

    public Employee createEmployee(int id, String name, long salary) {
        Employee emp = new Employee(id);
        emp.setName(name);
        emp.setSalary(salary);
        em.persist(emp);
        return emp;
    }
    ...    
}

Y eso es todo. El ciclo de vida del gestor de la entidad es gestionado por el contenedor transparente para la aplicación (sin createEM / cerrar) y participa el gestor de la entidad en la transacción JTA gestionado por el contenedor (comenzará no explícita / commit).

Como ya se ha insinuado, sólo estoy rascando la superficie, mi objetivo es de alguna manera para ponerlo en el camino correcto. Para ir más lejos, sugiero agarrando un libro (por ejemplo EJB3 en Acción). Mientras tanto, las referencias a continuación serían una buena lectura.

Referencias

    especificación
  • JPA 1.0
    • Sección 5.2.1 "Obtención de un Gerente de la Entidad en el entorno Java EE"
    • Sección 5.5 "Control de Transacciones"
    • "La persistencia de contenedores gestionados Contextos"
    • Sección 5.6
    • Sección 6.2.1.2 de "tipo de transacción"
    • Sección 6.2.1.4 "proveedor"
    • Sección 6.2.1.5 "JTA-Data-fuente, los no JTA-Data-fuente"

Recursos

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top