StatelessSession是否支持延迟加载?

Bog*_*mac 2 java hibernate

考虑来自"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;
Run Code Online (Sandbox Code Playgroud)

然后下面的代码片段试图Bid通过a 加载StatelessSession然后访问关联的Item:

        Bid bid = (Bid) statelessSession.get(Bid.class, bidId);
        assertNotNull(bid.getItem());
        assertEquals(bid.getItem().getName(), "Bike");
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

笔记:

  • 如果我将关联更改为,则代码可以正常工作 FetchType.EAGER
  • 我在Hibernate 5.0.6上测试了这个.

Dra*_*vic 6

不,当你使用时没有持久化上下文(第一级缓存)StatelessSession,因此延迟加载机制不起作用,因为许多延迟加载概念都是基于第一级缓存的存在.

例如,如果您有100个实体实例都在多对一关联中引用相同的实体实例,那么您将懒惰地重新加载引用的实例100次(对于每个引用实例).

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

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

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