Hi Paul,
JIRA-1004 is for derived identity with IdClass. It appears that you did
not use @IdClass for identity. In this case, JIRA-1004 does not apply.
Fay
----- Original Message ----
From: Paul Copeland <[email protected]>
To: [email protected]
Sent: Wednesday, April 8, 2009 10:44:23 PM
Subject: Re: Identity class and parent/children entity relationship
Hi Fay -
Found my error here - my case now works on 1.2.1. I had a mapping error that
caused the reentrant flush exception -- this is probably not the problem fixed
by JIRA-1004.
This is the story - I have a class with a OneToMany relationship to itself
(parent has a collection of children of the same type). My mistake was to mark
the "optional" attribute false. Obviously somebody is the granddaddy with no
parent or you have a pathological cycle. So this works now -
@Table (name="product_category")
public class ProductCategory
implements java.io.Serializable
{
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Id private long id;
@OrderBy
@OneToMany(mappedBy="parentCategory", fetch=FetchType.LAZY,
cascade={CascadeType.PERSIST,CascadeType.REMOVE})
private List<ProductCategory> subCategories;
@ManyToOne(fetch=FetchType.LAZY,cascade=CascadeType.PERSIST)
private ProductCategory parentCategory;
}
On 4/7/2009 2:26 PM, Paul Copeland wrote:
> I also have a hard requirement to work with 1.x.x OpenJPA (JPA 1.0) for a
> production delivery same as Nemanja.
>
> So I am willing to jump through hoops for a work around even it means
> changing the identity type or doing lots of flushes or something else like
> that. Just wondering what my options are.
>
> I already tried doing flushes. Maybe I need to do a refresh too?
>
> - Paul
>
> On 4/7/2009 1:51 PM, Fay Wang wrote:
>> The fix is in JIRA-1004. I only checked in the fix to trunk, not 1.2.x,
>> though.
>>
>> -Fay
>>
>>
>>
>> ----- Original Message ----
>> From: Paul Copeland <[email protected]>
>> To: [email protected]
>> Sent: Tuesday, April 7, 2009 12:34:05 PM
>> Subject: Re: Identity class and parent/children entity relationship
>>
>> Is there a workaround for 1.2.1?
>>
>> I'm also hitting the reentrant flush exception with GenerationType.IDENTITY
>>
>>
>> On 3/30/2009 10:26 AM, Nemanja Joksovic wrote:
>>
>>> Thanks Fay,
>>>
>>> I tried it before and it's working fine. But in production environment I
>>> need to using stable OpenJPA 1.2.x version (JPA 1.0 specification).
>>>
>>> Regards,
>>> Nemanja J.
>>>
>>>
>>>
>>> The workaround is to use MappedById annotation (JPA 2.0 spec) in Openjpa
>>> trunk:
>>>
>>> @Entity
>>> public class Child implements Serializable {
>>>
>>> @EmbeddedId
>>> @Column(name = "id", unique = false, nullable = false)
>>> private ChildId childId;
>>>
>>> @MappedById("parent")
>>> @ManyToOne
>>> @JoinColumn(name = "parent_id", referencedColumnName = "id")
>>> private Parent parent;
>>>
>>> ...
>>> }
>>>
>>>
>>> @Embeddable
>>> public class ChildId {
>>> public long id;
>>> public long parent;
>>> ...}
>>>
>>>
>>> @Entity
>>> public class Parent {
>>> @Id
>>> @GeneratedValue(strategy = GenerationType.IDENTITY)
>>> @Column(name = "id", unique = true, insertable = false, updatable =
>>> false, nullable = false)
>>> private long id;
>>> @OneToMany(cascade = CascadeType.ALL, mappedBy = "parent")
>>> private List<Child> children = new ArrayList<Child>();
>>> private String name;
>>> ...}
>>>
>>>
>>> For more detail, please see
>>> org.apache.openjpa.persistence.enhance.identity.TestMappedById.testMappedById5
>>>
>>>
>>> -Fay
>>>
>>> --- On Mon, 3/30/09, Nemanja Joksovic <[email protected]> wrote:
>>>
>>>
>>>> From: Nemanja Joksovic <[email protected]>
>>>> Subject: Re: Identity class and parent/children entity relationship
>>>> To: [email protected]
>>>> Date: Monday, March 30, 2009, 9:56 AM
>>>> Thank you very much.
>>>>
>>>> Nemanja J.
>>>>
>>>>
>>>>
>>>> The second problem is a known problem. I will open a JIRA
>>>> for it.
>>>>
>>>>
>>>> --- On Sun, 3/29/09, Nemanja Joksovic
>>>> <[email protected]> wrote:
>>>>
>>>>
>>>>> From: Nemanja Joksovic <[email protected]>
>>>>> Subject: Identity class and parent/children entity
>>>>>
>>>> relationship
>>>>
>>>>> To: [email protected]
>>>>> Date: Sunday, March 29, 2009, 5:33 AM
>>>>> Hi all,
>>>>>
>>>>> I've been experiencing few problems with Identity
>>>>>
>>>> class
>>>>
>>>>> and Parent/Children entity relationship. I tried with
>>>>>
>>>> both
>>>>
>>>>> OpenJPA 1.2.1 and 2.0.0-SNAPSHOT. I have a very simple
>>>>>
>>>> test
>>>>
>>>>> case which can briefly explain problems:
>>>>>
>>>>> @Entity
>>>>> public class Parent implements Serializable {
>>>>>
>>>>> private long id;
>>>>> ....
>>>>> private List<Child> children = new
>>>>> LinkedList<Child>();
>>>>>
>>>>> @Id
>>>>> // @GeneratedValue(strategy =
>>>>>
>>>> GenerationType.IDENTITY)
>>>>
>>>>> @Column(name = "id", unique = true,
>>>>> insertable = false, updatable = false, nullable =
>>>>>
>>>> false)
>>>>
>>>>> public long getId() {
>>>>> return id;
>>>>> }
>>>>>
>>>>> public void setId(long id) {
>>>>> this.id = id;
>>>>> }
>>>>>
>>>>> ...
>>>>>
>>>>> @OneToMany(cascade = CascadeType.ALL, mappedBy =
>>>>> "parent")
>>>>> public List<Child> getChildren() {
>>>>> return children;
>>>>> }
>>>>>
>>>>> public void addChild(Child child) {
>>>>> if (child == null) {
>>>>> throw new
>>>>>
>>>> IllegalArgumentException("Cannot
>>>>
>>>>> add a null Child");
>>>>> }
>>>>> this.getChildren().add(child);
>>>>> }
>>>>>
>>>>> public void setChildren(List<Child>
>>>>>
>>>> children) {
>>>>
>>>>> this.children = children;
>>>>> }
>>>>> }
>>>>>
>>>>> @Entity
>>>>> @IdClass(ChildId.class)
>>>>> public class Child implements Serializable {
>>>>>
>>>>> private long id;
>>>>> ...
>>>>> private Parent parent;
>>>>>
>>>>> @Id
>>>>> @Column(name = "id", unique = false,
>>>>>
>>>> nullable
>>>>
>>>>> = false)
>>>>> public long getId() {
>>>>> return id;
>>>>> }
>>>>>
>>>>> public void setId(long id) {
>>>>> this.id = id;
>>>>> }
>>>>>
>>>>> ...
>>>>>
>>>>> @Id
>>>>> @ManyToOne
>>>>> @JoinColumn(name = "parent_id",
>>>>> referencedColumnName = "id")
>>>>> public Parent getParent() {
>>>>> return parent;
>>>>> }
>>>>>
>>>>> public void setParent(Parent parent) {
>>>>> this.parent = parent;
>>>>> }
>>>>> }
>>>>>
>>>>> ChidId is generated with the Application Identity
>>>>>
>>>> Tool:
>>>>
>>>>> public class ChildId implements Serializable {
>>>>> ...
>>>>> public long id;
>>>>> public long parent;
>>>>> ...
>>>>> }
>>>>>
>>>>> 1) Merge operation fail in any case with following
>>>>> exception:
>>>>>
>>>>> java.lang.NullPointerException
>>>>> at
>>>>>
>>>>>
>>>> net.company.persistence.Child.pcCopyKeyFieldsFromObjectId(Child.java)
>>>>
>>>>> at
>>>>>
>>>>>
>>>> net.company.persistence.Child.pcNewInstance(Child.java)
>>>>
>>>>> at
>>>>>
>>>>>
>>>> org.apache.openjpa.kernel.AttachStrategy.persist(AttachStrategy.java:93)
>>>>
>>>>> at
>>>>>
>>>>>
>>>> org.apache.openjpa.kernel.VersionAttachStrategy.attach(VersionAttachStrategy.java:100)
>>>>
>>>>
>>>>> at
>>>>>
>>>>>
>>>> org.apache.openjpa.kernel.AttachManager.attach(AttachManager.java:241)
>>>>
>>>>> at
>>>>>
>>>>>
>>>> org.apache.openjpa.kernel.AttachStrategy.attachCollection(AttachStrategy.java:333)
>>>>
>>>>
>>>>> at
>>>>>
>>>>>
>>>> org.apache.openjpa.kernel.AttachStrategy.replaceList(AttachStrategy.java:359)
>>>>
>>>>
>>>>> at
>>>>>
>>>>>
>>>> org.apache.openjpa.kernel.AttachStrategy.attachField(AttachStrategy.java:223)
>>>>
>>>>
>>>>> at
>>>>>
>>>>>
>>>> org.apache.openjpa.kernel.VersionAttachStrategy.attach(VersionAttachStrategy.java:153)
>>>>
>>>>
>>>>> at
>>>>>
>>>>>
>>>> org.apache.openjpa.kernel.AttachManager.attach(AttachManager.java:241)
>>>>
>>>>> at
>>>>>
>>>>>
>>>> org.apache.openjpa.kernel.AttachManager.attach(AttachManager.java:101)
>>>>
>>>>> at
>>>>>
>>>>>
>>>> org.apache.openjpa.kernel.BrokerImpl.attach(BrokerImpl.java:3212)
>>>>
>>>>> ... 25 more
>>>>>
>>>>>
>>>>> The problem is caused by the call
>>>>> pc.NewInstance(AttachStrategy:93) with null state
>>>>>
>>>> manager
>>>>
>>>>> instance which is used in
>>>>>
>>>> pcCopyKeyFieldsFromObjectId(..):
>>>>
>>>>>
>>>> pcsetParent((Parent)pcStateManager.getPCPrimaryKey(childid,
>>>>
>>>>> 2 + pcInheritedFieldCount));
>>>>>
>>>>> Also, for same problem exists JIRA Issue:
>>>>> https://issues.apache.org/jira/browse/OPENJPA-218
>>>>>
>>>>>
>>>>> 2) Persist working fine, but it's fail in the case
>>>>>
>>>> when
>>>>
>>>>> Parent.id is Generated Value field with following
>>>>>
>>>> exception:
>>>>
>>>>> <openjpa-1.2.1-r752877:753278 fatal user error>
>>>>> org.apache.openjpa.persistence.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.
>>>>> at
>>>>>
>>>>>
>>>> org.apache.openjpa.kernel.BrokerImpl.flushSafe(BrokerImpl.java:1904)
>>>>
>>>>> at
>>>>>
>>>>>
>>>> org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java:1679)
>>>>
>>>>> at
>>>>>
>>>>>
>>>> org.apache.openjpa.kernel.StateManagerImpl.assignObjectId(StateManagerImpl.java:524)
>>>>
>>>>
>>>>> at
>>>>>
>>>>>
>>>> org.apache.openjpa.kernel.StateManagerImpl.assignObjectId(StateManagerImpl.java:506)
>>>>
>>>>
>>>>> at
>>>>>
>>>>>
>>>> org.apache.openjpa.kernel.StateManagerImpl.fetchObjectId(StateManagerImpl.java:1434)
>>>>
>>>>
>>>>> at
>>>>>
>>>>>
>>>> net.company.persistence.Parent.pcFetchObjectId(Parent.java)
>>>>
>>>>> at
>>>>>
>>>>>
>>>> net.company.persistence.Child.pcCopyKeyFieldsToObjectId(Child.java)
>>>>
>>>>> Does exists some workaround for these problems ?
>>>>>
>>>>> Regards,
>>>>> Nemanja J.
>>>>> -- View this message in context:
>>>>>
>>>>>
>>>> http://n2.nabble.com/Identity-class-and-parent-children-entity-relationship-tp2552430p2552430.html
>>>>
>>>>
>>>>> Sent from the OpenJPA Users mailing list archive at
>>>>> Nabble.com.
>>>>>
>>>>
>>>>
>>>> -- View this message in context:
>>>> http://n2.nabble.com/Identity-class-and-parent-children-entity-relationship-tp2552430p2558373.html
>>>>
>>>> Sent from the OpenJPA Users mailing list archive at
>>>> Nabble.com.
>>>>
>>>
>>>
>>>
>>
>>
>>
>>
>>
>
>
>