Hibernate#isInitialized is an overloaded method. I think you want to look
at the different forms.
And yes, Navigable will define visitor-based navigation. Hence the name ;)
On Thu, May 4, 2017, 12:18 PM Romain Manni-Bucau <rmannibucau(a)gmail.com>
wrote:
2017-05-04 19:16 GMT+02:00 Steve Ebersole
<steve(a)hibernate.org>:
> But your psuedo code is really just the same as:
>
> AnEntity e = find();
> if ( isInitialized( e ) ) {
> serializer.serialize(e);
> }
>
no cause it is done in the graph visitor and not just the root, that's the
key difference.
>
> boolean isInitialized(Object e) {
> return Hibernate.isInitialized( e );
> }
>
> What I was getting at with the 6.0 + Navigavble discussion is that it
> would be better to base this "isInitialized" on these Navigables instead.
> A Navigable is a polymorphic reference that might be an entity, a
> persistent attribute, a "collection element", etc.
>
Would need to see it in a more concrete version but sounds tempting, would
it integrate a visitor - handling cycles?
>
>
> On Thu, May 4, 2017 at 11:46 AM Romain Manni-Bucau <rmannibucau(a)gmail.com>
> wrote:
>
>> 2017-05-04 18:42 GMT+02:00 Christian Beikov <christian.beikov(a)gmail.com>
>> :
>>
>>> Detecting if an object is initialized should be as easy as calling "
>>> Hibernate.isInitialized(object)". If you want to know whether a specic
>>> attribute of an object is initialized you'd use
"Hibernate.isPropertyInitialized(object,
>>> attributeName)". What you want is some kind of integration that makes
>>> use of these two methods, so that if they return false, a null value is
>>> used when serializing objects to XML/JSON via JAXB/JSONB. Is that correct?
>>>
>>
>> Almost, I would like one able to just disable it, this way the
>> serializer doesnt need anything or knowledge of hibernate. Worse case we
>> need to integrate with the serializer in a way close to the one i proposed
>> for johnzon before.
>>
>> In pseudo code it would be:
>>
>> AnEntity e = find();
>> Hibernate.disableLazyExceptionWithNull(e);
>> serializer.serialize(e);
>>
>>
>>> I don't know of any hook in JAXB that could be used to put that code
>>> into so it works out as you'd expect it. The only other way I can think
of,
>>> is nulling the properties explicitly which could be done quite easily. You
>>> probably gonna need just a single recursive method to do that. I don't
see
>>> how that method should be part of Hibernate nor how you'd expect to be
able
>>> to configure Hibernate so that it would do that transparently.
>>>
>> the switch of lazyexception to null would work wit jaxb. Otherwise you
>> need some more low level integration not portable IIRC.
>>
>>
>>> I still think the cleanest solution would be to have DTOs, which is why
>>> I'd argue that such a halve solution shouldn't be part of Hibernate.
>>>
>>
>> Think we all agree (or agreed already ;)) but created this thread cause
>> i saw it often enough to be a need.
>>
>>
>>>
>>> Mit freundlichen Grüßen,
>>> ------------------------------
>>> *Christian Beikov*
>>> Am 04.05.2017 um 18:00 schrieb Romain Manni-Bucau:
>>>
>>>
>>>
>>> 2017-05-04 17:33 GMT+02:00 Steve Ebersole <steve(a)hibernate.org>:
>>>
>>>> What exactly would this "utility one level further than existing
ones"
>>>> do?
>>>>
>>>>
>>> Multiple options are possible but one is to return null instead of
>>> throwing lazy exception for instance.
>>>
>>>
>>>> And for what it is worth, IMO the new Navigable model in 6.0 will again
>>>> help here. Especially in conjunction with the Navigable visitation
>>>> support.
>>>>
>>>
>>> I'm not familiar enough but if it providers for each member a way to
>>> know if it is loaded or not it can work.
>>>
>>>
>>>>
>>>> On Thu, May 4, 2017 at 10:27 AM Christian Beikov <
>>>> christian.beikov(a)gmail.com>
>>>> wrote:
>>>>
>>>> > Well that is again exactly what a DTO is good for. If you as
>>>> developer
>>>> > want the groups to be available, you add a list of groups to that
>>>> > special DTO type for that use case. In your data access layer you
>>>> > somehow populate that, which is normally done by using some mapper
>>>> > library like MapStruct or Dozer and then JAXB/JSONB can just work
>>>> with
>>>> > the DTO type without any problems.
>>>> >
>>>> > Now if you forget to add a JOIN FETCH to your query and you end up
>>>> with
>>>> > N+1 queries, that's a different problem, just like the amount
of
>>>> > boilerplate code needed for having DTO types for every use case.
>>>> That I
>>>> > try to solve with Blaze-Persistence Entity Views.
>>>> >
>>>> > Just a quick example to make my point here. If you have a REST
>>>> endpoint
>>>> > /user/{id} and want to provide the list of group names along with
the
>>>> > user information, you'd create a UserInfoDTO.
>>>> >
>>>> > @EntityView(User.class)
>>>> > interface UserInfoDTO {
>>>> > String getUsername();
>>>> > @Mapping("groups.name")
>>>> > List<String> getGroups();
>>>> > }
>>>> >
>>>> > Your repository returns an object of that type and you just pass
that
>>>> > object through so JAXB/JSONB can do their work. The mapping
>>>> information
>>>> > in the DTO is applied on a "source query" i.e. only doing
the work
>>>> > absolutely necessary to satisfy the requested projection.
>>>> >
>>>> > Implementing this by hand is by no means impossible, but rather
>>>> > inconvenient I'd say, which is probably why you are seeking for
other
>>>> > solutions.
>>>> >
>>>> > In the end, you can only try to create a minimal DTO that has
exactly
>>>> > the fields you want to be serialized or annotate your existing
>>>> entities
>>>> > with those "ignore" annotations and hope for the best. I
don't see
>>>> how
>>>> > hibernate could or should help in any of the two cases.
>>>> >
>>>> > Mit freundlichen Grüßen,
>>>> >
>>>> ------------------------------------------------------------------------
>>>> > *Christian Beikov*
>>>> > Am 04.05.2017 um 16:59 schrieb Romain Manni-Bucau:
>>>> > > Sure. If you add any conversion logic then you are clearly out
of
>>>> > > hibernate scope and the problem doesnt appear anymore. Here is
a
>>>> > > trivial example (hopefully trivial at least ;))
>>>> > >
>>>> > > User 1 - n Group
>>>> > >
>>>> > > In json we would get something like
{username:...,groups:[group1,
>>>> > > group2]}, no issue to know if group should be loaded or not
since
>>>> this
>>>> > > part of the logic is in the mapper layer.
>>>> > >
>>>> > > So yes you can say "not my problem" but next
framework will
>>>> > > immediately ask "how do i know" and you likely end
like all
>>>> > > spring-data-rest recommandation with a specific mapping and not
a
>>>> > > framework solution which is the target of that thread - at
least
>>>> what
>>>> > > I tried to explain ;).
>>>> > >
>>>> > > 2017-05-04 16:41 GMT+02:00 Christian Beikov
>>>> > > <christian.beikov(a)gmail.com
<mailto:christian.beikov@gmail.com>>:
>>>> > >
>>>> > > I don't understand what you mean by "you put that
logic in the
>>>> > > conversion", could you elaborate?
>>>> > >
>>>> > >
>>>> > > Mit freundlichen Grüßen,
>>>> > >
>>>> >
>>>> ------------------------------------------------------------------------
>>>> > > *Christian Beikov*
>>>> > > Am 04.05.2017 um 16:32 schrieb Romain Manni-Bucau:
>>>> > >> Few more points:
>>>> > >>
>>>> > >> 1. Dto dont help at any moment - or you put that logic
in the
>>>> > >> conversion and you are back to start
>>>> > >> 2. Making jaxb/jsonb easy to integrate is the goal IMO.
No
>>>> need
>>>> > >> to integrate with them but just provide some utility
one level
>>>> > >> further than existing ones
>>>> > >>
>>>> > >> Le 4 mai 2017 16:13, "Steve Ebersole"
<steve(a)hibernate.org
>>>> > >> <mailto:steve@hibernate.org>> a écrit :
>>>> > >>
>>>> > >> Oops, that (3) in previous reply should have read:
>>>> > >> 3. supporting each format creates a new
"optional" library
>>>> > >> dependency
>>>> > >>
>>>> > >> Overall, I like Christian's approach as a
potential
>>>> > >> generalized approach to
>>>> > >> this. Basically a combination of
>>>> > >>
>>>> > >> 1. a query used to provide the "view source
values"
>>>> > >> 2. some indication of how to map those
"source values"
>>>> to
>>>> > >> your view model
>>>> > >>
>>>> > >>
>>>> > >> And again, I think 6.0's improved
dynamic-instantiation
>>>> > >> queries are a
>>>> > >> simple, already-built-in way to achieve that for
most
>>>> cases.
>>>> > >> But I am open
>>>> > >> to discussing a way to supply that combination via
API if
>>>> we
>>>> > >> deem that
>>>> > >> would be good - although then I'd also question
how the
>>>> current
>>>> > >> TupleTransformer does not meet that need.
>>>> > >>
>>>> > >> On Thu, May 4, 2017 at 8:43 AM Steve Ebersole
>>>> > >> <steve(a)hibernate.org
<mailto:steve@hibernate.org>> wrote:
>>>> > >>
>>>> > >> > Were there a standard "represent
something in XML-ish
>>>> > >> format" contract
>>>> > >> > portable across a number of formats (XML,
JAXB, JSON,
>>>> etc)
>>>> > >> then I'd be more
>>>> > >> > inclined to agree with this. But as it is,
supporting
>>>> this
>>>> > >> would mean
>>>> > >> > Hibernate implementing multiple such
contracts, one per
>>>> > >> format. However,
>>>> > >> >
>>>> > >> > 1. these formats are not our core
competency
>>>> > >> > 2. maintaining a complete set of these
transformers
>>>> > >> across all the
>>>> > >> > popular formats du-jour is a large
undertaking
>>>> > >> > 3. I am not convinced that
>>>> > >> >
>>>> > >> > All of these increase the technical risk.
>>>> > >> >
>>>> > >> > Additionally, to properly support this
we'd really need
>>>> the
>>>> > >> ability to
>>>> > >> > then "map" multiple views for a
given entity-graph-root.
>>>> > >> What I mean by
>>>> > >> > that, is that such DTO approaches often need
multiple
>>>> > >> "views" of a given
>>>> > >> > entity, e.g. a CompanyListDTO,
CompanyOverviewDTO,
>>>> > >> > CompanyDetailsGeneralDTO, etc for a Company
entity. The
>>>> > >> point of this is
>>>> > >> > that
>>>> > >> >
>>>> > >> > 1. the transformers for these are specific
to each
>>>> DTO
>>>> > >> type and would
>>>> > >> > be applied per-transformation
>>>> > >> > 2. were Hibernate to "provide"
this for applications
>>>> > >> >
>>>> > >> > IMO the use of queries to obtain views is
logical.
>>>> > >> Populating each of
>>>> > >> > those specific DTOs (CompanyListDTO, etc) in
the most
>>>> > >> efficient way is
>>>> > >> > going to require very different SQL for each
DTO. This
>>>> > >> implies some kind
>>>> > >> > of "mapping" to be able associate
each DTO with query.
>>>> > >> >
>>>> > >> > Given 6.0's improved dynamic-instantiation
support, I
>>>> even
>>>> > >> think that is a
>>>> > >> > great solution as well *for most cases*.
>>>> > >> >
>>>> > >> > So, while my objection has a "practical
impact"
>>>> component,
>>>> > >> I also just
>>>> > >> > question whether Hibernate integrating with
each
>>>> format's
>>>> > >> "serializer" is
>>>> > >> > the proper solution.
>>>> > >> >
>>>> > >> >
>>>> > >> >
>>>> > >> > On Thu, May 4, 2017 at 5:08 AM Christian
Beikov <
>>>> > >> > christian.beikov(a)gmail.com
>>>> > >> <mailto:christian.beikov@gmail.com>>
wrote:
>>>> > >> >
>>>> > >> >> This is exactly what I am trying to do
with
>>>> > >> Blaze-Persistence Entity
>>>> > >> >> Views, making DTOs sexy and efficient :)
>>>> > >> >>
>>>> > >> >> Here a quick overview of how that looks
like right now:
>>>> > >> >>
>>>> > >> >>
>>>> > >>
>>>> >
>>>>
https://persistence.blazebit.com/documentation/entity-view/manual/en_US/i...
>>>> > >> <
>>>> >
>>>>
https://persistence.blazebit.com/documentation/entity-view/manual/en_US/i...
>>>> > >
>>>> > >> >>
>>>> > >> >> One of my targets is to make it possible
to do
>>>> something
>>>> > >> like this
>>>> > >> >>
>>>> > >> >> entityManager.createQuery("FROM Order
o",
>>>> > >> OrderDTO.class).getResultList()
>>>> > >> >>
>>>> > >> >> and get an optimal query, as well as
objects with only
>>>> the
>>>> > >> necessary
>>>> > >> >> contents.
>>>> > >> >>
>>>> > >> >> Maybe we can collaborate on that somehow?
>>>> > >> >>
>>>> > >> >>
>>>> > >> >> Mit freundlichen Grüßen,
>>>> > >> >>
>>>> > >>
>>>> >
>>>> ------------------------------------------------------------------------
>>>> > >> >> *Christian Beikov*
>>>> > >> >> Am 04.05.2017 um 10:20 schrieb Emmanuel
Bernard:
>>>> > >> >> > Following up a bit on my previous
email.
>>>> > >> >> >
>>>> > >> >> > While a core integration might be
best I think, if
>>>> there
>>>> > >> are too much
>>>> > >> >> > reluctance, we can start with a
dedicated
>>>> hibernate-dto
>>>> > >> or whatever
>>>> > >> >> > module or even separate project that
makes life
>>>> easier
>>>> > >> for these "pass
>>>> > >> >> > through" use cases. This could
be in the form of a
>>>> > >> wrapper API of sort
>>>> > >> >> > and hence not affect existing
Hibernate ORM APIs.
>>>> > >> >> >
>>>> > >> >> > Note that the ResultTransformer
approach feels like
>>>> it
>>>> > >> goes a long way
>>>> > >> >> > towards fixing the problem but as
demonstrated in
>>>> Vlad's
>>>> > >> article
>>>> > >> >> >
>>>> > >> >>
>>>> > >>
>>>> >
>>>>
https://vladmihalcea.com/2017/04/03/why-you-should-use-the-hibernate-resu...
>>>> > >> <
>>>> >
>>>>
https://vladmihalcea.com/2017/04/03/why-you-should-use-the-hibernate-resu...
>>>> > >
>>>> > >> >> > it still requires quite a bit of code
and a special
>>>> DTO
>>>> > >> constructor
>>>> > >> >> > object. That's what we need to
get rid of I think.
>>>> > >> >> >
>>>> > >> >> > Emmanuel
>>>> > >> >> >
>>>> > >> >> > On Thu 17-05-04 10:04, Emmanuel
Bernard wrote:
>>>> > >> >> >> I was very much in the Vlad,
Steve, Christian camp
>>>> > >> until relatively
>>>> > >> >> >> recently. One of my main concern
being that
>>>> replacing a
>>>> > >> proxy by null
>>>> > >> >> >> was really sending the wrong
message. So I was
>>>> against
>>>> > >> having Hibernate
>>>> > >> >> >> ORM facilitate such a
transformation.
>>>> > >> >> >>
>>>> > >> >> >> I am changing my mind because I
am realizing that a
>>>> lot
>>>> > >> of applications
>>>> > >> >> >> are less complex that my
perceived median. A lot of
>>>> > >> apps really just
>>>> > >> >> >> want data to be fetched out and
then passed to
>>>> jackson
>>>> > >> (implicitly) and
>>>> > >> >> >> pushed out as a REST response in
JSON or some other
>>>> > >> serialization
>>>> > >> >> >> protocol.
>>>> > >> >> >>
>>>> > >> >> >> So while we could try and keep
the stance that such
>>>> a
>>>> > >> solution should
>>>> > >> >> >> remain out of scope of Hibernate
ORM core, we should
>>>> > >> have a very smooth
>>>> > >> >> >> integration with something like
MapStruct to create
>>>> > >> such bounded DTO on
>>>> > >> >> >> the fly. Ideally with as close to
zero code as
>>>> possible
>>>> > >> from the user
>>>> > >> >> >> point of view.
>>>> > >> >> >> I can't really describe how
that could look like
>>>> > >> because I am not
>>>> > >> >> >> familiar enough with MapStruct
but I think it should
>>>> > >> have the following
>>>> > >> >> >> characteristics:
>>>> > >> >> >>
>>>> > >> >> >> 1. do an implicit binding between
the mapped object
>>>> > >> graph and a
>>>> > >> >> detached
>>>> > >> >> >> object graph with a 1-1
mapping of type and
>>>> > >> replacing lazy objects
>>>> > >> >> and
>>>> > >> >> >> collections with null.
That's the smoothest
>>>> approach
>>>> > >> and the most
>>>> > >> >> >> common use case but also the
one where an
>>>> > >> inexperienced person could
>>>> > >> >> >> shoot at someone else's
foot
>>>> > >> >> >> 2. do a binding between the
mapped object graph and
>>>> a
>>>> > >> detached version
>>>> > >> >> of
>>>> > >> >> >> that object graph with a 1-1
mapping of type, but
>>>> > >> declaratively
>>>> > >> >> >> expressing the boundaries for
the detached
>>>> version.
>>>> > >> This enforces a
>>>> > >> >> >> clear thinking of the
boundaries and will load
>>>> lazy
>>>> > >> data in case the
>>>> > >> >> >> object graph loaded is missing
a bit. I like the
>>>> > >> idea on principle
>>>> > >> >> but
>>>> > >> >> >> I think it overlaps a lot with
the fetch graph.
>>>> > >> >> >> 3. offer a full integration
between MapStruct and
>>>> > >> Hibernate ORM by
>>>> > >> >> >> letting people express a full
fledge MapStruct
>>>> > >> transformation
>>>> > >> >> between
>>>> > >> >> >> the managed object graph and a
different target
>>>> > >> structure
>>>> > >> >> >>
>>>> > >> >> >> I favored MapStruct over Dozer
because we know the
>>>> > >> MapStruct lead
>>>> > >> >> quite well ;)
>>>> > >> >> >>
>>>> > >> >> >> Note however that the MapStruct
approach requires an
>>>> > >> explicit object
>>>> > >> >> >> copy, it feels a bit sad to have
to double memory
>>>> > >> consumption. But that
>>>> > >> >> >> might be a good enough approach
and bypassing the
>>>> > >> managed object
>>>> > >> >> >> creation leads to questions
around the Persistence
>>>> > >> Context contract
>>>> > >> >> >> where loading an object
supposedly means it will be
>>>> in
>>>> > >> the PC.
>>>> > >> >> >> Maybe a constructor like query
syntax allowing to
>>>> > >> reference a MapStruct
>>>> > >> >> >> conversion logic might work?
>>>> > >> >> >>
>>>> > >> >> >> select
mapStruct('order-and-items', o) from
>>>> Order o
>>>> > >> left join
>>>> > >> >> fetch o.items
>>>> > >> >> >>
>>>> > >> >> >> Emmanuel
>>>> > >> >> >>
>>>> > >> >> >>
>>>> > >> >> >> On Wed 17-04-19 14:29, Vlad
Mihalcea wrote:
>>>> > >> >> >>> Hi,
>>>> > >> >> >>>
>>>> > >> >> >>> Although I keep on seeing
this request from time to
>>>> > >> time, I still
>>>> > >> >> think
>>>> > >> >> >>> it's more like a Code
Smell.
>>>> > >> >> >>> Entities are useful for when
you plan to modify
>>>> them.
>>>> > >> Otherwise, a DTO
>>>> > >> >> >>> projection is much more
efficient, and you don't
>>>> > >> suffer from
>>>> > >> >> >>> LazyInitializationException.
>>>> > >> >> >>>
>>>> > >> >> >>> With the ResultTransformer,
you can even build
>>>> graphs
>>>> > >> of entities, as
>>>> > >> >> >>> explained in this article;
>>>> > >> >> >>>
>>>> > >> >> >>>
>>>> > >> >>
>>>> > >>
>>>> >
>>>>
https://vladmihalcea.com/2017/04/03/why-you-should-use-the-hibernate-resu...
>>>> > >> <
>>>> >
>>>>
https://vladmihalcea.com/2017/04/03/why-you-should-use-the-hibernate-resu...
>>>> > >
>>>> > >> >> >>>
>>>> > >> >> >>> Due to how Hibernate Proxies
are handled, without
>>>> > Bytecode
>>>> > >> >> Enhancement,
>>>> > >> >> >>> it's difficult to replace
a Proxy with null after
>>>> the
>>>> > >> Session is
>>>> > >> >> closed. If
>>>> > >> >> >>> we implemented this, we'd
have to take into
>>>> > >> consideration both
>>>> > >> >> Javassist
>>>> > >> >> >>> and ByteBuddy as well as
ByteCode Enhancements.
>>>> > >> >> >>>
>>>> > >> >> >>> all in all, the
implementation effort might not
>>>> > >> justify the benefit,
>>>> > >> >> and
>>>> > >> >> >>> I'm skeptical of offering
a feature that does not
>>>> > >> encourage data
>>>> > >> >> access
>>>> > >> >> >>> Best Practices.
>>>> > >> >> >>>
>>>> > >> >> >>> Vlad
>>>> > >> >> >>>
>>>> > >> >> >>> On Wed, Apr 19, 2017 at 2:18
PM, Christian Beikov <
>>>> > >> >> >>> christian.beikov(a)gmail.com
>>>> > >> <mailto:christian.beikov@gmail.com>>
wrote:
>>>> > >> >> >>>
>>>> > >> >> >>>> Hey Romain,
>>>> > >> >> >>>>
>>>> > >> >> >>>> I don't think it is a
good idea to expose entities
>>>> > >> directly if you
>>>> > >> >> >>>> really need a subset of
the data.
>>>> > >> >> >>>> Reasons for that thinking
are that it gets hard to
>>>> > >> define what needs
>>>> > >> >> to
>>>> > >> >> >>>> be fetched or is safe to
be used for a particular
>>>> use
>>>> > >> case. Obviously
>>>> > >> >> >>>> serialization is like a
follow-up problem.
>>>> > >> >> >>>> I see 2 possible
solutions to the problem and both
>>>> > >> boil down to the
>>>> > >> >> use
>>>> > >> >> >>>> of DTOs.
>>>> > >> >> >>>>
>>>> > >> >> >>>> 1. Use an object
mapper(e.g. Dozer) that maps
>>>> > >> entity object graphs
>>>> > >> >> to
>>>> > >> >> >>>> custom DTO types.
>>>> > >> >> >>>> 2. Use specialized DTOs
in queries.
>>>> > >> >> >>>>
>>>> > >> >> >>>>
>>>> > >> >> >>>> Implementing 1. does not
help you with lazy
>>>> loading
>>>> > >> issues and 2.
>>>> > >> >> might
>>>> > >> >> >>>> require very intrusive
changes in queries which is
>>>> > >> why I implemented
>>>> > >> >> >>>> Blaze-Persistence Entity
Views
>>>> > >> >> >>>>
>>>> > >> <
>>>>
https://github.com/beikov/blaze-persistence#entity-view-usage
>>>> > >> <
>>>>
https://github.com/beikov/blaze-persistence#entity-view-usage
>>>> > >>.
>>>> > >> >> >>>> This is a library that
allows you to define DTOs
>>>> with
>>>> > >> mappings to the
>>>> > >> >> >>>> entity. In a query you
can define that you want
>>>> > >> results to be
>>>> > >> >> >>>> "materialized"
as instances of the DTO type.
>>>> > >> >> >>>> This reduces the pain
induced by properly
>>>> separating the
>>>> > >> >> "presentation
>>>> > >> >> >>>> model" from the
"persistence model" and at the
>>>> same
>>>> > >> time will improve
>>>> > >> >> >>>> the performance by
utilizing the mapping
>>>> information.
>>>> > >> >> >>>> I don't want to
advertise too much, just wanted to
>>>> > >> say that I had the
>>>> > >> >> >>>> same issues over and over
which is why I started
>>>> that
>>>> > >> project.
>>>> > >> >> >>>>
>>>> > >> >> >>>> Mit freundlichen Grüßen,
>>>> > >> >> >>>>
>>>> > >> >>
>>>> > >>
>>>> >
>>>> ------------------------------------------------------------------------
>>>> > >> >> >>>> *Christian Beikov*
>>>> > >> >> >>>> Am 19.04.2017 um 10:51
schrieb Romain Manni-Bucau:
>>>> > >> >> >>>>> Hi guys,
>>>> > >> >> >>>>>
>>>> > >> >> >>>>> Short sumarry: Wonder
if hibernate could get a
>>>> > >> feature to kind of
>>>> > >> >> either
>>>> > >> >> >>>>> unproxy or freeze the
entities once leaving the
>>>> > >> managed context to
>>>> > >> >> avoid
>>>> > >> >> >>>>> uncontrolled lazy
loading on one side and
>>>> > >> serialization issues on
>>>> > >> >> another
>>>> > >> >> >>>>> side.
>>>> > >> >> >>>>>
>>>> > >> >> >>>>> Use case example: a
common example is a REST
>>>> service
>>>> > >> exposing
>>>> > >> >> directly
>>>> > >> >> >>>>> hibernate entities
(which is more and more common
>>>> > >> with microservice
>>>> > >> >> >>>>>
"movement").
>>>> > >> >> >>>>>
>>>> > >> >> >>>>> Objective: the goal
is to not need any step - or
>>>> > >> reduce them a lot -
>>>> > >> >> >>>>> between the hibernate
interaction and a potential
>>>> > >> serialization to
>>>> > >> >> avoid
>>>> > >> >> >>>>> issues with lazy
loading and unexpected loading.
>>>> > >> Today it requires
>>>> > >> >> some
>>>> > >> >> >>>>> custom and hibernate
specific logic in the
>>>> > >> serializer which kind of
>>>> > >> >> >>>> breaks
>>>> > >> >> >>>>> the transversality of
the two concerns
>>>> > >> (serialization and object
>>>> > >> >> >>>>> management/loading).
>>>> > >> >> >>>>>
>>>> > >> >> >>>>>
>>>> > >> >> >>>>> Implementation
options I see:
>>>> > >> >> >>>>>
>>>> > >> >> >>>>> 1. a callback
requesting if the lazy relationship
>>>> > >> should be fetched,
>>>> > >> >> >>>>> something like
>>>> > >> >> >>>>>
>>>> > >> >> >>>>> public interface
GraphVisitor {
>>>> > >> >> >>>>> boolean
shouldLoad(Object rootEntity,
>>>> Property
>>>> > >> property);
>>>> > >> >> >>>>> }
>>>> > >> >> >>>>>
>>>> > >> >> >>>>> 2. An utility to
remove any proxy potentially
>>>> > >> throwing an exception
>>>> > >> >> and
>>>> > >> >> >>>>> replacing the value
by null or an empty
>>>> collection,
>>>> > >> something like
>>>> > >> >> >>>>>
>>>> > >> >> >>>>> MyEntity e =
Hibernate.deepUnproxy(entity);
>>>> > >> >> >>>>>
>>>> > >> >> >>>>> 3. A switch of the
proxy implementation, this is
>>>> > >> close to 2 but
>>>> > >> >> wouldn't
>>>> > >> >> >>>>> require a call to any
utility, just a
>>>> configuration
>>>> > >> in the
>>>> > >> >> persistence
>>>> > >> >> >>>> unit.
>>>> > >> >> >>>>> Side note: of course
all 3 options can be mixed
>>>> to
>>>> > >> create a single
>>>> > >> >> >>>> solution
>>>> > >> >> >>>>> like having 3
implemented based on 1 for
>>>> instance.
>>>> > >> >> >>>>>
>>>> > >> >> >>>>> Configuration
proposal: this would be activated
>>>> > >> through a property
>>>> > >> >> in the
>>>> > >> >> >>>>> persistence unit
(this shouldn't be only global
>>>> IMHO
>>>> > >> cause
>>>> > >> >> otherwise you
>>>> > >> >> >>>>> can't mix 2 kind
of units, like one for JSF and
>>>> one
>>>> > >> for JAX-RS to be
>>>> > >> >> >>>>> concrete). This
should also be activable as a
>>>> query
>>>> > >> hint i think -
>>>> > >> >> but
>>>> > >> >> >>>> more
>>>> > >> >> >>>>> a nice to have.
>>>> > >> >> >>>>>
>>>> > >> >> >>>>>
>>>> > >> >> >>>>> What this feature
wouldn't be responsible for:
>>>> > >> cycles. If
>>>> > >> >> relationships
>>>> > >> >> >>>> are
>>>> > >> >> >>>>> bidirectional then
the unproxied entity would
>>>> still
>>>> > >> "loop" if you
>>>> > >> >> browse
>>>> > >> >> >>>>> the object graph -
this responsability would
>>>> stay in
>>>> > >> the consumer
>>>> > >> >> since
>>>> > >> >> >>>> it
>>>> > >> >> >>>>> doesn't depend on
hibernate directly but more on
>>>> a
>>>> > >> plain object
>>>> > >> >> handling.
>>>> > >> >> >>>>>
>>>> > >> >> >>>>> What do you think?
>>>> > >> >> >>>>>
>>>> > >> >> >>>>>
>>>> > >> >> >>>>> Romain Manni-Bucau
>>>> > >> >> >>>>> @rmannibucau
<
https://twitter.com/rmannibucau
>>>> > >> <
https://twitter.com/rmannibucau>> |
Blog
>>>> > >> >> >>>>>
<
https://blog-rmannibucau.rhcloud.com
>>>> > >> <
https://blog-rmannibucau.rhcloud.com>> |
Old Blog
>>>> > >> >> >>>>>
<
http://rmannibucau.wordpress.com
>>>> > >> <
http://rmannibucau.wordpress.com>> |
Github <
>>>> >
https://github.com/
>>>> > >> >> >>>> rmannibucau> |
>>>> > >> >> >>>>> LinkedIn <
>>>>
https://www.linkedin.com/in/rmannibucau
>>>> > >> <
https://www.linkedin.com/in/rmannibucau>>
| JavaEE
>>>> Factory
>>>> > >> >> >>>>>
<
https://javaeefactory-rmannibucau.rhcloud.com
>>>> > >>
<
https://javaeefactory-rmannibucau.rhcloud.com>>
>>>> > >> >> >>>>>
_______________________________________________
>>>> > >> >> >>>>> hibernate-dev mailing
list
>>>> > >> >> >>>>>
hibernate-dev(a)lists.jboss.org
>>>> > >> <mailto:hibernate-dev@lists.jboss.org>
>>>> > >> >> >>>>>
>>>> > >>
https://lists.jboss.org/mailman/listinfo/hibernate-dev
>>>> > >>
<
https://lists.jboss.org/mailman/listinfo/hibernate-dev>
>>>> > >> >> >>>>
_______________________________________________
>>>> > >> >> >>>> hibernate-dev mailing
list
>>>> > >> >> >>>>
hibernate-dev(a)lists.jboss.org
>>>> > >> <mailto:hibernate-dev@lists.jboss.org>
>>>> > >> >> >>>>
>>>> > >>
https://lists.jboss.org/mailman/listinfo/hibernate-dev
>>>> > >>
<
https://lists.jboss.org/mailman/listinfo/hibernate-dev>
>>>> > >> >> >>>>
>>>> > >> >> >>>
_______________________________________________
>>>> > >> >> >>> hibernate-dev mailing list
>>>> > >> >> >>>
hibernate-dev(a)lists.jboss.org
>>>> > >> <mailto:hibernate-dev@lists.jboss.org>
>>>> > >> >> >>>
>>>>
https://lists.jboss.org/mailman/listinfo/hibernate-dev
>>>> > >>
<
https://lists.jboss.org/mailman/listinfo/hibernate-dev>
>>>> > >> >> >>
_______________________________________________
>>>> > >> >> >> hibernate-dev mailing list
>>>> > >> >> >> hibernate-dev(a)lists.jboss.org
>>>> > >> <mailto:hibernate-dev@lists.jboss.org>
>>>> > >> >> >>
>>>>
https://lists.jboss.org/mailman/listinfo/hibernate-dev
>>>> > >>
<
https://lists.jboss.org/mailman/listinfo/hibernate-dev>
>>>> > >> >> >
_______________________________________________
>>>> > >> >> > hibernate-dev mailing list
>>>> > >> >> > hibernate-dev(a)lists.jboss.org
>>>> > >> <mailto:hibernate-dev@lists.jboss.org>
>>>> > >> >> >
>>>>
https://lists.jboss.org/mailman/listinfo/hibernate-dev
>>>> > >>
<
https://lists.jboss.org/mailman/listinfo/hibernate-dev>
>>>> > >> >>
>>>> > >> >>
_______________________________________________
>>>> > >> >> hibernate-dev mailing list
>>>> > >> >> hibernate-dev(a)lists.jboss.org
>>>> > >> <mailto:hibernate-dev@lists.jboss.org>
>>>> > >> >>
https://lists.jboss.org/mailman/listinfo/hibernate-dev
>>>> > >>
<
https://lists.jboss.org/mailman/listinfo/hibernate-dev>
>>>> > >> >>
>>>> > >> >
>>>> > >> _______________________________________________
>>>> > >> hibernate-dev mailing list
>>>> > >> hibernate-dev(a)lists.jboss.org
>>>> > >> <mailto:hibernate-dev@lists.jboss.org>
>>>> > >>
https://lists.jboss.org/mailman/listinfo/hibernate-dev
>>>> > >>
<
https://lists.jboss.org/mailman/listinfo/hibernate-dev>
>>>> > >>
>>>> > >
>>>> > >
>>>> >
>>>> > _______________________________________________
>>>> > hibernate-dev mailing list
>>>> > hibernate-dev(a)lists.jboss.org
>>>> >
https://lists.jboss.org/mailman/listinfo/hibernate-dev
>>>> _______________________________________________
>>>> hibernate-dev mailing list
>>>> hibernate-dev(a)lists.jboss.org
>>>>
https://lists.jboss.org/mailman/listinfo/hibernate-dev
>>>>
>>>
>>>
>>>