Frage

Ich bin neu in EJB 3 und der JPA.

Ich habe eine Datenquelle in den appserver geschaffen, die jdbc/AppDataSource ist. Die Standard-Persistenz-Provider als com.ibm.websphere.persistence.PersistenceProviderImpl links. Und ich verließ den Standard jta Datenquelle JNDI-Namen als AppDataSource selbst. Ich bin in Bezug auf JTA tatsächlich verwirrt und nicht-JTA. Was unterscheidet sie?

erzeugen ich die Entitäten und erstellt ein EntityTransaction Objekt in der Bohne. Nach dem Aufruf der persist() und commit() Methoden, erhalte ich eine Fehlermeldung:

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.

Wie funktioniert openjpa kommt ins Bild hier?

Ab jetzt mein persistence.xml enthält die Einheit Klassennamen nur.

Wie kann ich es die Standard appserver Werte für Datenquelle zu machen. Oder aber wie kann ich die Details JPA-Provider bieten und Datasource Details im persistence.xml?

Bitte geben Sie Ihre Eingaben.

War es hilfreich?

Lösung

Diese Frage beinhaltet tatsächlich viele Konzepte und ich werde sie nicht alle im Detail abdecken. Umfassendere Informationen empfiehlt das Lesen ich das ganze Kapitel 5 - Entity Manager und Persistenzkontexte der PPV-1.0-Spezifikation (und die anderen relevanten Abschnitte am Ende dieser Antwort erwähnt). Ich werde eher versuchen, das gängigste Szenario in einer Java EE-Umgebung zu beschreiben.

Im Rahmen einer EJB-Umgebung würde man normalerweise verwenden:

  • A Container verwaltete Einheit Manager (muss ein JTA EntityManager sein)
    • transaktions scoped in Stateless Session Beans (SLSB)
    • erweitert in Stateful Session Beans (SFSB)
  • JTA Transaction Management (und nicht ressourcen lokale Transaktionen es sei denn, dies ist wirklich , was Sie wollen)

Hier ist, wie ein persistence.xml für einen JTA Entität-Manager, der eine Datenquelle mit einem JNDI-Namen java:comp/env/jdbc/AppDataSource verwendet, kann eingestellt werden, OpenJPA die Persistenz-Provider von WebSphere verwendet:

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

Für die OpenJPA Eigenschaften finden Sie in der OpenJPA Dokumentation .

Und hier ist wie ein SLSB (mit Container Managed Transaktionen) ein Container Entity Manager verwaltet injiziert bekommen konnte:

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

Und das ist alles. Der Lebenszyklus des Unternehmens-Manager wird durch den Behälter transparent für die Anwendung (kein createEM / Schließen) und die Einheit-Manager beteiligt sich an der JTA Transaktion durch den Behälter (keine explizite begin / commit).

managed

Wie bereits angedeutet, ich kratzen nur an der Oberfläche, mein Ziel ist es irgendwie Sie auf dem richtigen Weg zu bringen. Um weiter zu gehen, schlage ich vor, packte ein Buch (z EJB3 in Aktion). Inzwischen unter den Referenzen eine gute Lektüre sein würden.

Referenzen

  • JPA 1.0-Spezifikation
    • Abschnitt 5.2.1 "Abrufen eines Entity-Manager in der Java EE-Umgebung"
    • Abschnitt 5.5 "Steuern Transaktionen"
    • Abschnitt 5.6 "Container-Managed Persistence Contexts"
    • Abschnitt 6.2.1.2 "Transaktionstyp"
    • Abschnitt 6.2.1.4 "Anbieter"
    • Abschnitt 6.2.1.5 "jta-Daten-Quelle, nicht-jta-data-source"

Ressourcen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top