@ Async и странное состояние гонки транзакций - PullRequest
0 голосов
/ 07 ноября 2019

У меня есть метод @Async. В качестве параметра к этому методу я передаю некоторую сущность (Action), которая имеет лениво загруженную сущность User. Я редко сталкиваюсь с проблемой, когда я не могу получить доступ к полю роли пользователя (у меня может быть только одна роль). Я попытался решить это, передавая непосредственно объект User. Все еще иногда это не работает. Я предполагаю, что это потому, что сущность является просто прокси, который иногда нарушается, если что-то происходит с базовым сеансом / транзакцией.

Я понимаю, что транзакции не передаются в метод @Async. Так как же так, что иногда сущность User инициализируется (имеет роль), а иногда нет. Я попытался приостановить метод @Async и дать основному потоку завершиться, чтобы транзакция была закрыта, и я постоянно получал ошибку. Этого не произошло.

Почему? Я действительно с подозрением отношусь к @LastModifiedBy, используемому для сущности, которая, вероятно, совершает какое-то волшебство.

В любом случае, решение заключается в том, чтобы сделать транзакцию @Async,но я немного нервничаю из-за того, что не могу смоделировать эту ошибку и, следовательно, позже проверить, была ли она исправлена ​​правильно.

@Entity
@Table(name = "ACTION")
public class Action {
 ...
 @LastModifiedBy
 @ManyToOne(optional = false, fetch = FetchType.LAZY)
 @JoinColumn(name="modified_by_user_id")
 private User modifiedBy;

и метод

  @Async
  public void async(User modifiedBy) {
    modifiedBy.getRole(); //sometimes fails

В настоящее время при передаче напрямуюпользователь у меня

 java.lang.InternalError: Marking a ResultSet inactive that we did not know was opened!
    ...
    at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:156) [hibernate-core-5.1.0.Final.jar:5.1.0.Final]
    at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:260) [hibernate-core-5.1.0.Final.jar:5.1.0.Final]
    at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:68) [hibernate-core-5.1.0.Final.jar:5.1.0.Final]
    at model.entity.User_$$_jvst33f_8.getRole(User_$$_jvst33f_8.java) [classes:]
    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...