gpt4 book ai didi

java - 捕获 LazyInitializationException 并抛出 IllegalStateException,这是一个好主意吗?如何做?

转载 作者:行者123 更新时间:2023-11-29 04:43:15 25 4
gpt4 key购买 nike

在使用 Hibernate 的持久实体上下文中,我想在开发人员收到 LazyInitializationException,... no session or session was closed 时为他们提供更多线索。

我考虑过在延迟加载的字段 getter 中捕获它,然后抛出一个带有新消息的 IllegalStateException :

@OneToMany(mappedBy = "whatever", fetch = FetchType.LAZY, cascade = { CascadeType.MERGE, CascadeType.PERSIST })
@JoinColumn(name = "USER_ID")
private List<User> userList = new ArrayList<User>();

public List<User> getUserList() {
try {
List<User> userList = this.userList;
return userList ;
} catch (LazyInitializationException e) {
throw new IllegalStateException("Here I explain everything", e);
}
}

IllegalStateException 似乎非常适合:

Signals that a method has been invoked at an illegal or inappropriate time. In other words, the Java environment or Java application is not in an appropriate state for the requested operation.

(来源:https://docs.oracle.com/javase/7/docs/api/java/lang/IllegalStateException.html)

但是没有达到目标,你知道为什么吗?顺便问一下,这是个好主意吗?

最佳答案

没有达到目标,因为在 getter 中,您在 List 上所做的并不比标准 getter 做的更多。

List<User> userList = this.userList;
return userList ;

严格等同于:

return this.userList;

相同的代码,相同的行为。

如果您查看 LazyInitException 的堆栈,您会发现 getter 不是堆栈跟踪,因此,您的 catch 没有按预期工作。

当您“使用”(就像调用任何方法一样)列表时会发生异常:例如调用 size()iterator()

所以在你的 getter 中添加一个 size() 调用。

我建议吗?没有。

  1. LazyInitException 堆栈跟踪已经为您提供了哪个字段未加载:只需查看抛出它的集合,以及它来自哪个字段。
  2. 你失去了延迟加载(我同意如果你调用 getter,你会想要使用结果,但是 getter 中这个不相关的方法调用(size())仍然是一个代码味道

关于java - 捕获 LazyInitializationException 并抛出 IllegalStateException,这是一个好主意吗?如何做?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38324012/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com