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 16:08:12 -0700

Ellen,

Are you adding a file category to a study before passing it back?
Is 'fileCategories' marked as FetchType.EAGER when you pass a
study to the client (ToMany relationship defaults to LAZY fetching),
or do you prefetch the relationships? If not, does it make a difference
if you do?

thanks,
-marina

Ellen Kraffmiller wrote:
> Thanks Marina, please see my comments
> -Ellen
>
> Marina Vatkina wrote:
>
>> 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);
>>
>>
> Right, I forgot about that when I was doing the test.
>
>>>
>>> }
>>>
>>> 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'?
>
>
> Yes, that was a typo.
>
>>
>>> 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);
>>
>>
> This may work, but it doesn't really fit our requirements. Our example
> is simplified to show what is happening in one code snippet. Just to
> give you a background on what we are doing, we are implementing a
> standard web application with forms for updating a Study and all its
> related data. So, in this case, we are getting a Study entitiy from the
> database, presenting a form to the user where he can update the file
> categories for the Study (as well as other dependent entities), then
> calling a session bean method that attempts to merge the Study to the
> database. We can't add the fileCategory object after merging the study,
> because the study being passed to the session bean already has all the
> file category data (and other dependent collections) set.
>
>>
>> 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
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>
>>