# JPA: Problem mit Update von Daten



## SamHotte (30. Sep 2011)

Moin Forum,

meine Frage ist leider so allgemein, dass ich bei der mir dazu einfallenden Suche per Google und auch hier im Forum keine sinnvollen Treffer bekomme. Das Problem ist einfach:

Ich versuche, mir JPA mit Eclipselink beizubringen, und habe mir dafür eine kleine Film-Datenbank (a la imdb) mit drei zu persistierenden Klassen ausgedacht. Die Hälfte von CRUD habe ich schon, nämlich create und read - was mir aber fehlt und was ich leider, da vllt. zu trivial, nirgends finde, ist: wie mache ich update und delete?

Mein Versuch des Update sieht so aus, scheitert aber leider:

```
Query q = entityManager.createQuery("UPDATE Role r "
	+ "SET r.name=:name, r.movie=:movie, r.actor=:actor "
	+ "WHERE r.id = :id");
q.setParameter("name", role.getName());
q.setParameter("movie", role.getMovie());
q.setParameter("actor", role.getActor());
q.setParameter("id", role.getId());
entityManager.getTransaction().begin();
int updateCount = q.executeUpdate();
entityManager.getTransaction().commit();
return updateCount == 1;
```

Ideen?


----------



## ARadauer (30. Sep 2011)

entityManager.getTransaction().begin();
Objekt laden
Object ändern
entityManager.getTransaction().commit();

das sollte reichen.

Ich mach eigentlich kein update. Ich änderer eine persistente Entität und nach dem commit wird die Änderung von Hibernate in die db geschrieben


----------



## AFlieger (30. Sep 2011)

Hier bitte schön:


```
public boolean updateUser(User user) {
  EntityManager em = getEntityManager();
  try{
    em.getTransaction().begin();
    User userx = em.find(User.class, user.getUserId());
    userx.setUserName(user.getUserName()); 
    userx.setPasswd(user.getPasswd());
    userx.setEmailAddress(user.getEmailAddress());
    em.getTransaction().commit();
  } finally {
    em.close();
    return false;
  }
}
```

Ah ja, ich habs übrigens problemlos ergoogeld. :lol:


----------



## SamHotte (30. Sep 2011)

Wie lädst Du das Objekt gezielt? Das ist, glaube ich, mein Hauptproblem - ich bekomme bei SELECT über die id keine results ... dass folgende gibt eine "NoResultException":

```
Query q = entityManager.createQuery("SELECT r FROM Role r WHERE r.id = :id");
q.setParameter("id", role.getId());
LOGGER.debug("Query: " + q.toString());
Role r = (Role) q.getSingleResult();
```


----------



## SamHotte (30. Sep 2011)

AFlieger hat gesagt.:


> Hier bitte schön:
> 
> 
> ```
> ...




Danke - den korrekten zweiten Parameter von em.find() habe ich gebraucht, daran lag es. Wer googeln kann, ist klar im Vorteil


----------



## maki (30. Sep 2011)

Hm.. ob diese "Lösung" so toll ist... wozu gibt es eigentlich Entitymanager.merge?

Sowas gehört zu den Grundlagen, einfach so googeln mag zwar zu einer "Lösung" führen, aber ob die wirklich praxistauglich ist?

Was, wenn das User Objekt aus weiteren Objekten zusammengesetzt ist?
Alle Werte setzen?
Das kann der EM auch selber


----------



## SamHotte (5. Okt 2011)

maki hat gesagt.:


> Hm.. ob diese "Lösung" so toll ist... wozu gibt es eigentlich Entitymanager.merge?
> 
> Sowas gehört zu den Grundlagen, einfach so googeln mag zwar zu einer "Lösung" führen, aber ob die wirklich praxistauglich ist?
> 
> ...



Die Bemerkung verstehe ich jetzt nicht wirklich - wo müsste das EntityManager.merge denn hin? Das Javadoc dazu ist nicht wirklich aussagekräftig, irgendwann muss ich ihm doch sagen, welche neuen Werte in den Attributen zu speichern sind? *brettvorkopf*


----------



## maki (5. Okt 2011)

Lies dir doch mal ein buch zu JPA durch, JavaDoc und Google reichen nicht für so ein komplexes Thema, wenn man dem EM immer erst sagen müsste welche Attributwerte er updaten/speichern soll, wäre das sehr sehr umständlich und würde denn Sinn von ORM ad absurdum führen...

Kurz & bündig, das hier:

```
public boolean updateUser(User user) {
  EntityManager em = getEntityManager();
  try{
    em.getTransaction().begin();
    User userx = em.find(User.class, user.getUserId());
    userx.setUserName(user.getUserName()); 
    userx.setPasswd(user.getPasswd());
    userx.setEmailAddress(user.getEmailAddress());
    em.getTransaction().commit();
  } finally {
    em.close();
    return false;
  }
}
```
.. ist vollkommener Quatsch 

Ist wie immer nicht böse gemeint, aber wenn man jemanden mit einem Brett vorm Kopf rumlaufen sieht, sollte man ihm das sagen dürfen 

Wie gesagt, ist alles zu komplex um alles in einem Forum im Detail zu erläutern(konkrete Fragen sind etwas anderes), oder mal schnell die Antwort per Google zu finden, oder nur über die JavaDoc zu verstehen.


----------

