5 Stimmen

IBM Websphere JPA-Konfiguration - Aktualisierung von persistence.xml

Ich bin neu bei EJB 3 und der JPA.

Ich habe eine Datenquelle im Appserver erstellt, die lautet jdbc/AppDataSource . Der Standard-Persistenzanbieter wird als com.ibm.websphere.persistence.PersistenceProviderImpl . Und ich habe den JNDI-Namen der Standard-Jta-Datenquelle als AppDataSource selbst. Ich bin wirklich verwirrt, was JTA und Nicht-JTA betrifft. Wodurch unterscheiden sie sich?

Ich habe die Entitäten generiert und eine EntityTransaction Objekt in der Bohne. Beim Aufruf der persist() y commit() Methoden, erhalte ich einen Fehler:

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 kommt openjpa hier ins Spiel?

Ab sofort ist mein persistence.xml enthält nur die Namen der Entitätsklassen.

Wie kann ich erreichen, dass die Standardwerte des Appserver für die Datenquelle verwendet werden? Oder wie kann ich die Details des JPA-Anbieters und die Datenquellendetails in der persistence.xml ?

Bitte geben Sie Ihren Input.

6voto

Pascal Thivent Punkte 548176

Diese Frage beinhaltet viele Konzepte, die ich nicht alle im Detail behandeln werde. Für erschöpfende Details empfehle ich die Lektüre des gesamten Kapitel 5 - Entity-Manager und Persistenzkontexte der JPA 1.0-Spezifikation (und den anderen relevanten Abschnitten, die am Ende dieser Antwort erwähnt werden). Ich werde vielmehr versuchen, das am häufigsten vorkommende Szenario in einer Java EE-Umgebung zu beschreiben.

In einer EJB-Umgebung würde man normalerweise verwenden:

  • A Container-verwalteter Entitätsmanager (muss ein JTA Entity Manager sein)
    • transaktionsabhängig in zustandslosen Sitzungsbohnen (SLSB)
    • erweitert in Stateful Session Beans (SFSB)
  • JTA-Transaktionsmanagement (und nicht ressourcengebundene Transaktionen es sei denn, dies ist まったくもって was Sie wollen)

So wird ein persistence.xml für einen JTA-Entity-Manager, der eine Datenquelle mit einem JNDI-Namen verwendet java:comp/env/jdbc/AppDataSource eingerichtet werden, wobei OpenJPA der von WebSphere verwendete Persistenzanbieter ist:

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

Die OpenJPA-Eigenschaften finden Sie in der OpenJPA Dokumentation .

Und hier ist, wie ein SLSB (unter Verwendung von Container Managed Transactions) einen Container Managed Entity Manager injiziert bekommen könnte:

@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 Entitätsmanagers wird vom Container transparent für die Anwendung verwaltet (kein createEM/close) und der Entitätsmanager nimmt an der vom Container verwalteten JTA-Transaktion teil (kein explizites begin/commit).

Wie bereits angedeutet, kratze ich nur an der Oberfläche, mein Ziel ist es, Sie irgendwie auf den richtigen Weg zu bringen. Um weiter zu kommen, empfehle ich ein Buch (z.B. EJB3 in Action). In der Zwischenzeit sind die unten aufgeführten Referenzen eine gute Lektüre.

Referenzen

  • JPA 1.0-Spezifikation
    • Abschnitt 5.2.1 "Beziehen eines Entitätsmanagers in der Java EE-Umgebung"
    • Abschnitt 5.5 "Beherrschende Geschäftsvorfälle"
    • Abschnitt 5.6 "Container-verwaltete Persistenzkontexte"
    • Abschnitt 6.2.1.2 "Transaktionsart"
    • Abschnitt 6.2.1.4 "Anbieter"
    • Abschnitt 6.2.1.5 "jta-data-source, non-jta-data-source"

Ressourcen

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X