Hi,
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();
assertNotNull(list);
assertTrue(java.util.List.class.isInstance(list));
assertNotSame(java.util.ArrayList.class, list.getClass());
list.add(new MyPcObject());
owner.setMyPcList(list);
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
>
Craig L Russell
Architect, Sun Java Enterprise System http://db.apache.org/jdo
408 276-5638 mailto:[email protected]
P.S. A good JDO? O, Gasp!
-----
Pinaki Poddar http://ppoddar.blogspot.com/
http://www.linkedin.com/in/pinakipoddar
OpenJPA PMC Member/Committer
JPA Expert Group Member
--
View this message in context:
http://n2.nabble.com/Does-OpenJPA-replace-Collections--tp2603384p2604361.html
Sent from the OpenJPA Users mailing list archive at Nabble.com.