我有一个 User 类,其中包含延迟加载对象的集合。
class User {
@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@Getter
@Column(nullable = false)
private List<Wallet> wallets= new ArrayList<>();
}
现在我还有一个 Transaction 类,其中包含对用户钱包的引用。
class Transaction {
@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name = "senderWallet", referencedColumnName = "id")
private Wallet senderWallet;
}
现在我创建了一个服务,该服务应该为给定用户获取交易:
@Transactional
public List<Transaction> getTransactionsForUser(User user) {
List<Wallet> wallets = user.getWallets();
List<Transaction> transactions = new ArrayList<>();
for (Wallet wallet : wallets) {
transactions.addAll(transactionRepository.findBySenderWallet(wallet));
}
return transactions;
}
在 Controller 中,我像这样获取当前登录的用户:
User user = ((UserPrincipal) authentication.getPrincipal()).getUser();
然后,我调用该服务:
List<Transaction> transactions = transactionService.getTransactionsForUser(user);
这会引发 LazyInitializationException。这里有什么解决方法吗?
最佳答案
1) 我认为您的 @OneToMany
应该定义 mappedBy
:
@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy="user")
@Getter
@Column(nullable = false)
private List<Wallet> wallets= new ArrayList<>();
2) 您正在传递一个实体 User
,该实体已在不同的事务上下文中获取,该上下文现在似乎已关闭。
在服务方法中,您应该在继续之前对该实体执行合并。 Srping Data Jpa save
方法已实现合并,因此调用就足够了:
@Transactional
public List<Transaction> getTransactionsForUser(User user) {
userRepository.save(user); // Add this <---
List<Wallet> wallets = user.getWallets();
List<Transaction> transactions = new ArrayList<>();
for (Wallet wallet : wallets) {
transactions.addAll(transactionRepository.findBySenderWallet(wallet));
}
return transactions;
}
关于java - 访问用户上的 LAZY 集合时出现 LazyInitializationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56622599/