openjpa-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Pinaki Poddar <>
Subject Re: Does OpenJPA replace Collections?
Date Wed, 08 Apr 2009 10:16:14 GMT

According to JPA spec:
"If there are no associated entities for a multi-valued relationship of an entity fetched
from the database,
the persistence provider is responsible for returning an empty collection as the value of
the relationship."

That is what OpenJPA does. So the application do not need to return an empty list for a null
(initialized) list.

OpenJPA proxies all returned collections. So application code can simply do the following

// In the domain class
private List<MyPcObject> myPcList = null; // never explictly initialized

@OneToMany (mappedBy="ownerSide", fetch=FetchType.LAZY,  cascade=CascadeType.PERSIST)
public  List<Promotion> getMyPcList()  {
      return myPcList; // return as it is

// In the application
List<Promotion> list = owner.getMyPcList();
assertNotSame(java.util.ArrayList.class, list.getClass());
list.add(new MyPcObject());

On Apr 7, 2009, at 11:10 PM, Paul Copeland wrote:

> Can OpenJPA replace a Collection when it is loaded?
> With the code below when the list is initially empty you need to  
> create a List (ArrayList) so you can add elements to it. When I  
> persisted new objects on the ManyToOne side and added them to the  
> List that worked.  But the first time the List was loaded it seemed  
> to replace my ArrayList with the newly loaded data and made an older  
> reference to the ArrayList stale (no longer updated when more  
> elements were added to myPcList).  This was all in one transaction.
> So now I wonder if the initial null List is a special case or if  
> OpenJPA might replace the Collection anytime it decides to load it  
> again.  Anyone know the answer?

If the list is persistent and the class is enhanced, the collection  
will always reflect what's in the database.
> If I don't create an initial ArrayList how can I add elements when  
> the List is empty?

I'd recommend always having a non-empty list. Initialize it in the  
constructor to an empty list and don't check it after that.

Here's what it would look like:
>  @OneToMany (mappedBy="ownerSide", fetch=FetchType.LAZY,  
> cascade=CascadeType.PERSIST)
>  private List<MyPcObject> myPcList = new ArrayList<MyPcObject>();
>  List<Promotion> getMyPcList()
>  {
>      return myPcList;
>  }

Craig L Russell
Architect, Sun Java Enterprise System
408 276-5638
P.S. A good JDO? O, Gasp!


Pinaki Poddar            
OpenJPA PMC Member/Committer
JPA Expert Group Member
View this message in context:
Sent from the OpenJPA Users mailing list archive at

View raw message