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
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>
>>>>>
>>>>>
>>>
>