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.
|