TransactionRequiredException bei Oracle

BLR

Erfahrenes Mitglied
#1
Hallo :)

ich habe bisher mit dem MySQL und Microsoft-SQL Datenbankmanagmentsystemen und dem EntityManager gearbeitet.
Nun habe ich das mal an einer einfachen Oracle Datenbank ausprobiert und festgestellt, dass
wenn ich mit dem EntityManager persistieren möchte, unbedingt den "UserTransaction" bemi "begin" und "comit" brauche. Lasse ich das aus, kann ich nicht sagen: "em.persist(Objekt)".

Das ganze verwundert mich, weil ich bei MySql und Microsoft-Sql noch nie "UserTransaction" verwendet habe.
Ist das Oracle-Spezifisch oder mache ich was falsch?
Mein Code ist einfach:
Java:
userTransaction.begin();
entityManager.persist(Objekt);
userTransaction.commit();
 

BLR

Erfahrenes Mitglied
#3
Ich benutze einen Glassfisch- Server.
Er hat eine Default-Datasource, die ich nicht mehr über @ressource(mappedBy="meineDataSource) injezieren muss.

In der Domain.xml steht folgendes:

Code:
<resources>
<jdbc-resource pool-name="MyPoolName" object-type="system-all" jndi-name="jdbc/__default"></jdbc-resource>

<jdbc-connection-pool datasource-classname="oracle.jdbc.pool.OracleDataSource" name="MyPoolName" res-type="javax.sql.ConnectionPoolDataSource">
  <property name="User" value="onlineshop"></property>
  <property name="URL" value="jdbc:oracle:thin:@//localhost:1521/xe"></property>
  <property name="Password" value="admin123"></property>
  </jdbc-connection-pool>
</resources>
oder wie meinst du das genau, wie die datasource aussieht?
 

BLR

Erfahrenes Mitglied
#4
Ich habe die Lösung gefunden, alledings verwundert mich diese etwas.
Wenn ich in einer BackingBean direkt persestiere, dann muss ich das so tun:
Java:
@RequestCsoped
@Named
class meineClasse{

       void meineMethode(){
               
            @Resource
            private UserTransaction ut;
            ut.begin();
            em.persist(object);
            ut.commit();


       }
}
Wenn ich aber die Methode "meineMethode" in eine @stateless Bean verschiebe,
dann benötige ich auch bei Oracle "UserTransaction" nicht.
Dann fliegt eine Exception. Ich kann direkt mit dem EntityManager persistieren.