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/manual/ > 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/manual/ > 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.jav > a:39) > at > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessor > 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(Met > 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(JUnit4Clas > sRunner.java:88) > at > org.junit.internal.runners.JUnit4ClassRunner.runMethods(JUnit4ClassRunne > r.java:51) > at > org.junit.internal.runners.JUnit4ClassRunner$1.run(JUnit4ClassRunner.jav > a:44) > at > org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:2 > 7) > at > org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:37) > at > org.junit.internal.runners.JUnit4ClassRunner.run(JUnit4ClassRunner.java: > 42) > at > org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4Tes > 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(RemoteTe > stRunner.java:460) > at > org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTe > stRunner.java:673) > at > org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRun > ner.java:386) > at > org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRu > 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.fetchLongF > ield(ApplicationIds.java:578) > at > com.odcgroup.tangij.domainmodel.DictLanguageLabelEntity.pcCopyKeyFieldsT > oObjectId(DictLanguageLabelEntity.java) > at > org.apache.openjpa.enhance.PCRegistry.copyKeyFieldsToObjectId(PCRegistry > .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:278) > at > org.apache.openjpa.jdbc.sql.SelectImpl$SelectResult.load(SelectImpl.java > :2391) > at > org.apache.openjpa.jdbc.sql.AbstractResult.load(AbstractResult.java:272) > at > org.apache.openjpa.jdbc.kernel.InstanceResultObjectProvider.getResultObj > 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.
dict.jar
Description: application/java-archive
