提问人:VaniCodes 提问时间:11/6/2023 更新时间:11/6/2023 访问量:30
为什么即使我有活动事务,我仍然收到 LazyInitializationException?
Why am I getting LazyInitializationException even when I have an active transaction?
问:
正如标题所述,当尝试从事件侦听器处理程序方法内部延迟加载关联实体时,我得到了臭名昭著的结果。调用方方法和被调用的方法都是 和 。此外,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。我曾经查看该方法是否确实在活动事务中执行,确实如此。在玩了一圈之后,我还了解到,在处理程序方法或服务体内部调用也会抛出 .@RestController
TransactionSynchronizationManager.isActualTransactionActive()
Hibernate.initialize(group.getAdmin())
LazyInitializationException
答: 暂无答案
下一个:从大目录中随机加载文件
评论