2016-03-27 2 views
2

Я пытаюсь понять, как работает метод EntityManager.contains, а другие ответы в SO не помогли мне.EntityManager.contains - возвращает false в той же транзакции

Это ситуация:

Я называю persist(enity) и contains(entity) в той же транзакции

@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)); 
} 

В BandDaocontains и save методы реализованы следующим образом

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); 
    } 
} 

Только save отмечен как @Transactional ; но, если я не ошибаюсь, транзакция должна распространяться от вызывающего.

Выполнение теста, он терпит неудачу, поскольку он ожидает true, но получает false.

Я выполняю эти тесты с помощью Arquillian в удаленном контейнере Wildfly 10. Все остальные тесты в пакете (сохраняющиеся, обновляющие, получающие объекты) преуспевают, единственное, что выходит из строя, - это метод contains.

Может ли кто-нибудь объяснить мне, что я делаю неправильно?

+1

У 'equals' и' 'hashcode' для Band' был переопределен? – Andrew

+0

@AndrewTobilko 'equals' is,' hashCode' is not –

+0

@AndrewTobilko Я также попытался добавить реализацию hashCode (используя 'Apache'' HashCodeBuilder'), но это не решило. –

ответ

Смежные вопросы