Solved

Using JPA to partially initialize entities

Posted on 2011-02-17
7
1,547 Views
Last Modified: 2013-11-24
Hi,

I have created an application with a relatively complex model. Everything was working fine and the beta-tests were running smoothly. The problem I am having is that I am using BlazeDS to send results to a Flex client. This causes all relations to be loaded (even if they are marked for lazy loading) and sent to the client. This is rather undesirable as a simple listEntityA doesn't only return a list of EntityA but also all of their references and the references of their references ... a lot of stuff.

I know in JPA I can do these really cool "SELECT NEW packagename.Classname(params...) FROM ..." to create unmanaged instances that are partially initialized (projections). The problem is, that I really would like the main entity to be fully initialized, but I would love some related objects to be only initialized with let's say "id" and "name" (all other properties left empty) ... this would be a projection of the relation.

How could I do this?
0
Comment
Question by:ChristoferDutz
7 Comments
 
LVL 47

Expert Comment

by:for_yan
ID: 34915055
Would not claim that I understand much of what you are writing about, but this is the link with quite similar words,
who knows, maybe you haven't seen it:

http://ria.dzone.com/articles/lazy-loading-flex-blazeds-hibernate
0
 
LVL 20

Author Comment

by:ChristoferDutz
ID: 34915254
I just added the Flex, BlazeDS, LazyCollections words in order to set the focus. My system works great without any errors. I am currently optimizing. Let me explain my problem in a little more detail

I have the following entities with the properties:

EntityA
- id
- name
- oneToMany to EntityB
- oneToMany to EntityC

EntityB
- id
- name
- oneToOne to EntityD

EntityC
- id
- name
- (big blob of data)

EntityD
- id
- name
- (big blob of data)

Open in new window


Now immagine I want to load a list of EntityA objects. When displaying one of the EntityA Objects in a list, I want to output the name of all EntityBs that are associated with that entity and output a link behind the name to switch to that entities view (I only need the id and name and not all the other properties).

So I am looking for a way to do the projection select on the related objects and not the main entity.
0
 
LVL 1

Expert Comment

by:zabin7
ID: 34925099
What I understood is u want to load only the parent record but not the child record. If that is the case then you can use lazy loading

@OneToMany(mappedBy = "type", fetch = FetchType.LAZY)
    private List<Type> type= new ArrayList<Type>();
0
How to run any project with ease

Manage projects of all sizes how you want. Great for personal to-do lists, project milestones, team priorities and launch plans.
- Combine task lists, docs, spreadsheets, and chat in one
- View and edit from mobile/offline
- Cut down on emails

 
LVL 20

Author Comment

by:ChristoferDutz
ID: 34925118
No ... I want to load the parent and I want to partially load the children.
I can load an entity partially by using projection in my select-statement "SELECT NEW de.cware.cweb.model.User(usr.id, usr.name) FROM User usr"
What I would like to do, ist to load the parrent fully and the related entities partially in a way that in the related objects only the id and name properties are initialized.


0
 
LVL 5

Accepted Solution

by:
aciuica earned 500 total points
ID: 34928956
Maybe it depends of which JPA implementation you use (if supports fields lazy loading), but annotating some fields from related entities with lazy loading can be a soution.
http://www.java2s.com/Tutorial/Java/0355__JPA/MarkFieldAsLazyLoad.htm
0
 
LVL 20

Author Comment

by:ChristoferDutz
ID: 34954489
I'm currently stuck with an ANTLR problem ... I'l check this lazy loaded property thing you mentioned ... sounds very prommissing :-)
0
 
LVL 20

Author Closing Comment

by:ChristoferDutz
ID: 34996366
Thanks for the tip with the lazy-loaded properties.

I actually solved my problem by going from JPA to Jdbc directly as here I could controll exactly what I wanted to do.

Thanks anyway.
0

Featured Post

IT, Stop Being Called Into Every Meeting

Highfive is so simple that setting up every meeting room takes just minutes and every employee will be able to start or join a call from any room with ease. Never be called into a meeting just to get it started again. This is how video conferencing should work!

Join & Write a Comment

Suggested Solutions

In this post we will learn how to connect and configure Android Device (Smartphone etc.) with Android Studio. After that we will run a simple Hello World Program.
Never store passwords in plain text or just their hash: it seems a no-brainier, but there are still plenty of people doing that. I present the why and how on this subject, offering my own real life solution that you can implement right away, bringin…
This theoretical tutorial explains exceptions, reasons for exceptions, different categories of exception and exception hierarchy.
This tutorial explains how to use the VisualVM tool for the Java platform application. This video goes into detail on the Threads, Sampler, and Profiler tabs.

762 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

19 Experts available now in Live!

Get 1:1 Help Now