openjpa-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Patrick Linskey" <plins...@gmail.com>
Subject Re: @PostPersist woes
Date Sun, 18 Nov 2007 01:14:55 GMT
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