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 <rmannibu...@gmail.com> wrote: > 2017-05-04 19:16 GMT+02:00 Steve Ebersole <st...@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 <rmannibu...@gmail.com> >> wrote: >> >>> 2017-05-04 18:42 GMT+02:00 Christian Beikov <christian.bei...@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 <st...@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.bei...@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.bei...@gmail.com <mailto:christian.bei...@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" <st...@hibernate.org >>>>> > >> <mailto:st...@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 >>>>> > >> <st...@hibernate.org <mailto:st...@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.bei...@gmail.com >>>>> > >> <mailto:christian.bei...@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/index.html#first-entity-view-query >>>>> > >> < >>>>> > >>>>> https://persistence.blazebit.com/documentation/entity-view/manual/en_US/index.html#first-entity-view-query >>>>> > > >>>>> > >> >> >>>>> > >> >> 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-resulttransformer-to-customize-result-set-mappings/ >>>>> > >> < >>>>> > >>>>> https://vladmihalcea.com/2017/04/03/why-you-should-use-the-hibernate-resulttransformer-to-customize-result-set-mappings/ >>>>> > > >>>>> > >> >> > 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-resulttransformer-to-customize-result-set-mappings/ >>>>> > >> < >>>>> > >>>>> https://vladmihalcea.com/2017/04/03/why-you-should-use-the-hibernate-resulttransformer-to-customize-result-set-mappings/ >>>>> > > >>>>> > >> >> >>> >>>>> > >> >> >>> 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.bei...@gmail.com >>>>> > >> <mailto:christian.bei...@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@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@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@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@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@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@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@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@lists.jboss.org >>>>> > https://lists.jboss.org/mailman/listinfo/hibernate-dev >>>>> _______________________________________________ >>>>> hibernate-dev mailing list >>>>> hibernate-dev@lists.jboss.org >>>>> https://lists.jboss.org/mailman/listinfo/hibernate-dev >>>>> >>>> >>>> >>>> _______________________________________________ hibernate-dev mailing list hibernate-dev@lists.jboss.org https://lists.jboss.org/mailman/listinfo/hibernate-dev