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