openjpa-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Fay Wang <fyw...@yahoo.com>
Subject RE: ArrayIndexOutOfBoundsException in org.apache.openjpa.util.ApplicationIds$PrimaryKeyFieldManager.retrieve
Date Tue, 03 Mar 2009 23:26:42 GMT

Yes, with your test case, I did see the problem. The difference between our test cases is
that in your test case, you have pre-created/populated the tables, while I let openjpa to
create and populate the tables for me. Let me take a look to see why this causes the ArrayIndexOutOfBoundsException.

Regards,
Fay 


--- On Tue, 3/3/09, Michael Vorburger <mvorburger@odyssey-group.com> wrote:

> From: Michael Vorburger <mvorburger@odyssey-group.com>
> Subject: RE: ArrayIndexOutOfBoundsException in org.apache.openjpa.util.ApplicationIds$PrimaryKeyFieldManager.retrieve
> To: users@openjpa.apache.org
> Date: Tuesday, March 3, 2009, 2:51 PM
> Hello Fay,
> 
> Uhm, I fiddled with the "infrastructure" of your
> ZIP a bit (NO code changed, but Mavenized, added a
> missing/forgotten persistence.xml, two CREATE TABLE and
> INSERT INTO), and voilà, run a "mvn clean test"
> on the attached updated test package and you'll see the
> problem!  Do you confirm?
> 
> Regards,
> Michael
> 
> -----Original Message-----
> From: Fay Wang [mailto:fyw300@yahoo.com] 
> Sent: Tuesday, March 03, 2009 10:21 PM
> To: users@openjpa.apache.org
> Subject: Re: ArrayIndexOutOfBoundsException in
> org.apache.openjpa.util.ApplicationIds$PrimaryKeyFieldManager.retrieve
> 
> Hmmm. I could not reproduce the error using your domain
> model in 1.2.0 and trunk. Attached is the test case. Could
> you run it to see it passes?
> 
> Regards,
> Fay
>  
> 
> 
> --- On Tue, 3/3/09, Michael Vorburger
> <mvorburger@odyssey-group.com> wrote:
> 
> > From: Michael Vorburger
> <mvorburger@odyssey-group.com>
> > Subject: ArrayIndexOutOfBoundsException in 
> >
> org.apache.openjpa.util.ApplicationIds$PrimaryKeyFieldManager.retrieve
> > To: users@openjpa.apache.org
> > Date: Tuesday, March 3, 2009, 11:57 AM Hello,
> >  
> > I'm getting a ArrayIndexOutOfBoundsException in 
> >
> org.apache.openjpa.util.ApplicationIds$PrimaryKeyFieldManager.retrieve
> > (A pplicationIds.java:602), full stack trace below.
> >  
> > This occurs when I try to use application ID Identity
> Hierarchies as 
> > per 
> >
> http://openjpa.apache.org/builds/1.2.0/apache-openjpa-1.2.0/docs/manua
> > l/
> jpa_overview_pc_identity.html#jpa_overview_pc_identity_hierarchy,
> > may be
> > because I was trying to use them together with
> Entities as Identity 
> > Fields as per 
> >
> http://openjpa.apache.org/builds/1.2.0/apache-openjpa-1.2.0/docs/manua
> > l/ ref_guide_pc_oid.html#ref_guide_pc_oid_entitypk ...
> > 
> > Both of this is not JPA 1.0 spec, is it? Will this
> later be possible 
> > via standard in JPA 2.0? Is there a "better"
> (in the sense of spec
> > compliant) way to do this, or a workaround or even
> better bug fix for 
> > OpenJPA? Here is an attempt to sketch out the model
> that this occurs
> > with:
> >  
> > @javax.persistence.Entity(name =
> "DictLabel")
> > @IdClass(DictLabelId.class)
> > @javax.persistence.Table(name =
> "dict_label_vw") 
> > @javax.persistence.Inheritance(strategy =
> > InheritanceType.SINGLE_TABLE)
> > @DiscriminatorColumn(name="entity_dict_id",
> > discriminatorType=DiscriminatorType.INTEGER)
> > public abstract class DictLabelEntity {
> >  
> >  @Basic(optional = false)
> >  @javax.persistence.Column(name = "name",
> nullable = false)  private 
> > String name;
> >  
> >  @Id
> >  @javax.persistence.ManyToOne(cascade =
> {CascadeType.PERSIST,
> >    CascadeType.MERGE, CascadeType.REFRESH}, fetch =
> FetchType.LAZY, 
> > optional = false)  @javax.persistence.JoinColumn(name
> = 
> > "language_dict_id", nullable =
> > false)
> >  private DictLanguageEntity language;
> >  
> >  @Id
> >  @Basic(optional = false)
> >  @javax.persistence.Column(name =
> > "entity_dict_id", nullable = false)
> >  private long entityRef;
> > }
> > 
> > @Entity(name = "DictLanguageLabel")
> > @IdClass(DictLanguageLabelId.class)
> > @DiscriminatorValue(value="1106")
> > public class DictLanguageLabelEntity extends
> DictLabelEntity {
> >  
> >     @Id
> >     @javax.persistence.ManyToOne(cascade =
> {CascadeType.PERSIST,
> >             CascadeType.MERGE, CascadeType.REFRESH},
> fetch = 
> > FetchType.LAZY, optional = false)
> >     @javax.persistence.JoinColumn(name =
> "object_dict_id", nullable =
> > false)
> >     private DictLanguageEntity forLanguage; }
> > 
> > public abstract class DictLabelId implements
> Serializable {
> >     public long language;
> >     public long entityRef;
> >     // ... equals() ... hashCode() ...
> > }
> > 
> > public class DictLanguageLabelId extends DictLabelId {
> >     public long forLanguage;
> >     // ... equals() ... hashCode() ...
> > }
> >  
> > With this, a simple query for "SELECT l FROM
> DictLanguageLabel l" 
> > leads to the exception below.
> > 
> > The DictLanguageEntity is another entity deliberately
> omitted, it's a 
> > "standard" one with a simple @Id private
> long id.
> >  If this model seems
> > to make little sense, I have to admit that it is
> simplified, as in 
> > real life there are other subclasses of
> DictLabelEntity, where that 
> > object_dict_id is a ManyToOne to other entities than 
> > DictLanguageEntity.
> > 
> > I actually found a work-around, as follows: No
> DictLanguageLabelId 
> > extends DictLabelId (and no @IdClass on
> DictLanguageLabelEntity), and 
> > make DictLabelId not abstract.  Then add the following
> to the 
> > DictLabelEntity to "double map" that
> "object_dict_id" column (which is 
> > also mapped in the DictLanguageLabelEntity subclass),
> and remove the 
> > @Id from the forLanguage in DictLanguageLabelEntity:
> > 
> >     @Id
> >     @Basic(optional = false)
> >     @javax.persistence.Column(name =
> > "object_dict_id", nullable = false)
> >     private long objectRef;
> > 
> > and add a public long objectRef; to the DictLabelId
> (with updated
> > equals() and hashCode()).  seems to work, but is
> clearly a work-around 
> > for what appears to be a bug...
> > 
> > Regards,
> > Michael
> >  
> > ___
> > <openjpa-1.2.0-r422266:683325 nonfatal user
> error>
> > org.apache.openjpa.persistence.ArgumentException: 2 
> at
> >
> org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:814)
> >  at
> >
> org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:775)
> >  at
> >
> org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:771)
> >  at
> >
> org.apache.openjpa.kernel.DelegatingQuery.execute(DelegatingQuery.java
> > :5
> > 17)
> >  at
> >
> org.apache.openjpa.persistence.QueryImpl.execute(QueryImpl.java:254)
> >  at
> >
> org.apache.openjpa.persistence.QueryImpl.getResultList(QueryImpl.java:
> > 29
> > 3)
> >  at
> >
> com.odcgroup.tangij.nls.LabelsDAO.getAllLabels(LabelsDAO.java:38)
> >  at
> >
> com.odcgroup.tangij.nls.LabelsDAOTest.testLabels(LabelsDAOTest.java:34
> > )  at
> sun.reflect.NativeMethodAccessorImpl.invoke0(Native
> > Method)
> >  at
> >
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.j
> > av
> > a:39)
> >  at
> >
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccess
> > or
> > Impl.java:25)
> >  at java.lang.reflect.Method.invoke(Method.java:597)
> >  at
> >
> org.junit.internal.runners.TestMethod.invoke(TestMethod.java:59)
> >  at
> >
> org.junit.internal.runners.MethodRoadie.runTestMethod(MethodRoadie.java:
> > 98)
> >  at
> >
> org.junit.internal.runners.MethodRoadie$2.run(MethodRoadie.java:79)
> >  at
> >
> org.junit.internal.runners.MethodRoadie.runBeforesThenTestThenAfters(M
> > et
> > hodRoadie.java:87)
> >  at
> >
> org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:77)
> >  at
> >
> org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:42)
> >  at
> >
> org.junit.internal.runners.JUnit4ClassRunner.invokeTestMethod(JUnit4Cl
> > as
> > sRunner.java:88)
> >  at
> >
> org.junit.internal.runners.JUnit4ClassRunner.runMethods(JUnit4ClassRun
> > ne
> > r.java:51)
> >  at
> >
> org.junit.internal.runners.JUnit4ClassRunner$1.run(JUnit4ClassRunner.j
> > av
> > a:44)
> >  at
> >
> org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java
> > :2
> > 7)
> >  at
> >
> org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:3
> > 7)
> >  at
> >
> org.junit.internal.runners.JUnit4ClassRunner.run(JUnit4ClassRunner.java:
> > 42)
> >  at
> >
> org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4T
> > es
> > tReference.java:38)
> >  at
> >
> org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.
> > ja
> > va:38)
> >  at
> >
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(Remote
> > Te
> > stRunner.java:460)
> >  at
> >
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(Remote
> > Te
> > stRunner.java:673)
> >  at
> >
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestR
> > un
> > ner.java:386)
> >  at
> >
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTest
> > Ru
> > nner.java:196)
> > Caused by: java.lang.ArrayIndexOutOfBoundsException: 2
>  at 
> >
> org.apache.openjpa.util.ApplicationIds$PrimaryKeyFieldManager.retrieve
> > (A
> > pplicationIds.java:602)
> >  at
> >
> org.apache.openjpa.util.ApplicationIds$PrimaryKeyFieldManager.fetchLon
> > gF
> > ield(ApplicationIds.java:578)
> >  at
> >
> com.odcgroup.tangij.domainmodel.DictLanguageLabelEntity.pcCopyKeyField
> > sT
> > oObjectId(DictLanguageLabelEntity.java)
> >  at
> >
> org.apache.openjpa.enhance.PCRegistry.copyKeyFieldsToObjectId(PCRegist
> > ry
> > .java:172)
> >  at
> >
> org.apache.openjpa.util.ApplicationIds.fromPKValues(ApplicationIds.java:
> > 218)
> >  at
> >
> org.apache.openjpa.jdbc.meta.ClassMapping.getObjectId(ClassMapping.java:
> > 213)
> >  at
> >
> org.apache.openjpa.jdbc.meta.ClassMapping.getObjectId(ClassMapping.java:
> > 150)
> >  at
> >
> org.apache.openjpa.jdbc.kernel.JDBCStoreManager.load(JDBCStoreManager.
> > ja
> > va:910)
> >  at
> >
> org.apache.openjpa.jdbc.sql.AbstractResult.load(AbstractResult.java:27
> > 8)
> >  at
> >
> org.apache.openjpa.jdbc.sql.SelectImpl$SelectResult.load(SelectImpl.ja
> > va
> > :2391)
> >  at
> >
> org.apache.openjpa.jdbc.sql.AbstractResult.load(AbstractResult.java:27
> > 2)
> >  at
> >
> org.apache.openjpa.jdbc.kernel.InstanceResultObjectProvider.getResultO
> > bj
> > ect(InstanceResultObjectProvider.java:59)
> >  at
> >
> org.apache.openjpa.lib.rop.EagerResultList.<init>(EagerResultList.java
> > :3
> > 6)
> >  at
> >
> org.apache.openjpa.kernel.QueryImpl.toResult(QueryImpl.java:1228)
> >  at
> >
> org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:990)
> >  at
> >
> org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:805)
> >  ... 29 more
> > 
> > 
> >
> ____________________________________________________________
> > 
> > * This email and any files transmitted with it are
> CONFIDENTIAL and 
> > intended
> >   solely for the use of the individual or entity to
> which they are 
> > addressed.
> > * Any unauthorized copying, disclosure, or
> distribution of the 
> > material within
> >   this email is strictly forbidden.
> > * Any views or opinions presented within this e-mail
> are solely those 
> > of the
> >   author and do not necessarily represent those of
> Odyssey Financial 
> > Technologies SA unless otherwise specifically stated.
> > * An electronic message is not binding on its sender.
> Any message 
> > referring to
> >   a binding engagement must be confirmed in writing
> and duly signed.
> > * If you have received this email in error, please
> notify the sender 
> > immediately
> >   and delete the original.
> 
> 
>       
> 
> ____________________________________________________________
> 
> • This email and any files transmitted with it are
> CONFIDENTIAL and intended
>   solely for the use of the individual or entity to which
> they are addressed.
> • Any unauthorized copying, disclosure, or distribution
> of the material within
>   this email is strictly forbidden.
> • Any views or opinions presented within this e-mail are
> solely those of the
>   author and do not necessarily represent those of Odyssey
> Financial
> Technologies SA unless otherwise specifically stated.
> • An electronic message is not binding on its sender. Any
> message referring to
>   a binding engagement must be confirmed in writing and
> duly signed.
> • If you have received this email in error, please notify
> the sender immediately
>   and delete the original.


      

Mime
View raw message