У меня есть веб-приложение, которое имеет странное поведение, и я не могу его понять. Суть моей проблемы заключается в непоследовательном поведении значений, возвращаемых моими конечными точками отдыха. Когда я запускаю свое приложение, мой запрос возвращает одни и те же значения каждый раз, когда я вызываю эту конечную точку. Когда я обновляю сущность, мой менеджер сущностей начинает вести себя странно. Теперь мой запрос начинает возвращать разные результаты. Один раз он возвращает старые значения вместо значений, которые есть в базе данных, или мой список результатов содержит прокси вместо объектов (смешанный).
Я проверил, что мои методы @transaction размещены правильно, и в моем стеке отладки я вижу перехватчик транзакций, а диспетчер сущностей создается для каждого запроса к серверной части (поэтому нет фильтра постоянства guice)
Я чувствую, что проблема заключается в контексте сеанса. У меня такое чувство (но я не могу его понять), что он повторно использует мой контекст сохранения по нескольким запросам.
Я собрал несколько фреймворков, чтобы все это работало. Я использую resteasy как реализатор jax-rs. guice (4.0beta4) в качестве средства реализации cdi и hibernate в качестве средства реализации jpa. Поскольку нам нужно использовать провайдера, когда мы внедряем менеджер сущностей (поскольку менеджер сущностей создается для каждой транзакции), я обернул это в EntityManagerProxy. Этот класс реализует интерфейс EntityManager и делегирует все методы в provider.get().method().
public class EntityManagerProxy implements EntityManager {
private final Provider<EntityManager> entityManagerProvider;
@Inject
public EntityManagerProxy(final Provider<EntityManager> entityManagerProvider) {
this.entityManagerProvider = entityManagerProvider;
}
private EntityManager getEntityManager() {
return entityManagerProvider.get();
}
@Override
public void persist(final Object entity) {
getEntityManager().persist(entity);
}
}
Мой модуль guice выглядит так
public class OptiWEEEModule extends ServletModule implements Module {
@Override
protected void configureServlets() {
super.configureServlets();
bind(EntityManagerProxy.class);
// JPA
install(new JpaPersistModule("myPU"));
}
}
Я знаю, что это расплывчатая проблема, но может ли кто-нибудь помочь мне в правильном направлении? На самом деле это не проблема, для которой я могу предоставить сообщение об ошибке.
редактировать: теперь я указал на проблему. С помощью профилировщика я посмотрел, что контекст сущности повторно используется guice. Это означает, что он не выполняет запрос каждый раз, а использует существующий диспетчер сущностей, который должен создаваться каждый раз при передаче аннотации @transactional.
@Transactional
заключается в том, что вы получаете новую транзакцию, а не новый EntityManager. Последний также может справиться с некоторыми из них. Вы не показываете часть обновления вашего прокси-сервера или веб-сервисов, поэтому трудно сказать, что на самом деле вызывает вашу проблему. - person mabi   schedule 07.05.2014