You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@openjpa.apache.org by Nemanja Joksovic <jo...@gmail.com> on 2009/03/29 14:33:10 UTC

Identity class and parent/children entity relationship

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.


Re: Identity class and parent/children entity relationship

Posted by Fay Wang <fy...@yahoo.com>.
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 <te...@jotobjects.com>
To: users@openjpa.apache.org
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 <te...@jotobjects.com>
>> To: users@openjpa.apache.org
>> 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 <jo...@gmail.com> wrote:
>>> 
>>>    
>>>> From: Nemanja Joksovic <jo...@gmail.com>
>>>> Subject: Re: Identity class and parent/children entity relationship
>>>> To: users@openjpa.apache.org
>>>> 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
>>>> <jo...@gmail.com> wrote:
>>>> 
>>>>        
>>>>> From: Nemanja Joksovic <jo...@gmail.com>
>>>>> Subject: Identity class and parent/children entity
>>>>>              
>>>> relationship
>>>>        
>>>>> To: users@openjpa.apache.org
>>>>> 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.
>>>>          
>>>    
>>> 
>>>      
>> 
>> 
>>      
>> 
>>  
> 
> 
> 


      

Re: Identity class and parent/children entity relationship

Posted by Paul Copeland <te...@jotobjects.com>.
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 <te...@jotobjects.com>
>> To: users@openjpa.apache.org
>> 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 <jo...@gmail.com> wrote:
>>>
>>>  
>>>    
>>>> From: Nemanja Joksovic <jo...@gmail.com>
>>>> Subject: Re: Identity class and parent/children entity relationship
>>>> To: users@openjpa.apache.org
>>>> 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
>>>> <jo...@gmail.com> wrote:
>>>>
>>>>         
>>>>> From: Nemanja Joksovic <jo...@gmail.com>
>>>>> Subject: Identity class and parent/children entity
>>>>>              
>>>> relationship
>>>>         
>>>>> To: users@openjpa.apache.org
>>>>> 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.
>>>>          
>>>     
>>>
>>>
>>>  
>>>     
>>
>>
>>      
>>
>>
>>   
>
>
>


Re: Identity class and parent/children entity relationship

Posted by Paul Copeland <te...@jotobjects.com>.
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 <te...@jotobjects.com>
> To: users@openjpa.apache.org
> 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 <jo...@gmail.com> wrote:
>>
>>  
>>     
>>> From: Nemanja Joksovic <jo...@gmail.com>
>>> Subject: Re: Identity class and parent/children entity relationship
>>> To: users@openjpa.apache.org
>>> 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
>>> <jo...@gmail.com> wrote:
>>>
>>>    
>>>       
>>>> From: Nemanja Joksovic <jo...@gmail.com>
>>>> Subject: Identity class and parent/children entity
>>>>      
>>>>         
>>> relationship
>>>    
>>>       
>>>> To: users@openjpa.apache.org
>>>> 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.
>>>    
>>>       
>>      
>>
>>
>>
>>  
>>     
>
>
>       
>
>
>
>   


Re: Identity class and parent/children entity relationship

Posted by Fay Wang <fy...@yahoo.com>.
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 <te...@jotobjects.com>
To: users@openjpa.apache.org
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 <jo...@gmail.com> wrote:
>
>  
>> From: Nemanja Joksovic <jo...@gmail.com>
>> Subject: Re: Identity class and parent/children entity relationship
>> To: users@openjpa.apache.org
>> 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
>> <jo...@gmail.com> wrote:
>>
>>    
>>> From: Nemanja Joksovic <jo...@gmail.com>
>>> Subject: Identity class and parent/children entity
>>>      
>> relationship
>>    
>>> To: users@openjpa.apache.org
>>> 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.
>>    
>
>
>      
>
>
>
>  


      

Re: Identity class and parent/children entity relationship

Posted by Paul Copeland <te...@jotobjects.com>.
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 <jo...@gmail.com> wrote:
>
>   
>> From: Nemanja Joksovic <jo...@gmail.com>
>> Subject: Re: Identity class and parent/children entity relationship
>> To: users@openjpa.apache.org
>> 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
>> <jo...@gmail.com> wrote:
>>
>>     
>>> From: Nemanja Joksovic <jo...@gmail.com>
>>> Subject: Identity class and parent/children entity
>>>       
>> relationship
>>     
>>> To: users@openjpa.apache.org
>>> 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.
>>     
>
>
>       
>
>
>
>   


Re: Identity class and parent/children entity relationship

Posted by Nemanja Joksovic <jo...@gmail.com>.
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 <jo...@gmail.com> wrote:

> From: Nemanja Joksovic <jo...@gmail.com>
> Subject: Re: Identity class and parent/children entity relationship
> To: users@openjpa.apache.org
> 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
> <jo...@gmail.com> wrote:
> 
> > From: Nemanja Joksovic <jo...@gmail.com>
> > Subject: Identity class and parent/children entity
> relationship
> > To: users@openjpa.apache.org
> > 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.


      



-- 
View this message in context: http://n2.nabble.com/Identity-class-and-parent-children-entity-relationship-tp2552430p2558574.html
Sent from the OpenJPA Users mailing list archive at Nabble.com.


Re: Identity class and parent/children entity relationship

Posted by Fay Wang <fy...@yahoo.com>.
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 <jo...@gmail.com> wrote:

> From: Nemanja Joksovic <jo...@gmail.com>
> Subject: Re: Identity class and parent/children entity relationship
> To: users@openjpa.apache.org
> 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
> <jo...@gmail.com> wrote:
> 
> > From: Nemanja Joksovic <jo...@gmail.com>
> > Subject: Identity class and parent/children entity
> relationship
> > To: users@openjpa.apache.org
> > 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.


      

Re: Identity class and parent/children entity relationship

Posted by Nemanja Joksovic <jo...@gmail.com>.
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 <jo...@gmail.com> wrote:

> From: Nemanja Joksovic <jo...@gmail.com>
> Subject: Identity class and parent/children entity relationship
> To: users@openjpa.apache.org
> 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.


Re: Identity class and parent/children entity relationship

Posted by Fay Wang <fy...@yahoo.com>.
The second problem is a known problem. I will open a JIRA for it.


--- On Sun, 3/29/09, Nemanja Joksovic <jo...@gmail.com> wrote:

> From: Nemanja Joksovic <jo...@gmail.com>
> Subject: Identity class and parent/children entity relationship
> To: users@openjpa.apache.org
> 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.