Ich habe Mühe zu verstehen, wie die EntityManager.contains
Methode funktioniert, und andere Antworten in SO hat mir nicht geholfen.EntityManager.contains - gibt in derselben Transaktion false zurück
Dies ist die Situation:
I persist(enity)
und contains(entity)
in derselben Transaktion
@Test
@Transactional(value = TxType.REQUIRED)
public void testContains() {
Band band = new Band();
// populating band...
// bandDao is an `@Inject`ed in the class
bandDao.save(band);
assertThat(bandDao.contains(band), is(true));
}
Die BandDao
contains
und save
Methoden implementiert nennen als
public class BandDao {
@PersistenceContext
EntityManager em;
...
@Transactional(value = TxType.REQUIRED)
public void save(Band band) {
em.persist(band);
}
public boolean contains(Band band) {
return em.contains(band);
}
}
folgt nur save
markiert als @Transactional
; aber wenn ich es nicht falsch verstanden habe, sollte die Transaktion vom Aufrufer propagiert werden.
Der Test wird ausgeführt, es schlägt fehl, da es eine true
erwartet, aber es empfängt eine false
.
Ich führe diese Tests mit Arquillian
in einem Wildfly 10
Remote-Container durch. Alle anderen Tests in der Suite (persistierende, aktualisierende und aufrufende Entitäten) sind erfolgreich. Der einzige Fehler, der fehlschlägt, ist der über die Methode contains
.
Kann mir jemand erklären, was ich falsch mache?
Haben 'equals' und' hashcode' für 'Band' außer Kraft gesetzt wurde? – Andrew
@AndrewTobilko 'equals' ist,' hashCode' ist nicht –
@AndrewTobilko Ich habe versucht, die 'hashCode'-Implementierung ebenfalls hinzuzufügen (mit' Apache's 'HashCodeBuilder'), aber es hat nicht gelöst. –