[hibernate-dev] HHH-11223 : Initialize bytecode enhanced lazy group using a single SQL statement

Steve Ebersole steve at hibernate.org
Fri Mar 2 17:34:13 EST 2018


My personal feeling is that if the change itself is not going to make it
into 5.3 then the SPI addition should not either.  There are definitely 2
sides to this though.

On the one hand, if you add this SPI method it will *without question* have
to change for 6.0.  In a way it is creating an incompatibility 5.3->6.0
that is (1) not there currently and (2) unless/until we actually include
the fix that uses it, not needed.  This will for sure change in 6 because
the entire process of generating SQL is different - those values would be
pointless[1].

On the other hand, any fix to this in 5.3 would need (it sounds like) this
SPI change.  So if we don't add it now, we won't be able to fix this in 5.3
at all.

However, I think it is worth pointing out that the entire run-time model
(here Entityersister, via Queryable) is drastically changing in a
completely non-deprecatable way - so this particular change is "a drop in
the bucket" of 6.0 changes in this area.  So in this particular case, I
don't think the 5.3->6.0 compat breakage is that big of a deal.

All that said, I would say go for it.  Just make as sure as possible that
the signature is good for your needs.

[1] Yes we could deprecate the method in 6.0 and just have it do nothing
(because it would not have enough info to do anything useful in the new
model).  But personally I very much dislike that - it really just cheats
the definition of deprecation.


On Fri, Mar 2, 2018 at 12:12 AM Gail Badner <gbadner at redhat.com> wrote:

> This is not necessarily needed for 5.3.0, but I would like to get it into
> the 5.3 branch.
>
> So far, there is one change to an SPI, Queryable#lazyGroupSelectFragment is
> added:
>
> public String lazyGroupSelectFragment(
> String tableAlias,
> String suffix,
> String fetchGroupName);
>
> The method gets implemented in AbstractEntityPersister.
>
> I don't think it's possible to create a default method in Queryable because
> the method needs access to private/protect methods in
> AbstractEntityPersister.
>
> If I don't get HHH-11223 in for 5.3.0, should I at least push the SPI
> change for 5.3.0?
>
> On Thu, Mar 1, 2018 at 9:55 PM, Gail Badner <gbadner at redhat.com> wrote:
>
> > Hi,
> >
> > Currently, when a lazy group is loaded that has associations, there are 2
> > SQL statements executed.
> >
> > For example, suppose the DEFAULT lazy group contains the following:
> >
> > * Order#customer is a lazy many-to-one association;
> >
> > * Order#text is a lazy LOB.
> >
> >
> > When one of these properties is referenced, Hibernate loads both of them.
> >
> >
> > Currently, it takes 2 SQL statements to get the association loaded.
> >
> >
> > 1) Loads #text and the FK value for #customer (select o.text,
> > o.customer_id from orders o where o.id = ?)
> >
> > 2) Loads the state for #customer (select ... from customers c where c.id
> =
> > ?)
> >
> >
> > In other words, FetchMode.SELECT is used to load associations in a lazy
> > group.
> >
> >
> > HHH-11223 involves combining the 2 SQL statements into a single statement
> > using a join (i.e., using FetchMode.JOIN), but only when at least one of
> > the following is true:
> >
> >
> > * caching is disabled for the SessionFactory (e.g.,
> > hibernate.cache.use_second_level_cache=false;
> >
> > * caching is not enabled for "get" operations (i.e.,
> > session.getCacheMode().isGetEnabled() == false);
> >
> > * the associated entity type (and subclasses?) is not cached
> >
> > HHH-11223 only mentions to-one associations, but I think collections in a
> > lazy group could also be loaded using a join as well.
> >
> > I think I'm pretty close, but I need to do a lot more testing to ensure
> it
> > covers things like:
> >
> > * lazy association in composite ID
> > * lazy association in an embeddable
> > * lazy association in a secondary table
> > * lazy association in a subclass
> > * too many bags
> >
> > This is what I have implemented so far: https://github.com/
> > hibernate/hibernate-orm/pull/2170
> >
> > At the moment, I'm not looking for a comprehensive review. I'm just
> > looking for a review of the overall design.
> >
> > I don't want to get into the nitty-gritty here, but, basically, I've
> > created a new type of AbstractLoadPlanBasedEntityLoader, LazyGroupLoader,
> > which loads the lazy group properties into the existing entity.
> >
> > If caching is disabled for the SessionFactory, then one loader is
> > constructed per lazy group, and associations will be loaded using
> > FetchMode.JOIN.
> >
> > If caching is enabled for the SessionFactory, then 2 loaders are
> > constructed per lazy group. One loader is used when caching is enabled
> for
> > "get" operations (using Fetch.SELECT for cached associated
> > entities/collections; Fetch.JOIN for other associations). The other
> loader
> > is used when caching is disabled for "get" operations.
> >
> > Here are some of the changes to the default behavior (described above)
> > that could be useful:
> >
> > 1) Change all associations in lazy groups to be loaded using
> > FetchMode.SELECT (as is currently done without the fix), or using
> > FetchMode.JOIN (regardless of caching). A new configuration property
> could
> > be added:
> >
> > hibernate.bytecode.lazyGroup_association_fetchMode=(default | select |
> > join )
> >
> > 2) Allow the FetchMode to be configured for a particular lazy
> association.
> > According to the documentation [1], @Fetch can't be used for this
> because,
> > "... FetchMode.JOIN acts as a FetchType.EAGER strategy. Even if we mark
> the
> > association as FetchType.LAZY, the FetchMode.JOIN will load the
> association
> > eagerly."
> >
> > A new annotation could be introduced: @LazyFetch.
> >
> > Comments or suggestions?
> >
> > Thanks,
> > Gail
> >
> > [1] http://docs.jboss.org/hibernate/orm/5.2/userguide/html_
> > single/Hibernate_User_Guide.html#fetching-fetchmode-join
> >
> _______________________________________________
> hibernate-dev mailing list
> hibernate-dev at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/hibernate-dev
>


More information about the hibernate-dev mailing list