2016-03-27 4 views
2

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 BandDaocontains 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?

+1

Haben 'equals' und' hashcode' für 'Band' außer Kraft gesetzt wurde? – Andrew

+0

@AndrewTobilko 'equals' ist,' hashCode' ist nicht –

+0

@AndrewTobilko Ich habe versucht, die 'hashCode'-Implementierung ebenfalls hinzuzufügen (mit' Apache's 'HashCodeBuilder'), aber es hat nicht gelöst. –

Antwort