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 <[email protected]> wrote: > From: Michael Vorburger <[email protected]> > Subject: RE: ArrayIndexOutOfBoundsException in > org.apache.openjpa.util.ApplicationIds$PrimaryKeyFieldManager.retrieve > To: [email protected] > 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:[email protected]] > Sent: Tuesday, March 03, 2009 10:21 PM > To: [email protected] > 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 > <[email protected]> wrote: > > > From: Michael Vorburger > <[email protected]> > > Subject: ArrayIndexOutOfBoundsException in > > > org.apache.openjpa.util.ApplicationIds$PrimaryKeyFieldManager.retrieve > > To: [email protected] > > 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.
