EntityManager.contains — возвращает false в той же транзакции

Я изо всех сил пытаюсь понять, как работает метод 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.

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


person Stefano Cazzola    schedule 27.03.2016    source источник
comment
Были ли переопределены equals и hashcode для Band?   -  person Andrew Tobilko    schedule 27.03.2016
comment
@AndrewTobilko equals есть, hashCode нет   -  person Stefano Cazzola    schedule 27.03.2016
comment
@AndrewTobilko Я также пытался добавить реализацию hashCode (используя HashCodeBuilder Apache), но это не помогло.   -  person Stefano Cazzola    schedule 27.03.2016
comment
да, hashcode не решает проблему, это просто хороший стиль, чтобы переопределить их вместе   -  person Andrew Tobilko    schedule 27.03.2016
comment
похоже проблема не в управлении транзакциями, а в самом Arquillian. Если я удалю аннотацию @Transactional из метода BandDao.save, произойдет сбой, потому что в момент сохранения объекта транзакция не определена. Это означает, что я не выполняю методы persist и contains в одной и той же транзакции, я думаю.   -  person Stefano Cazzola    schedule 27.03.2016


Ответы (1)


В конце концов, проблема связана не с управлением транзакциями, а с самим Arquillian, который не управлял аннотацией @Transactional в тестовых классах.

См.: Тестирование классов сущностей jpa - требуется транзакция ошибки

person Stefano Cazzola    schedule 27.03.2016