У меня есть метод @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:]
...