Wird beim Aufruf von EntityManager.merge () nicht gesetzt

9

Ich habe eine einfache OneToMany Verbindung zwischen 2 Objekt Parent & amp; Kind wie unten gezeigt.

Eltern Entität

%Vor%

Kind Entität

%Vor%

Nachstehend ist mein Test, der ein vorhandenes Elternelement lädt, ein Kind hinzufügt und EntityManager.merge () für das Elternobjekt aufruft.

%Vor%

Die Assertion, bei der der Primärschlüssel der ID getestet wird, schlägt fehl. Ich sehe, dass der Datensatz korrekt in die Datenbank eingefügt wird und der Primärschlüssel automatisch zugewiesen wird.

Alle meine DAO-Aufrufe werden um eine Transaktion mit Propagierung als Erforderlich gewickelt.

    
Rakesh 01.06.2011, 07:46
quelle

2 Antworten

13

EntityManager.merge(..) ruft eine Instanz ab und gibt eine Instanz zurück, die verwaltet wird. Und im Falle von vorübergehenden Instanzen wird eine neue Instanz zurückgegeben (das Original wird nicht geändert)

Also sollte Ihre mergeEntity(..) Methode return em.merge(entity)

sein     
Bozho 01.06.2011, 07:58
quelle
0

Da Ihre ID von der Datenbank festgelegt wird, kann JPA / Hibernate diese nur festlegen, nachdem die SQL-Anweisung an die Datenbank gesendet wurde. Wenn Sie Hibernate so konfigurieren, dass die sql-Anweisung angezeigt oder das Protokoll in DEBUG geändert wird, sehen Sie wahrscheinlich, dass beim Aufruf von mergeEntity keine SQL-Anweisung ausgegeben wird.

Eine Möglichkeit, Ihren Test zu optimieren, sollte darin bestehen, em.flush () hinzuzufügen, bevor Sie die Assertion für die Child-ID ausführen.

Möglicherweise gibt es ein Problem bei der Verwaltung der Transaktion, aber Sie müssen den Code des DAO und die Art und Weise, wie Sie in Ihrem Komponententest einen Verweis auf das DAO erhalten, anzeigen.

    
gabuzo 01.06.2011 07:55
quelle

Tags und Links