From ee9210be92ff0279aeed80460ead1f2a279c6f6e Mon Sep 17 00:00:00 2001 From: Donald Woods Date: Mon, 14 Sep 2009 14:29:34 +0000 Subject: [PATCH] OPENJPA-1201 [Mapped by] field not set when contained in superclass. Patch and testcases contributed by David Minor. git-svn-id: https://svn.apache.org/repos/asf/openjpa/trunk@814662 13f79535-47bb-0310-9956-ffa450edef68 --- .../openjpa/jdbc/kernel/JDBCStoreManager.java | 2 +- .../InheritanceHierarchyAbstract.java | 76 +++++++++++++++++++ .../InheritanceHierarchyConcrete.java | 54 +++++++++++++ .../TestJoinedInheritanceHierarchy.java | 66 ++++++++++++++++ 4 files changed, 197 insertions(+), 1 deletion(-) create mode 100644 openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/relations/InheritanceHierarchyAbstract.java create mode 100644 openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/relations/InheritanceHierarchyConcrete.java create mode 100644 openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/relations/TestJoinedInheritanceHierarchy.java diff --git a/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/JDBCStoreManager.java b/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/JDBCStoreManager.java index f924cbfb3..c068ca153 100644 --- a/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/JDBCStoreManager.java +++ b/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/JDBCStoreManager.java @@ -453,7 +453,7 @@ public class JDBCStoreManager protected void setMappedBy(OpenJPAStateManager sm, FieldMapping mappedByFieldMapping, Object mappedByObject) { ClassMapping mapping = (ClassMapping) sm.getMetaData(); - FieldMapping[] fms = mapping.getDeclaredFieldMappings(); + FieldMapping[] fms = mapping.getFieldMappings(); for (int i = 0; i < fms.length; i++) { if (fms[i] == mappedByFieldMapping) { sm.storeObject(fms[i].getIndex(), mappedByObject); diff --git a/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/relations/InheritanceHierarchyAbstract.java b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/relations/InheritanceHierarchyAbstract.java new file mode 100644 index 000000000..24740cb37 --- /dev/null +++ b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/relations/InheritanceHierarchyAbstract.java @@ -0,0 +1,76 @@ +/* + * 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.relations; + +import java.io.Serializable; +import java.util.Set; + +import javax.persistence.CascadeType; +import javax.persistence.DiscriminatorColumn; +import javax.persistence.DiscriminatorType; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Inheritance; +import javax.persistence.InheritanceType; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.OneToMany; + + +@Entity +@Inheritance(strategy = InheritanceType.JOINED) +@DiscriminatorColumn(discriminatorType=DiscriminatorType.STRING) +public abstract class InheritanceHierarchyAbstract implements Serializable { + + @Id + @GeneratedValue + private long id; + + @ManyToOne + @JoinColumn + private InheritanceHierarchyAbstract parent; + + @OneToMany(mappedBy = "parent", cascade = CascadeType.ALL, + fetch=FetchType.EAGER) + private Set children; + + + public long getId() { + return id; + } + + public Set getChildren() { + return this.children; + } + + public void setChildren(Set children) { + this.children = children; + } + + public InheritanceHierarchyAbstract getParent() { + return this.parent; + } + + public void setParent(InheritanceHierarchyAbstract parent) { + this.parent = parent; + } + +} diff --git a/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/relations/InheritanceHierarchyConcrete.java b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/relations/InheritanceHierarchyConcrete.java new file mode 100644 index 000000000..cd616e9af --- /dev/null +++ b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/relations/InheritanceHierarchyConcrete.java @@ -0,0 +1,54 @@ +/* + * 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.relations; + +import java.io.Serializable; +import java.util.Map; +import java.util.Set; + +import javax.persistence.Basic; +import javax.persistence.CascadeType; +import javax.persistence.DiscriminatorValue; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Inheritance; +import javax.persistence.InheritanceType; +import javax.persistence.MapKey; +import javax.persistence.OneToMany; + + +@Entity +@Inheritance(strategy = InheritanceType.JOINED) +@DiscriminatorValue("concrete") +public class InheritanceHierarchyConcrete extends InheritanceHierarchyAbstract implements Serializable { + + @Basic + private int value; + + public int getValue() { + return this.value; + } + + public void setValue(int value) { + this.value = value; + } + +} diff --git a/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/relations/TestJoinedInheritanceHierarchy.java b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/relations/TestJoinedInheritanceHierarchy.java new file mode 100644 index 000000000..ebf7f8ea0 --- /dev/null +++ b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/relations/TestJoinedInheritanceHierarchy.java @@ -0,0 +1,66 @@ +/* + * 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.relations; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +import org.apache.openjpa.persistence.OpenJPAEntityManager; +import org.apache.openjpa.persistence.test.SingleEMFTestCase; + +public class TestJoinedInheritanceHierarchy + extends SingleEMFTestCase { + + public void setUp() { + super.setUp(CLEAR_TABLES, InheritanceHierarchyConcrete.class, + InheritanceHierarchyAbstract.class); + } + + public void testInverseRelationNotNull() { + + InheritanceHierarchyConcrete parent = new InheritanceHierarchyConcrete(); + InheritanceHierarchyConcrete child = new InheritanceHierarchyConcrete(); + + parent.setValue(42); + child.setValue(21); + + Set children = new HashSet(); + children.add(child); + parent.setChildren(children); + child.setParent(parent); + + OpenJPAEntityManager em = emf.createEntityManager(); + em.getTransaction().begin(); + em.persist(parent); + em.getTransaction().commit(); + em.close(); + + em = emf.createEntityManager(); + parent = (InheritanceHierarchyConcrete)em.createQuery( + "SELECT p FROM InheritanceHierarchyConcrete p WHERE p.id=" + parent.getId() + ).getResultList().get(0); + em.close(); + + for(InheritanceHierarchyAbstract childNode : parent.getChildren()) { + assertNotNull("Parent should not be null", childNode.getParent()); + } + } +}