Question

Je suis nouveau à EJB 3 et l'Assemblée parlementaire paritaire.

J'ai créé une source de données dans le serveur d'applications qui est jdbc/AppDataSource. La valeur par défaut persistance fournisseur est laissée com.ibm.websphere.persistence.PersistenceProviderImpl. Et je suis parti le nom de la source de données JTA par défaut JNDI comme AppDataSource lui-même. Je suis en fait confus en ce qui concerne JTA et non JTA. Ce qui les différencie?

I a généré les entités et crée un objet EntityTransaction dans la fève. Lors de l'appel des méthodes de persist() et commit(), je reçois une erreur:

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.

Comment fonctionne openjpa vient en image ici?

A partir de maintenant, mon persistence.xml contient les noms de classe d'entité.

Comment puis-je faire utiliser les valeurs appserver par défaut pour la source de données. Ou bien comment puis-je fournir les détails du fournisseur JPA et DataSource détails dans le persistence.xml?

S'il vous plaît fournir à vos entrées.

Était-ce utile?

La solution

Cette question implique effectivement de nombreux concepts et je ne vais pas les couvrir tous dans les détails. Pour plus d'informations plus exhaustives, je vous suggère de lire l'ensemble Chapitre 5 - Entité gestionnaires et la persistance Contextes de la spécification JPA 1.0 (et les autres sections pertinentes mentionnées à la fin de cette réponse). Je vais plutôt essayer de décrire le scénario le plus commun dans un environnement Java EE.

Dans un environnement EJB, on utilise généralement:

  • gestionnaire d'entités gérées par le conteneur (doit être un gestionnaire d'entités JTA)
    • transaction scope Stateless Session Beans (SLSB)
    • étendu Stateful Session Beans (SFSB)
  • JTA la gestion des transactions (et non transactions de ressources locales à moins que cela est vraiment ce que vous voulez)

Voici comment un persistence.xml pour un gestionnaire d'entités JTA qui utilise une source de données avec un java:comp/env/jdbc/AppDataSource nom JNDI peut être mis en place, OpenJPA étant le fournisseur de persistance utilisé par 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>

Pour les propriétés OpenJPA, reportez-vous à la OpenJPA documentation .

Et voici comment une SLSB (en utilisant les transactions gérées par le conteneur) pourrait obtenir un conteneur géré Entity Manager injecté:

@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;
    }
    ...    
}

Et voilà tout. Le cycle de vie du gestionnaire d'entités est gérée par le conteneur de façon transparente pour l'application (pas createEM / fermer) et le gestionnaire d'entités participe à la transaction JTA gérée par le conteneur (pas explicite BEGIN / COMMIT).

Comme il a déjà laissé entendre, je gratter la surface, mon but est en quelque sorte de vous mettre sur la bonne voie. Pour aller plus loin, je vous suggère de saisir un livre (par exemple EJB3 en action). Pendant ce temps, les références ci-dessous serait une bonne lecture.

Références

  • spécification JPA 1.0
    • Section 5.2.1 "Obtenir un gestionnaire d'entité dans l'environnement Java EE"
    • Section 5.5 "Contrôle de Transactions"
    • Section 5.6 "persistance gérée par conteneur Contextes"
    • Section 6.2.1.2 "type de transaction"
    • Section 6.2.1.4 "fournisseur"
    • Section 6.2.1.5 "JTA-données source, non-JTA-data-source"

Ressources

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top