openjpa-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Geir Magnusson Jr." <g...@pobox.com>
Subject Re: @PostPersist woes
Date Sun, 18 Nov 2007 01:18:57 GMT
sure but doesn't it boil down to the problem of the nesting of A  
trying to get it's own Id, which triggered the @PostPersist for B,  
which let do the pathos and misery reported?

geir

On Nov 17, 2007, at 8:14 PM, Patrick Linskey wrote:

> I'm just pointing out that there is more to your situation than your
> description to Craig.
>
> -Patrick
>
> On Nov 17, 2007 5:12 PM, Geir Magnusson Jr. <geir@pobox.com> wrote:
>>
>> On Nov 17, 2007, at 7:49 PM, Patrick Linskey wrote:
>>
>>> I think that there was a bit more to it... I think that you were  
>>> also
>>> trying to do something that required getting the OID during a
>>> @PostPersist, right?
>>
>> I thought I could do that. The spec seems to say that.
>>
>> A needs it's own PK.  B needs it's own PK.  But  B doesn't need to
>> know A's PK for the action it takes in the @PostPersist method.
>>
>>
>>
>>>
>>>
>>> -Patrick
>>>
>>> On Nov 17, 2007 12:26 PM, Geir Magnusson Jr. <geir@pobox.com> wrote:
>>>>
>>>> On Nov 16, 2007, at 3:00 PM, Craig L Russell wrote:
>>>>
>>>>> Hi Geir,
>>>>>
>>>>> It still isn't clear to me what you are trying to accomplish.  
>>>>> Would
>>>>> it be possible for you to describe what the goal is? (I might have
>>>>> missed the key idea in earlier posts...)
>>>>>
>>>>
>>>> Persist an object graph in which object A that has a auto-gen PK
>>>> and a
>>>> reference to object B, such that object B has a PK and a  
>>>> reference to
>>>> object A via a FK in table B.
>>>>
>>>> I found a workaround for now.  I need to see if Hibernate can do
>>>> this.  I think it can.  I realize that depending on that isn't
>>>> portable, but it sure was convenient.
>>>>
>>>> geir
>>>>
>>>>
>>>>
>>>>> Craig
>>>>>
>>>>> On Nov 15, 2007, at 1:59 PM, Geir Magnusson Jr. wrote:
>>>>>
>>>>>>
>>>>>> On Nov 15, 2007, at 4:41 PM, Geir Magnusson Jr. wrote:
>>>>>>
>>>>>>>
>>>>>>> On Nov 15, 2007, at 4:34 PM, Pinaki Poddar wrote:
>>>>>>>
>>>>>>>>> persist() has in it a new, unmanaged entity.
>>>>>>>>
>>>>>>>> a) If persist(a) is failing on b, what is the cascade type
>>>>>>>> specified on
>>>>>>>> relation a.b?
>>>>>>>
>>>>>>> I'm not actually sure that it's failing on b. I guess I can 

>>>>>>> try to
>>>>>>> figure that out.  I just know that when  I change things so 

>>>>>>> that I
>>>>>>> have an unmanaged b, it fails.
>>>>>>
>>>>>> So I put some printlns in my @PostPersist routine, and I see that
>>>>>> for something w/o the reference to an unmanaged entity, I get a
>>>>>> sequence like this :
>>>>>>
>>>>>> [junit-coverage] ###### 1 I'm a class com.joost.model.show.Show
>>>>>> [junit-coverage] ###### 2 I'm a class com.joost.model.show.Show
>>>>>> [junit-coverage] 7996  pu  TRACE  [main] openjpa.jdbc.SQL - <t
>>>>>> 9777317, conn 7891417> executing prepstmnt 9148991 INSERT INTO
>>>>>> APP.INVENTORYITEM (CHANGENUMBER, COID, CREATIONDATE, DELETED,
>>>>>> FIRSTPUBLICATIONDATE, LASTMODIFICATIONDATE,  
>>>>>> LATESTPUBLICATIONDATE,
>>>>>> NAME, OKTOPUBLISH, PUBLICID, PUBLISHED, UUID, ITEMTYPE, DAMID,
>>>>>> OWNERID) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
>>>>>> [params=(null) null, (null) null, (Timestamp) 2007-11-15
>>>>>> 16:51:04.42, (int) 0, (null) null, (Timestamp) 2007-11-15
>>>>>> 16:51:04.42, (null) null, (String) a, (int) 0, (null) null, (int)
>>>>>> 0, (String) 007ddeca-edff-4657-927f-ce77205c28ef, (String)
>>>>>> VideoShow, (int) 10, (int) 10]
>>>>>> [junit-coverage] 7997  pu  TRACE  [main] openjpa.jdbc.SQL - <t
>>>>>> 9777317, conn 7891417> [1 ms] spent
>>>>>> [junit-coverage] 7997  pu  TRACE  [main] openjpa.jdbc.SQL - <t
>>>>>> 9777317, conn 7891417> executing prepstmnt 13415937
>>>>>> VALUES(IDENTITY_VAL_LOCAL())
>>>>>> [junit-coverage] 7997  pu  TRACE  [main] openjpa.jdbc.SQL - <t
>>>>>> 9777317, conn 7891417> [0 ms] spent
>>>>>> [junit-coverage] 8004  pu  TRACE  [main] openjpa.jdbc.SQL - <t
>>>>>> 9777317, conn 7891417> executing prepstmnt 6406303 INSERT INTO
>>>>>> APP.VIDEOSHOW (ID, ADSFREE, CODURATION, COFILENAME,
>>>>>> MAINDESCRIPTION, MAINTITLE, MINAGE, PRODUCTIONYEARS,  
>>>>>> ISPROMOTIONAL,
>>>>>> RIGHTS, VALIDFROM, VALIDTO, ADVERTISINGSHOWINFOID,
>>>>>> GEORIGHTSKINDCODE, MAINCHANNELID, MAINDESCRIPTIONLANGUAGECODE,
>>>>>> MAINTITLELANGUAGECODE, OVERLAYID, SELECTEDTHUMBNAILID) VALUES
>>>>>> (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
>>>>>> [params=(int) 74, (int) 0, (null) null, (null) null, (null) null,
>>>>>> (null) null, (null) null, (null) null, (int) 0, (null) null,  
>>>>>> (null)
>>>>>> null, (null) null, (null) null, (int) 3, (null) null, (null)  
>>>>>> null,
>>>>>> (null) null, (null) null, (null) null]
>>>>>> [junit-coverage] 8006  pu  TRACE  [main] openjpa.jdbc.SQL - <t
>>>>>> 9777317, conn 7891417> [2 ms] spent
>>>>>> [junit-coverage] ###### 3 I'm a class com.joost.model.show.Show
>>>>>> [junit-coverage] ###### 4 I'm a class com.joost.model.show.Show
>>>>>>
>>>>>> The code after the ###### 2 message is a getId(), and that  
>>>>>> triggers
>>>>>> the write to the db.  You can see that we write to both
>>>>>> InventoryItem (the base class) and then VideoShow  (java class  
>>>>>> Show
>>>>>> maps to the VideoShow table...    public class Show extends
>>>>>> InventoryItem)
>>>>>>
>>>>>> However, for the case of "b" within "a", which is a ChannelItem
>>>>>> within a Channel (both of which extend InventoryItem) I get :
>>>>>>
>>>>>> [junit-coverage] ###### 1 I'm a class
>>>>>> com.joost.model.channel.Channel
>>>>>> [junit-coverage] ###### 2 I'm a class
>>>>>> com.joost.model.channel.Channel
>>>>>> [junit-coverage] ###### 1 I'm a class com.joost.model.ChannelItem
>>>>>> [junit-coverage] ###### 2 I'm a class com.joost.model.ChannelItem
>>>>>> [junit-coverage] Nov 15, 2007 4:51:04 PM
>>>>>> org.springframework.test.AbstractTransactionalSpringContextTests
>>>>>> endTransaction
>>>>>> [junit-coverage] INFO: Rolled back transaction after test  
>>>>>> execution
>>>>>> [junit-coverage] ------------- ---------------- ---------------
>>>>>>             <EXCEPTION>
>>>>>>
>>>>>> so the getId() for the Channel ("a") called after the #### 2
>>>>>> message triggers the @PostPersist for the ChannelItem ("b") which
>>>>>> has a reference to the id for Channel.  I think that therefore I
>>>>>> can conclude that what I'm doing is illegal according to the spec
>>>>>>
>>>>>> 3.5.2 : It isimplementation-dependent as to whether callback
>>>>>> methods are invoked before or after the cascading of the  
>>>>>> lifecycle
>>>>>> events to related entities. Applications should not depend on  
>>>>>> this
>>>>>> ordering.
>>>>>>
>>>>>> and therefore if that's true, I'm sorry for wasting your time :)
>>>>>>
>>>>>> Anyone have a clue how I can get out of this mess?
>>>>>>
>>>>>> geir
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>>
>>>>>>>> b) what is the identity definition on b?
>>>>>>>> c) if b is using auto-assigned GeneratedValue or its id is
 
>>>>>>>> being
>>>>>>>> set by
>>>>>>>> application?
>>>>>>>>
>>>>>>>> -----Original Message-----
>>>>>>>> From: Geir Magnusson Jr. [mailto:geir@pobox.com]
>>>>>>>> Sent: Thursday, November 15, 2007 11:10 AM
>>>>>>>> To: dev@openjpa.apache.org
>>>>>>>> Subject: @PostPersist woes
>>>>>>>>
>>>>>>>> Woe is me :)
>>>>>>>>
>>>>>>>> I'm using @PostPersist to create some kind of machine-generated
>>>>>>>> data for
>>>>>>>> entities on insert, and I'm running into the following problem
>>>>>>>> when an
>>>>>>>> entity for which I called persist() has in it a new, unmanaged
>>>>>>>> entity.
>>>>>>>>
>>>>>>>> [junit-coverage] Caused by: <openjpa-1.0.0-r420667:568756
fatal
>>>>>>>> user
>>>>>>>> error> org.apache.openjpa.util.InvalidStateException:
Detected
>>>>>>>> reentrant flush.  Make sure your flush-time instance callback
>>>>>>>> methods or
>>>>>>>> event listeners do not invoke any operations that require
the  
>>>>>>>> in-
>>>>>>>> progress flush to complete.
>>>>>>>> [junit-coverage]   at
>>>>>>>> org.apache.openjpa.kernel.BrokerImpl.flushSafe(BrokerImpl.java:
>>>>>>>> 1840)
>>>>>>>> [junit-coverage]   at
>>>>>>>> org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java:

>>>>>>>> 1615)
>>>>>>>> [junit-coverage]   at
>>>>>>>> org
>>>>>>>> .apache
>>>>>>>> .openjpa
>>>>>>>> .kernel.StateManagerImpl.assignObjectId(StateManagerImpl.java:
>>>>>>>> 505)
>>>>>>>> [junit-coverage]   at
>>>>>>>> org
>>>>>>>> .apache
>>>>>>>> .openjpa
>>>>>>>> .kernel.StateManagerImpl.assignField(StateManagerImpl.java:590)
>>>>>>>> [junit-coverage]   at
>>>>>>>> org
>>>>>>>> .apache
>>>>>>>> .openjpa
>>>>>>>> .kernel 
>>>>>>>> .StateManagerImpl.beforeAccessField(StateManagerImpl.java:
>>>>>>>> 1451)
>>>>>>>> [junit-coverage]   at
>>>>>>>> org
>>>>>>>> .apache
>>>>>>>> .openjpa
>>>>>>>> .kernel.StateManagerImpl.accessingField(StateManagerImpl.java:
>>>>>>>> 1434)
>>>>>>>> [junit-coverage]   at
>>>>>>>> com.joost.model.InventoryItem.getId(InventoryItem.java)
>>>>>>>> [junit-coverage]   at
>>>>>>>> com
>>>>>>>> .joost 
>>>>>>>> .model.InventoryItem.initPublicIdIfNull(InventoryItem.java:
>>>>>>>> 331)
>>>>>>>>
>>>>>>>>
>>>>>>>> in InventoryItem, getId is the PK, and my read of the spec
says
>>>>>>>> that I
>>>>>>>> am guaranteed to have it in @PostPersist.
>>>>>>>>
>>>>>>>> Bug?  me doing something wrong?
>>>>>>>>
>>>>>>>> geir
>>>>>>>>
>>>>>>>>
>>>>>>>> Notice:  This email message, together with any attachments,
may
>>>>>>>> contain information  of  BEA Systems,  Inc.,  its subsidiaries
>>>>>>>> and  affiliated entities,  that may be confidential,
>>>>>>>> proprietary,  copyrighted  and/or legally privileged, and
is
>>>>>>>> intended solely for the use of the individual or entity named
 
>>>>>>>> in
>>>>>>>> this message. If you are not the intended recipient, and
have
>>>>>>>> received this message in error, please immediately return
 
>>>>>>>> this by
>>>>>>>> email and then delete it.
>>>>>>>
>>>>>>
>>>>>
>>>>> Craig Russell
>>>>> Architect, Sun Java Enterprise System http://java.sun.com/products/jdo
>>>>> 408 276-5638 mailto:Craig.Russell@sun.com
>>>>> P.S. A good JDO? O, Gasp!
>>>>>
>>>>
>>>>
>>>
>>>
>>>
>>> --
>>> Patrick Linskey
>>> 202 669 5907
>>
>>
>
>
>
> -- 
> Patrick Linskey
> 202 669 5907


Mime
View raw message