程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长


+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

StatelessSession 是否支持延迟加载?

发布于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
  • 我已经在 Hibernate 5.0.6 上测试过了。

解决方案


不,使用时没有持久化上下文(一级缓存)StatelessSession,因此懒加载机制不起作用,因为很多懒加载概念都是基于一级缓存的存在。

例如,如果您有 100 个实体实例都在多对一关联中引用同一个实体实例,您将延迟重新加载引用的实例 100 次(对于每个引用实例)。

此外,许多延迟加载策略将不起作用(例如,一旦访问未初始化的代理/集合,就在初始化多个代理/集合的地方进行批量初始化),因为 Hibernate 不会知道需要初始化的其他实例而不跟踪它们.

另一方面,StatelessSession不会急切地获取任何定义为惰性的东西,因为这可能导致在单个实体实例中获取大部分数据库。

解决方案是编写一个带有join fetch子句的查询来明确指定您需要加载的内容,或者您​​可以重新考虑使用经典Sessions 以从持久化上下文的所有优点中受益。



所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接:http://www.javaheidong.com/blog/article/286011/82544f69616644eaa3c7/

来源:java黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

16 0
收藏该文
已收藏

评论内容:(最多支持255个字符)