java – 带有Spring代理的LazyCollectionOption.EXTRA?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 带有Spring代理的LazyCollectionOption.EXTRA?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2086字,纯文字阅读大概需要3分钟。
内容图文
![java – 带有Spring代理的LazyCollectionOption.EXTRA?](/upload/InfoBanner/zyjiaocheng/724/274e9e9f0c0042858f40e1f515cb6de3.jpg)
我想显示一个包含数据库所有用户的表.该表还应包含用户对象中包含的列表的元素数.
由于我只需要大小/数量,我想阻止获取整个列表.因此,我正在使用LazyCollectionOption.EXTRA,文档说明:
EXTRA = .size() and .contains() won’t initialize the whole collection
但以下情况仍无效:
@Entity
class User {
@OneToMany
@LazyCollection(LazyCollectionOption.EXTRA)
List<Transaction> transactions;
}
当我调用user.getTransactions().size()时,结果是:
Caused by: org.hibernate.LazyInitializationException: failed to lazily
initialize a collection of role: User.transactions, could not
initialize proxy – no Session at
org.hibernate.collection.internal.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:575)
at
org.hibernate.collection.internal.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:214)
at
org.hibernate.collection.internal.AbstractPersistentCollection.readSize(AbstractPersistentCollection.java:155)
at
org.hibernate.collection.internal.PersistentBag.size(PersistentBag.java:278)
解决方法:
我不认为这是:
@LazyCollection(LazyCollectionOption.EXTRA)
这会给你带来麻烦.
我认为您正在获取Hibernate会话中的“用户”列表,该列表在您想要访问用户的事务之前关闭.
这是LazyInitializationException的典型场景,因为在仍打开Session时尚未初始化嵌套集合.
获取所有用户及其所有交易将获得笛卡尔积,这会导致性能问题.
我认为获得用户列表很好,并使用子选择提取来检索事务:
@OneToMany
@Fetch(FetchMode.SUBSELECT)
List<Transaction> transactions;
这将再发出一个select以在需要时获取所有未初始化的事务.这将要求您访问至少一个当前附加的用户事务,以触发所有未初始化的当前附加事务的额外提取.
否则您可以使用批量提取:
@OneToMany
@BatchSize(size = 50)
List<Transaction> transactions;
同样,这需要一个打开的会话,并且在请求某个User.transactions时,所有用户关联的事务将以50个批次进行初始化.
但由于@BatchSize仅为集合设置,而不是@Entity级别,这意味着在最好的情况下,您仍然需要N个额外查询N当前连接的用户.如果每个用户有超过50个交易,您将需要超过N个查询.这可能比子选择提取更糟糕,这只需要一个查询(the original query is rerun using a sub-select to fetch all query related Users’ transactions).
内容总结
以上是互联网集市为您收集整理的java – 带有Spring代理的LazyCollectionOption.EXTRA?全部内容,希望文章能够帮你解决java – 带有Spring代理的LazyCollectionOption.EXTRA?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。