2013-11-02 9 views
6

Ich möchte eine nicht verwaltete Entität in einem anderen Persistenzkontext verwaltet werden. Ich habe gelesen, dass dies mit merge vorgenommen werden:jpa merge unmanaged entity

em.merge(user); 

Aber wenn ich dies tun es nicht auf den Kontext hinzugefügt:

boolean isManaged = em.contains(user); 

immer falsch ist.

Auch wenn ich folgendes machen:

User dbuser = em.find(User.class, user.getId()); 
em.merge(user); 
boolean isManaged = em.contains(user); 

Die dbuser und Anwender sind genau die gleichen.

Was mache ich falsch?

Ich bin mit JPA, MySql DB, JBoss EAP 6.1

+3

Haben Sie eine Transaktion begonnen und abgeschlossen? Tun Sie das weiter: 'dbuser = em.merge (user);' – Sam

+0

Kann ich eine Transaktion mit JPA starten (ohne Spring usw. oder nativen Hibernate)? Ich benutze einfach @TransactionManagement (TransactionManagementType.CONTAINER) – Dave

+0

Man könnte das Transaktionsobjekt mit 'em.getTransaction()' zum Aufruf von '.begin()', '.commit()', '.rollback()' bekommen. Dies ist jedoch möglicherweise nicht notwendig oder sogar unmöglich (wenn Sie einen JTA EntityManager verwenden) in Ihrer Konfiguration. – Sam

Antwort

0

Anruf entityManager.flush() Ihre merge Aktion in die Datenbank zu übernehmen.

Normalerweise ist das Commit verzögert. Zum Beispiel, wenn Ihre Methode eine @TransactionAttribute Annotation hat. Die Transaktion wird nach Abschluss der Methode ausgeführt. Aber wenn Sie em.contains(user) ohne ein Commit aufrufen, erhalten Sie nur den alten Zustand.