Я изо всех сил пытаюсь понять, как работает метод EntityManager.contains, и другие ответы в SO мне не помогли.
Это ситуация:
Я вызываю 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? - person Andrew Tobilko   schedule 27.03.2016equalsесть,hashCodeнет - person Stefano Cazzola   schedule 27.03.2016hashCode(используяHashCodeBuilderApache), но это не помогло. - person Stefano Cazzola   schedule 27.03.2016hashcodeне решает проблему, это просто хороший стиль, чтобы переопределить их вместе - person Andrew Tobilko   schedule 27.03.2016Arquillian. Если я удалю аннотацию@Transactionalиз методаBandDao.save, произойдет сбой, потому что в момент сохранения объекта транзакция не определена. Это означает, что я не выполняю методыpersistиcontainsв одной и той же транзакции, я думаю. - person Stefano Cazzola   schedule 27.03.2016