JPA: Problem mit Update von Daten

SamHotte

Top Contributor
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:
Java:
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?
 
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
 
Hier bitte schön:

Java:
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:😀
 
Zuletzt bearbeitet:
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":
Java:
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();
 
Hier bitte schön:

Java:
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:😀


Danke - den korrekten zweiten Parameter von em.find() habe ich gebraucht, daran lag es. Wer googeln kann, ist klar im Vorteil
 
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 😉
 
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 😉

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*
 
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:
Java:
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.
 

Neue Themen


Zurück
Oben