java - 访问用户上的 LAZY 集合时出现 LazyInitializationException

标签 java spring hibernate spring-boot jpa

我有一个 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/

相关文章:

java - 输出时出现数字格式异常错误

java - 每次在eclipse中运行项目之前如何编译java文件

java - 映射一组枚举 - Hibernate

java - 在Spring Boot的Tomcat和Angular App上部署WAR文件

json - Spring @ResponseBody 返回 JSON,但缺少键

java - 获取属性中列表的大小

Java RMI、Tomcat问题!

java - Spring:可以有两个上下文——Web 和后端吗?

java - 列表内列表的 ValidatorUtils

java.lang.IllegalArgumentException : org. hibernate.QueryException : No data type for node: org. hibernate.hql.internal.ast.tree.MethodNode