Hibernate-update mit EntityManager
Ich bin mit Hibernate 4.1.7 und versuchen, ein update-Objekt, aber es gibt keine Dokumentation, wie es getan werden sollte. Derzeit bin ich, dies zu tun:
Person person = personDao.getPersonById(1);
person.setAge(23);
person.setLastname("McName");
person = personDao.update(person);
PersonDao implementiert update sieht wie folgt aus:
public Person update(Person person) {
return entityManager.merge(person);
}
PersonDao implementiert getPersonById ist:
public Person getPersonById(int id) {
personQuery = entityManager.createNamedQuery("Person.findPerson", Person.class);
personQuery.setParameter("id", id);
return personQuery.getSingleResult();
}
Auch ich habe die benannte Abfrage, die innerhalb der Person-Klasse und ist hier:
@NamedQuery(name="Person.findPerson", query="SELECT p FROM Person p WHERE p.id = :id")
Mithilfe, dass meine Person nicht aktualisiert werden, wie soll ich das implementieren, die das update mit hibernate?
- Der obige code ist OK, außer dass der Aufruf
personDao.update()
ist völlig unnötig, wenn alles läuft in einer einzigen Transaktion: der Zustand einer Entität wird automatisch persistent durch JPA/Hibernate am Ende der Transaktion. Die getPersonById Methode könnte auch reduziert werden, umem.find(Person.class, id)
, das wäre einfacher und effizienter, da wäre es nicht auszuführen, die zu einer Abfrage, ob die Entität bereits geladen. - Nachtrag: das ist definitiv in der Dokumentation erläutert. Siehe docs.jboss.org/hibernate/orm/4.1/devguide/en-US/html_single/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zwei Szenarien könnten pop-up für Sie.
Vielleicht möchten Sie das ändern einer Eigenschaft des Objekts, und nur diese Eigenschaft.
Wenn dies der Fall ist, die Sie wollen, verwenden Sie die Methode: suchen, ändern, leeren, commit.
Den Sie verwenden möchten, können Sie die Objekte Eigenschaften, um das Element zu aktualisieren.
Wenn dies der Fall ist, die Sie wollen, verwenden Sie die Methode: zusammenfassen, ggf. ändern, flush, Begehen.
Hibernate und auch anderen JPA-Implementierungen automatisch den Status verwalten von Entitäten und speichern Sie es auf der Datenbank, wenn die änderung umschlossen, die in der Transaktion. Sie müssen nicht explizit nennen
merge
oderupdate
Methoden.Wenn Sie mit resource-local transactions (nicht verwaltet JTA transaction manager) probieren Sie etwas wie dieses:
und alle Ihre änderungen werden automatisch gespeichert in der Datenbank.
Wenn Sie mit JTA dann Sie haben, um die Transaktion Grenzen auf andere Weise, zum Beispiel durch die Verwendung von Spring AOP
@Transactional
annotation.Ich weiß nicht, was du fragst exakt, aber in Ihrer Methode
Person.getPersonById(int id)
, vereinfachen Sie Ihren code mit den folgenden: