# JPA gleiche methode funktioniert an einer Stelle, an der anderen nicht



## derFabi95 (3. Mai 2021)

Hallo zusammen,

ich habe folgende Methode: 
[CODE lang="java" title="Teil der ClanPlayer.java"]
public void updateName(String newName) throws Exception {
        EntityManager em = EMUtils.getEntityManager();
        em.getTransaction().begin();
        ClanPlayer cp = em.merge(this);
        cp.setName(newName);
        em.getTransaction().commit();
        em.close();
}[/CODE]

Diese Methode rufe ich innerhalb der gleichen Klasse (andere Methode, static) wie folgt auf:

```
try {
        cp.updateName(name);
} catch (Exception ex) {
        ex.printStackTrace();
}
```
Das funktioniert auch einwandfrei.
Wenn ich nun mit dem gleichen try-catch-Block wie oben in einer anderen Klasse die Methode aufrufe, wird der Name nicht geändert.
Ich vermutete, dass es mit dem PersistenceContext zusammenhängt, weshalb ich in der updateName()-Methode den Merge gemacht habe.
Ohne den ging es in beiden Aufrufen nicht, mit dem geht es immerhin im Aufruf innerhalb einer Methode in der selben Klasse.

Hat da jemand eine Idee?


----------



## Oneixee5 (4. Mai 2021)

derFabi95 hat gesagt.:


> ClanPlayer cp = em.merge(this);
> cp.setName(newName);


Hier wird eine vermutlich eine andere Instanz von ClanPlayer erstellt und der Name darin und auch in der DB geändert. Die aktuelle Instanz bekommt davon aber nichts mit.
Generell ist der Code aber falsch. Im Falle eines Fehlers wird kein Rollback durchgeführt und die Methode mit einer offenen Transaktion verlassen. Das dürfte für undefinierbare Folgefehler sorgen.


----------



## derFabi95 (4. Mai 2021)

Oneixee5 hat gesagt.:


> Hier wird eine vermutlich eine andere Instanz von ClanPlayer erstellt und der Name darin und auch in der DB geändert. Die aktuelle Instanz bekommt davon aber nichts mit.
> Generell ist der Code aber falsch. Im Falle eines Fehlers wird kein Rollback durchgeführt und die Methode mit einer offenen Transaktion verlassen. Das dürfte für undefinierbare Folgefehler sorgen.


Hm, also in der Datenbank wird jedenfalls nichts gespeichert.
Auch ohne dem Merge geht es nicht.

Aber klar, ich sollte das mit einer try umwrappen und im catch entsprechend rollbacken. Danke für den Hinweis diesbezüglich.


----------



## derFabi95 (7. Mai 2021)

Okay, ich konnte es lösen: ich musste das cp-Objekt über den EntityManager refreshen.


----------

