繁体   English   中英

捕获LazyInitializationException并抛出IllegalStateException,这是一个好主意,怎么做?

[英]catch LazyInitializationException and throw IllegalStateException, is it a good idea and how to?

在使用Hibernate持久化实体的情况下,当开发人员遇到LazyInitializationException,... no session or session was closed时,我想给他们提供更多的线索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似乎很合适:

表示已在非法或不适当的时间调用了方法。 换句话说,对于所请求的操作,Java环境或Java应用程序没有处于适当的状态。

(来源: 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不是stacktrace,因此,您的捕获无法按预期工作。

当您“使用”列表(如对任何方法进行调用)时,会发生异常:例如,调用size()iterator()

因此,在您的getter中添加一个size()调用。

我建议吗? 没有。

  1. LazyInitException stacktrace已经为您提供了哪个字段未加载:只需查看引发该字段的集合以及它来自哪个字段即可。
  2. 您会失去延迟加载(我同意,如果您调用getter,则需要使用结果,但是,getter中这种无关的方法调用( size() )仍然是代码气味

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM