Я пытаюсь понять, как работает метод 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));
}
В BandDao
contains
и 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
.
Может ли кто-нибудь объяснить мне, что я делаю неправильно?
У 'equals' и' 'hashcode' для Band' был переопределен? – Andrew
@AndrewTobilko 'equals' is,' hashCode' is not –
@AndrewTobilko Я также попытался добавить реализацию hashCode (используя 'Apache'' HashCodeBuilder'), но это не решило. –