我有一些@Async方法。作为此方法的参数,我传递了一些具有延迟加载的User实体的entity(Action)。我很少遇到问题,无法访问“用户角色”字段(我只能有一个角色)。我试图通过直接传递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:]
...