发布于2021-09-17 12:30 阅读(1109) 评论(0) 点赞(16) 收藏(4)
考虑来自“Java Persistence with Hibernate”的数据模型,其中 a 与Bid
有一个惰性关联Item
:
@ManyToOne(optional = false, fetch = FetchType.LAZY) // NOT NULL
@JoinColumn(name = "ITEM_ID") // Actually the default name
protected Item item;
然后尝试Bid
通过 a加载 aStatelessSession
然后访问相关联的以下代码段Item
:
Bid bid = (Bid) statelessSession.get(Bid.class, bidId);
assertNotNull(bid.getItem());
assertEquals(bid.getItem().getName(), "Bike");
LazyInitializationException
即使会话仍然处于活动状态,这也会抛出。我们可以从这里推断不支持延迟加载StatelessSession
吗?
org.hibernate.LazyInitializationException: could not initialize proxy - the owning Session is disconnected
at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:154)
at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:266)
at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:68)
at org.jpwh.model.simple.Item_$$_jvst6d3_0.getName(Item_$$_jvst6d3_0.java)
at org.jpwh.test.stateless.CrudWithAssociations.lambda$fetchLazyAssociationForStackOverflow$6(CrudWithAssociations.java:94)
at org.jpwh.test.stateless.CrudWithAssociations$$Lambda$2/310350177.call(Unknown Source)
at org.jpwh.env.StatelessSessionTest.transaction(StatelessSessionTest.java:21)
at org.jpwh.test.stateless.CrudWithAssociations.fetchLazyAssociationForStackOverflow(CrudWithAssociations.java:90)
笔记:
FetchType.EAGER
不,使用时没有持久化上下文(一级缓存)StatelessSession
,因此懒加载机制不起作用,因为很多懒加载概念都是基于一级缓存的存在。
例如,如果您有 100 个实体实例都在多对一关联中引用同一个实体实例,您将延迟重新加载引用的实例 100 次(对于每个引用实例)。
此外,许多延迟加载策略将不起作用(例如,一旦访问未初始化的代理/集合,就在初始化多个代理/集合的地方进行批量初始化),因为 Hibernate 不会知道需要初始化的其他实例而不跟踪它们.
另一方面,StatelessSession
不会急切地获取任何定义为惰性的东西,因为这可能导致在单个实体实例中获取大部分数据库。
解决方案是编写一个带有join fetch
子句的查询来明确指定您需要加载的内容,或者您可以重新考虑使用经典Session
s 以从持久化上下文的所有优点中受益。
作者:黑洞官方问答小能手
链接:http://www.javaheidong.com/blog/article/286011/82544f69616644eaa3c7/
来源:java黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 java黑洞网 All Rights Reserved 版权所有,并保留所有权利。京ICP备18063182号-2
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!