openjpa-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Paul Copeland <t...@jotobjects.com>
Subject Re: Identity class and parent/children entity relationship
Date Tue, 07 Apr 2009 19:34:05 GMT
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 <joksovicn@gmail.com> wrote:
>
>   
>> From: Nemanja Joksovic <joksovicn@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
>> <joksovicn@gmail.com> wrote:
>>
>>     
>>> From: Nemanja Joksovic <joksovicn@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.
>>     
>
>
>       
>
>
>
>   


Mime
View raw message