为什么即使我有活动事务,我仍然收到 LazyInitializationException?

Why am I getting LazyInitializationException even when I have an active transaction?

提问人:VaniCodes 提问时间:11/6/2023 更新时间:11/6/2023 访问量:30

问:

正如标题所述,当尝试从事件侦听器处理程序方法内部延迟加载关联实体时,我得到了臭名昭著的结果。调用方方法和被调用的方法都是 和 。此外,listener 方法是 。事件类和事件侦听器类如下:LazyInitializationException@Async@Transactional@TransactionalEventListener

public class MockEvent extends ApplicationEvent {
    private final User user;
    private final UserGroup group;
    public MockEvent(Object source, User user, UserGroup group) {
        super(source);
        this.user = user;
        this.group = group;
    }
   //GETTERS
}

@Component
public class MockEventListener {
    @Async
    @TransactionalEventListener(MockEvent.class)
    public void onApplicationEvent(@NonNull MockEvent event) {
        logger.error("Is transaction active: {}", TransactionSynchronizationManager.isActualTransactionActive()); //logs true
        User user = event.getUser();
        UserGroup group = event.getGroup();

        String inviter = group.getAdmin().getUsername(); //Throws LazyInitializationException on getAdmin()
    }
}

“用户”和“组”实体包括:

@Entity
@Table(name = "user_groups")
public class UserGroup {

//    OTHER PROPERTIES AND GETTERS/SETTERS

    @ManyToOne(optional = false, fetch = FetchType.LAZY)
    @JoinColumn(name = "admin_id")
    private User admin;

    public User getAdmin() {
        return admin;
    }
}

@Entity
@Table(name = "users")
public class User implements UserDetails {
     private final String username;

//    CONSTRUCTORS AND GETTERS/SETTERS
}

最后,发布事件的服务是:

@Service
public class MockService implements IMockService {
    @Override
    @Async
    @Transactional
    public void method1(UUID groupId, UUID userId) throws RuntimeException {
//        DOES STUFF (including calling join() on three other async CompletableFuture methods)
        eventPublisher.publishEvent(new OnInvitationCompleteEvent(this, user, group));
    }
}

如果重要,则从 .我正在使用 Spring Boot v3.1.3。我也在使用spring-data-jpa。我曾经查看该方法是否确实在活动事务中执行,确实如此。在玩了一圈之后,我还了解到,在处理程序方法或服务体内部调用也会抛出 .@RestControllerTransactionSynchronizationManager.isActualTransactionActive()Hibernate.initialize(group.getAdmin())LazyInitializationException

java 休眠 spring-data-jpa 延迟加载

评论


答: 暂无答案