JPA EntityManager возвращает старое состояние после обновления -> проблема с потокобезопасностью?JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 JPA EntityManager возвращает старое состояние после обновления -> проблема с потокобезопасностью?

Сообщение Anonymous »

Введение
В настоящее время я работаю над переносом приложения GWT-RPC на использование сервисов RESTful. Для этого я заменил все вызовы RPC на domino-rest и дополнительно обновил jersey1 на jersey2. Да, jersey1 уже был там для какой-то внешней связи. Теперь я перенес все вызовы RPC в REST и сначала подумал, что все работает отлично.
Для внедрения зависимостей я использую Guice 6, а после миграции на Jersey2 — HK2-Guice-bridge. Для сохранения нескольких моих БД я использую JPA/Hibernate. Для полноты картины: перед началом миграции на Jersey2 и domino-rest все работало.
Проблема
Каждый раз, когда я обновляю объект домена в базе данных , это работает идеально. Но когда я запрашиваю его снова с помощью запроса GET, я иногда (!) получаю старую версию (до обновления), а иногда и правильную обновленную версию. Я проверил весь стек вызовов и понял, что это не проблема с кэшированием GET. Проблема исходит из моего репозитория, точнее, из EntityManager, иногда возвращает старую версию.
Журнал jersey2 показал мне, что используются разные потоки, поэтому EntityManager не является потоковым. безопасно, я думал, в этом ли проблема. Я не уверен, или есть что-то еще. Если это проблема с потокобезопасностью, было бы неплохо, если бы вы помогли мне разобраться, в чем проблема.
Источники
Generic-Repository

Код: Выделить всё

public class Repository {

@Inject
private Provider emProvider;

private final Class entityType;

@Inject
public Repository(final Class entityType) {
this.entityType = entityType;
}

public EntityManager getEntityManager() {
return emProvider.get();
}

public T get(long id) {
return getEntityManager().find(entityType, id);
}

public T update(T o) {
EntityManager em = getEntityManager();
em.merge(o);
em.flush();
return o;
}

//other code omitted
}
Модуль сохраняемости (один из нескольких)

Код: Выделить всё

public class PersistenceModule extends PrivateModule {

private final String unitName;

public PersistenceModule(String unitName) {
this.unitName = unitName;
}

@Override
protected void configure() {
// I know setAutoBeginWorkOnEntityManagerCreation is not recommended, but for the time being.
install(new JpaPersistModule(unitName, JpaPersistOptions.builder().setAutoBeginWorkOnEntityManagerCreation(true).build()));
bind(PersistenceManager.class).asEagerSingleton();
expose(PersistenceManager.class);

// User
TypeLiteral userRepoType = new TypeLiteral() {
};
bind(userRepoType).toInstance(new Repository(User.class));
expose(userRepoType);
}
}
Диспетчер постоянства (один из нескольких)

Код: Выделить всё

@Singleton
public class PersistenceManager {

private final PersistService service;

@Inject
public PersistenceManager(PersistService service) {
this.service = service;
service.start();
}

public void stop() {
service.stop();
}
}
Заключительные слова
Моей точкой входа для веб-приложения является ApplicationConfig, расширяющий ResourceConfig, где Guice.createInjector< /code> с вышеупомянутым PersistenceModule. Затем инжектор подается на мост HK2-Guice. Надеюсь, у вас есть подсказка. Требуется ли что-то еще? Спасибо!

Подробнее здесь: https://stackoverflow.com/questions/791 ... fe-problem
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»