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 Sat, 17 Nov 2007 20:26:22 GMT

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


Mime
View raw message