JOIN FETCH does not work properly with enhanced entities
I've prepared a reproducer in a repository on github:
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).
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)
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).
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.
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?
Thanks for the test case. We’ll make sure join fetching works along with the work for