I should clarify... if your `serialzer#serialize` call is not "recursively"
calling into this check then my example would not work; but then again,
neither would yours
On Thu, May 4, 2017, 12:26 PM Steve Ebersole <steve(a)hibernate.org> wrote:
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
>>>>>
>>>>
>>>>
>>>>