JOIN FETCH does not work properly with enhanced entities

Description

I've prepared a reproducer in a repository on github:

https://github.com/fprochazka/hibernate-enhancement-unexpected-queries-bug

I don't understand hibernate internals enough to dig deeper, but this is clearly unwanted, because when I've just enabled it on our project, one of my API endpoints went from 10 queries to 816 queries and I gave up on examining the rest of them.

I've even tried to annotated all of toOne relations in our project with different combinations of @LazyToOne (with different LazyToOneOption) and @LazyGroup in the hopes that I've just misunderstood the feature, but it just went from broken (because of 100x times more queries which is unacceptable) to completely broken (where the data weren't even loading properly).

Environment

java version "1.8.0_191"
Java(TM) SE Runtime Environment (build 1.8.0_191-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.191-b12, mixed mode)

Activity

Show:
A Susnjar
March 5, 2021, 7:01 PM

Please note related discussion at https://discourse.hibernate.org/t/how-to-make-lazy-loading-truly-lazy-v5-4/1994/15

There is a symmetric issue about being able to make those “now lazy” properties eager when required (i.e. via entity graphs or fetches).

Patrice Blanchardie
February 5, 2021, 10:05 AM
Edited

I verified the behavior on the above reproducer and it works as I expected.

But, only with bytecode enhancement without enhancement as proxy, ToOne(LAZY) becomes eager when the same entity is referenced multiple times in a ResultSet (the first record’s ToOne stays lazy, but the others become eager).

In this case, when returnNarrowedProxy is called, it unwraps and initializes at DefaultLoadEventListener.java#L363, triggering an immediate load.

Here is the reproducer:

I fixed it by applying the fix suggested by Gail.
See https://github.com/hibernate/hibernate-orm/pull/3716/files#r570691715

Steve Ebersole
February 4, 2021, 9:10 PM

I’ve created a PR to address this and HHH-13658. WOuld y’all be willing to give that a try with your use cases?

Patrice Blanchardie
January 13, 2021, 5:00 AM

You're welcome.

Steve Ebersole
January 12, 2021, 5:12 PM
Edited

Thanks for the test case. We’ll make sure join fetching works along with the work for

Assignee

Unassigned

Reporter

Filip Procházka

Fix versions

Labels