|
|
|
awhite
|
Author: awhite
Date: Wed Jul 23 11:20:25 2008 New Revision: 679152 URL: http://svn.apache.org/viewvc?rev=679152&view=rev Log: Fix a bug in which joined classes using an application identity hierarchy couldn't be loaded correctly as an inverse relation. Added: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/abstractjoinedappid/ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/abstractjoinedappid/RelationOwner.java openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/abstractjoinedappid/SubID.java openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/abstractjoinedappid/Subclass.java openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/abstractjoinedappid/SuperID.java openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/abstractjoinedappid/Superclass.java openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/abstractjoinedappid/TestAbstractJoinedAppId.java Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/ClassMapping.java openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/util/ApplicationIds.java openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/util/OpenJPAId.java openjpa/trunk/openjpa-kernel/src/main/resources/org/apache/openjpa/kernel/localizer.properties Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/ClassMapping.java URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/ClassMapping.java?rev=679152&r1=679151&r2=679152&view=diff ============================================================================== --- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/ClassMapping.java (original) +++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/ClassMapping.java Wed Jul 23 11:20:25 2008 @@ -189,34 +189,27 @@ return null; } } - Object oid = ApplicationIds.fromPKValues(vals, cls); - - /** - * For polymorphic relations, - * the type field in the oid is initially set to base type. - * If the discriminator value is preset in the current result, - * then the type field needs reset based on the discriminator value. - * If the discriminator value is not present or invalid, - * ignore any exceptions being thrown. - */ + + // the oid data is loaded by the base type, but if discriminator data + // is present, make sure to use it to construct the actual oid instance + // so that we get the correct app id class, etc + ClassMapping dcls = cls; + if (subs) { + res.startDataRequest(cls.getDiscriminator()); + try { + Class dtype = cls.getDiscriminator().getClass(store, cls, res); + if (dtype != cls.getDescribedType()) + dcls = cls.getMappingRepository().getMapping(dtype, + store.getContext().getClassLoader(), true); + } catch (Exception e) { + // intentionally ignored + } + res.endDataRequest(); + } + Object oid = ApplicationIds.fromPKValues(vals, dcls); if (oid instanceof OpenJPAId) { - Class type = cls.getDescribedType(); - if (!subs) - // non-polymorphic relations - ((OpenJPAId) oid).setManagedInstanceType(type); - else if (cls.getDiscriminator() != null - && !StringUtils.equals("none", - cls.getDiscriminator().getStrategy().getAlias())) { - // polymorphic relations - res.startDataRequest(cls.getDiscriminator()); - try { - type = cls.getDiscriminator().getClass(store, cls, res); - ((OpenJPAId) oid).setManagedInstanceType(type, true); - } catch (Exception e) { - // intentionally ignored - } - res.endDataRequest(); - } + ((OpenJPAId) oid).setManagedInstanceType(dcls.getDescribedType(), + subs); } return oid; } Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/util/ApplicationIds.java URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/util/ApplicationIds.java?rev=679152&r1=679151&r2=679152&view=diff ============================================================================== --- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/util/ApplicationIds.java (original) +++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/util/ApplicationIds.java Wed Jul 23 11:20:25 2008 @@ -193,12 +193,16 @@ return new ObjectId(meta.getDescribedType(), val); case JavaTypes.BIGDECIMAL: if (!convert && !(val instanceof BigDecimal)) - throw new ClassCastException("!(x instanceof BigDecimal)"); - return new BigDecimalId(meta.getDescribedType(), (BigDecimal)val); + throw new ClassCastException( + "!(x instanceof BigDecimal)"); + return new BigDecimalId(meta.getDescribedType(), + (BigDecimal)val); case JavaTypes.BIGINTEGER: if (!convert && !(val instanceof BigInteger)) - throw new ClassCastException("!(x instanceof BigInteger)"); - return new BigIntegerId(meta.getDescribedType(), (BigInteger)val); + throw new ClassCastException( + "!(x instanceof BigInteger)"); + return new BigIntegerId(meta.getDescribedType(), + (BigInteger)val); default: throw new InternalException(); } Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/util/OpenJPAId.java URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/util/OpenJPAId.java?rev=679152&r1=679151&r2=679152&view=diff ============================================================================== --- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/util/OpenJPAId.java (original) +++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/util/OpenJPAId.java Wed Jul 23 11:20:25 2008 @@ -55,7 +55,7 @@ } /** - * Return the persitent class which this id instance represents. + * Return the persistent class which this id instance represents. */ public Class getType() { return type; @@ -73,8 +73,7 @@ * Set the exact type of the described instance once it is known. */ public void setManagedInstanceType(Class type) { - this.type = type; - this.subs = false; + setManagedInstanceType(type, false); } /** Modified: openjpa/trunk/openjpa-kernel/src/main/resources/org/apache/openjpa/kernel/localizer.properties URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/resources/org/apache/openjpa/kernel/localizer.properties?rev=679152&r1=679151&r2=679152&view=diff ============================================================================== --- openjpa/trunk/openjpa-kernel/src/main/resources/org/apache/openjpa/kernel/localizer.properties (original) +++ openjpa/trunk/openjpa-kernel/src/main/resources/org/apache/openjpa/kernel/localizer.properties Wed Jul 23 11:20:25 2008 @@ -117,7 +117,7 @@ bad-detached-op: You cannot perform operation {0} on detached object "{1}". \ This operation only applies to managed objects. persist-detached: Attempt to persist detached object "{0}". If this is a new \ - instance, make sure any versino and/or auto-generated primary key fields are \ + instance, make sure any version and/or auto-generated primary key fields are \ null/default when persisting. null-value: The field "{0}" of instance "{1}" contained a null value; \ the metadata for this field specifies that nulls are illegal. Added: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/abstractjoinedappid/RelationOwner.java URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/abstractjoinedappid/RelationOwner.java?rev=679152&view=auto ============================================================================== --- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/abstractjoinedappid/RelationOwner.java (added) +++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/abstractjoinedappid/RelationOwner.java Wed Jul 23 11:20:25 2008 @@ -0,0 +1,24 @@ +package org.apache.openjpa.persistence.inheritance.abstractjoinedappid; + +import java.util.*; +import javax.persistence.*; + +import org.apache.openjpa.persistence.jdbc.ElementJoinColumn; + +@Entity +@Table(name="TEST") +public class RelationOwner { + + private Integer id; + private Collection<Superclass> supers = new ArrayList<Superclass>(); + + @Id + @Column(name="ID") + public Integer getId() { return id; } + public void setId(Integer id) { this.id = id; } + + @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER) + @ElementJoinColumn(name="TEST", referencedColumnName="ID") + public Collection<Superclass> getSupers() { return supers; } + public void setSupers(Collection<Superclass> supers) { this.supers = supers; } +} Added: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/abstractjoinedappid/SubID.java URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/abstractjoinedappid/SubID.java?rev=679152&view=auto ============================================================================== --- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/abstractjoinedappid/SubID.java (added) +++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/abstractjoinedappid/SubID.java Wed Jul 23 11:20:25 2008 @@ -0,0 +1,5 @@ +package org.apache.openjpa.persistence.inheritance.abstractjoinedappid; + +public class SubID extends SuperID { + +} Added: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/abstractjoinedappid/Subclass.java URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/abstractjoinedappid/Subclass.java?rev=679152&view=auto ============================================================================== --- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/abstractjoinedappid/Subclass.java (added) +++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/abstractjoinedappid/Subclass.java Wed Jul 23 11:20:25 2008 @@ -0,0 +1,16 @@ +package org.apache.openjpa.persistence.inheritance.abstractjoinedappid; + +import javax.persistence.*; + +@Entity +@IdClass(SubID.class) +@Table(name="SUB") +public class Subclass extends Superclass { + + private String attr2; + + @Column(name="ATTR2") + public String getAttr2() { return attr2; } + public void setAttr2(String attr2) { this.attr2 = attr2; } + +} Added: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/abstractjoinedappid/SuperID.java URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/abstractjoinedappid/SuperID.java?rev=679152&view=auto ============================================================================== --- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/abstractjoinedappid/SuperID.java (added) +++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/abstractjoinedappid/SuperID.java Wed Jul 23 11:20:25 2008 @@ -0,0 +1,26 @@ +package org.apache.openjpa.persistence.inheritance.abstractjoinedappid; + +import java.io.Serializable; + +public abstract class SuperID implements Serializable { + + private Integer id; + + public Integer getId() { return id; } + public void setId(Integer id) { this.id = id; } + + public int hashCode() { + return id; + } + + public boolean equals(Object obj) { + if (obj == this) return true; + if (!(obj instanceof SuperID)) return false; + SuperID pk = (SuperID) obj; + if ( pk.getId().equals(id)) { + return true; + } else { + return false; + } + } +} Added: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/abstractjoinedappid/Superclass.java URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/abstractjoinedappid/Superclass.java?rev=679152&view=auto ============================================================================== --- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/abstractjoinedappid/Superclass.java (added) +++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/abstractjoinedappid/Superclass.java Wed Jul 23 11:20:25 2008 @@ -0,0 +1,22 @@ +package org.apache.openjpa.persistence.inheritance.abstractjoinedappid; + +import javax.persistence.*; + +@Entity +@IdClass(SuperID.class) +@Table(name="SUPER") +@Inheritance(strategy=InheritanceType.JOINED) +public abstract class Superclass { + + private Integer id; + private String attr1; + + @Id + @Column(name="ID") + public Integer getId() { return id; } + public void setId(Integer id) { this.id = id; } + + @Column(name="ATTR1") + public String getAttr1() { return attr1; } + public void setAttr1(String attr1) { this.attr1 = attr1; } +} Added: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/abstractjoinedappid/TestAbstractJoinedAppId.java URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/abstractjoinedappid/TestAbstractJoinedAppId.java?rev=679152&view=auto ============================================================================== --- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/abstractjoinedappid/TestAbstractJoinedAppId.java (added) +++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/abstractjoinedappid/TestAbstractJoinedAppId.java Wed Jul 23 11:20:25 2008 @@ -0,0 +1,74 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.openjpa.persistence.inheritance.abstractjoinedappid; + +import java.util.Arrays; +import java.util.Collection; +import javax.persistence.EntityManager; + +import junit.textui.TestRunner; +import org.apache.openjpa.persistence.test.SingleEMFTestCase; + +/** + * Test that you traverse an inverse key-baesd relation to an abstract + * class using joined inheritance. + */ +public class TestAbstractJoinedAppId + extends SingleEMFTestCase { + + public void setUp() { + setUp(Superclass.class, Subclass.class, RelationOwner.class, + DROP_TABLES); + + Subclass s = new Subclass(); + s.setId(99); + s.setAttr1("supattr"); + s.setAttr2("subattr"); + + RelationOwner ro = new RelationOwner(); + ro.setId(1); + ro.setSupers(Arrays.asList(new Superclass[] { s })); + + EntityManager em = emf.createEntityManager(); + em.getTransaction().begin(); + em.persist(ro); + em.getTransaction().commit(); + em.close(); + } + + public void testTraverseRelation() { + EntityManager em = emf.createEntityManager(); + RelationOwner ro = em.find(RelationOwner.class, 1); + assertNotNull(ro); + + Collection supers = ro.getSupers(); + assertEquals(1, supers.size()); + Superclass s = (Superclass) supers.iterator().next(); + assertTrue(s instanceof Subclass); + assertEquals(new Integer(99), s.getId()); + assertEquals("supattr", s.getAttr1()); + assertEquals("subattr", ((Subclass) s).getAttr2()); + em.close(); + } + + public static void main(String[] args) { + TestRunner.run(TestAbstractJoinedAppId.class); + } +} + |
|||||||||||||||
| Free Forum Powered by Nabble | Forum Help |