persistence@glassfish.java.net

Re: Trting to add new child entity; getting OptimisticLockException

From: Marina Vatkina <Marina.Vatkina_at_Sun.COM>
Date: Thu, 28 Sep 2006 15:12:14 -0700

Ellen,

Ellen Kraffmiller wrote:
> Hi Gordon & Marina,
> After doing more testing, the problem seems to be related to using a
> detached entity. In our original example, the study object we are
> merging was previously detached and sent to the web tier. I tried the
> same logic with a Study entity that is managed, and it works.
>
> So, to summarize, this works:
> doUpdate(Long id) {
> Study study = em.find(Study.class, id);
> FileCategory c = new FileCategory();
> c.setName( "test" );
> c.setStudy(study);
> study.getFileCategories().add(c);

You do not need to merge a managed instance, assuming you have cascade
PERSIST or ALL set:

> em.merge(study);
> }
>
> But the following throws an Opimistic Lock Exception:
> (No modifications to the fileCategories collection were made while the
> study was detached.)
>
> doUpdate(Study detachedStudy) {
> FileCategory c = new FileCategory();
> c.setName( "test" );
> c.setStudy(study);

Do you mean 'detachedStudy'?

> study.getFileCategories().add(c);
> em.merge(study);

Does the opposite works (with appropriate cascade settings)?

      em.merge(study);

      FileCategory c = new FileCategory();
      c.setName( "test" );
      c.setStudy(study);
      study.getFileCategories().add(c);



thanks,
-marina

> }
>
> Is something we need to be doing differently to merge the detached study?
>
> Thanks,
> Ellen
>
> Marina Vatkina wrote:
>
>> Gordon,
>>
>> Is there a way to check which exactly PK causes this error?
>> Can it be that there is another FileCategory instance that
>> is the problem?
>>
>> thanks,
>> -marina
>>
>> Gordon Yorke wrote:
>>
>>> Nothing jumps out as an issue, if you are not on the latest version
>>> of TopLink Essentials I would recommend updating your TopLink
>>> Essentials jar and if the problem persists file a glassfish issue
>>> with testcase.
>>> --Gordon
>>>
>>> -----Original Message-----
>>> From: Ellen Kraffmiller [mailto:ekraffmiller_at_hmdc.harvard.edu]
>>> Sent: Thursday, September 28, 2006 11:24 AM
>>> To: persistence_at_glassfish.dev.java.net
>>> Subject: Re: Trting to add new child entity; getting
>>> OptimisticLockException
>>>
>>>
>>> The version is being left as null - we are never setting it.
>>> Thanks,
>>> Ellen
>>>
>>> Gordon Yorke wrote:
>>>
>>>
>>>> Hello Ellen,
>>>> In the constrctor of FileCategory is version being initialized to
>>>> new Long(X) or being left as null?
>>>> --Gordon
>>>>
>>>> -----Original Message-----
>>>> From: Ellen Kraffmiller [mailto:ekraffmiller_at_hmdc.harvard.edu]
>>>> Sent: Thursday, September 28, 2006 10:27 AM
>>>> To: persistence_at_glassfish.dev.java.net
>>>> Subject: Re: Trting to add new child entity; getting
>>>> OptimisticLockException
>>>>
>>>>
>>>> Hi Gordon,
>>>> I am working with Gustavo on this problem so I thought I'd answer your
>>>> questions. The version field is defined as:
>>>>
>>>> @Version
>>>> private Long version;
>>>> (with normal getters and setters)
>>>>
>>>> We are using SostgreSQL, and the database column is version, int8.
>>>>
>>>> Thanks,
>>>> Ellen
>>>>
>>>> Gordon Yorke wrote:
>>>>
>>>>
>>>>
>>>>
>>>>> Hello Gustavo,
>>>>> What is the version field in FileCategory being initialized to?
>>>>> What type is the version field?
>>>>> --Gordon
>>>>>
>>>>> -----Original Message-----
>>>>> From: gdurand_at_hmdc.harvard.edu [mailto:gdurand_at_hmdc.harvard.edu]
>>>>> Sent: Wednesday, September 27, 2006 5:57 PM
>>>>> To: persistence_at_glassfish.dev.java.net
>>>>> Subject: Trting to add new child entity; getting
>>>>> OptimisticLockException
>>>>>
>>>>>
>>>>> Hi,
>>>>>
>>>>> I'm am trying a very simple example and am getting a problem
>>>>> (I am using glassfish v2 milestone 1):
>>>>>
>>>>> Our DB has a Study entity which has a one to many relationship
>>>>> with a FileCategory entity.
>>>>>
>>>>> When I try to add a FileCategory to an existing study:
>>>>>
>>>>> Collection categories = study.getFileCategories();
>>>>>
>>>>> FileCategory c = new FileCategory();
>>>>> c.setName( "test" );
>>>>>
>>>>>
>>>>> c.setStudy(study);
>>>>> categories.add(c);
>>>>>
>>>>> em.merge(study);
>>>>>
>>>>> I am getting:
>>>>>
>>>>> Exception Details:
>>>>> oracle.toplink.essentials.exceptions.OptimisticLockException
>>>>> Exception Description: The object
>>>>> [edu.harvard.hmdc.vdcnet.study.FileCategory_at_1f1c748] cannot be merged
>>>>> because it has changed or been deleted since it was last read.
>>>>> {3}Class> edu.harvard.hmdc.vdcnet.study.FileCategory
>>>>>
>>>>>
>>>>>
>>>>> Any ideas why this is happening, since the FileCategory doesn't exist
>>>>> in the first place? (I have seen an example in the O'Reilly book that
>>>>> pretty much does just this)?
>>>>>
>>>>> Thanks,
>>>>> Gustavo
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>
>>>>
>>>>
>>