Bug#506168: Shared NestedEmbeddables dont support AttributeOverride
Signed-off-by: Will Dazey <dazeydev.3@gmail.com>
Reviewed-by: Dalia Abo Sheasha <daliasheasha@gmail.com>
diff --git a/foundation/org.eclipse.persistence.core/src/org/eclipse/persistence/mappings/AggregateObjectMapping.java b/foundation/org.eclipse.persistence.core/src/org/eclipse/persistence/mappings/AggregateObjectMapping.java
index 9dfa6aa..85aff35 100644
--- a/foundation/org.eclipse.persistence.core/src/org/eclipse/persistence/mappings/AggregateObjectMapping.java
+++ b/foundation/org.eclipse.persistence.core/src/org/eclipse/persistence/mappings/AggregateObjectMapping.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 1998, 2015 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2016 Oracle and/or its affiliates. All rights reserved.
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0
* which accompanies this distribution.
@@ -22,6 +22,8 @@
* 06/03/2013-2.5.1 Guy Pelletier
* - 402380: 3 jpa21/advanced tests failed on server with
* "java.lang.NoClassDefFoundError: org/eclipse/persistence/testing/models/jpa21/advanced/enums/Gender"
+ * 10/19/2016-2.6 Will Dazey
+ * - 506168: Make sure nestedTranslation map is new reference when cloned
******************************************************************************/
package org.eclipse.persistence.mappings;
@@ -924,6 +926,10 @@ public Object clone() {
aggregateToSourceFields.putAll(getAggregateToSourceFields());
mappingObject.setAggregateToSourceFields(aggregateToSourceFields);
+ Map<String, Object[]> nestedTranslations = new HashMap<String, Object[]>();
+ nestedTranslations.putAll(getNestedFieldTranslations());
+ mappingObject.setNestedFieldTranslations(nestedTranslations);
+
return mappingObject;
}
@@ -1162,6 +1168,14 @@ public Map<String, DatabaseField> getAggregateToSourceFields() {
}
/**
+ * INTERNAL:
+ * Return the hashtable that stores the nested field translations.
+ */
+ public Map<String, Object[]> getNestedFieldTranslations() {
+ return nestedFieldTranslations;
+ }
+
+ /**
* PUBLIC:
* The classification type for the attribute this mapping represents
*/
@@ -1871,6 +1885,15 @@ public void setAggregateToSourceFields(Map<String, DatabaseField> aggregateToSou
}
/**
+ * INTERNAL:
+ * Set the hashtable that stores a field in the source table
+ * to a field name in a nested aggregate descriptor.
+ */
+ public void setNestedFieldTranslations(Map<String, Object[]> fieldTranslations) {
+ nestedFieldTranslations = fieldTranslations;
+ }
+
+ /**
* PUBLIC:
* Configure if all the fields in the database row for the aggregate object are NULL,
* then, by default, the mapping will place a null in the appropriate source object
diff --git a/jpa/eclipselink.jpa.test.jse/src/org/eclipse/persistence/jpa/embeddable/TestNestedEmbeddable.java b/jpa/eclipselink.jpa.test.jse/src/org/eclipse/persistence/jpa/embeddable/TestNestedEmbeddable.java
index 28dd000..785ebde 100644
--- a/jpa/eclipselink.jpa.test.jse/src/org/eclipse/persistence/jpa/embeddable/TestNestedEmbeddable.java
+++ b/jpa/eclipselink.jpa.test.jse/src/org/eclipse/persistence/jpa/embeddable/TestNestedEmbeddable.java
@@ -10,13 +10,19 @@
* Contributors:
* 08/24/2016 - Will Dazey
* - 500145 : Nested Embeddables Test
+ * 10/19/2016 - Will Dazey
+ * - 506168 : Nested Embeddables AttributeOverride Test
******************************************************************************/
package org.eclipse.persistence.jpa.embeddable;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
+import org.eclipse.persistence.descriptors.ClassDescriptor;
+import org.eclipse.persistence.jpa.JpaEntityManager;
import org.eclipse.persistence.jpa.embeddable.model.Address;
+import org.eclipse.persistence.jpa.embeddable.model.DeepOrderPK;
+import org.eclipse.persistence.jpa.embeddable.model.DeepOrder;
import org.eclipse.persistence.jpa.embeddable.model.Order;
import org.eclipse.persistence.jpa.embeddable.model.OrderPK;
import org.eclipse.persistence.jpa.embeddable.model.Zipcode;
@@ -29,7 +35,7 @@
@RunWith(EmfRunner.class)
public class TestNestedEmbeddable {
- @Emf(createTables = DDLGen.DROP_CREATE, classes = { Order.class, OrderPK.class, Address.class, Zipcode.class })
+ @Emf(createTables = DDLGen.DROP_CREATE, classes = { DeepOrder.class, DeepOrderPK.class, Order.class, OrderPK.class, Address.class, Zipcode.class })
private EntityManagerFactory emf;
@Test
@@ -73,4 +79,31 @@ public void persistTest() {
em.close();
}
}
+
+ @Test
+ public void testDeeperEmbeddingMappings() {
+ if (emf == null)
+ return;
+ EntityManager em = emf.createEntityManager();
+ try {
+ ClassDescriptor orderDescriptor = ((JpaEntityManager)em).getServerSession().getDescriptor(Order.class);
+ ClassDescriptor orderpkDescriptor = orderDescriptor.getMappingForAttributeName("id").getReferenceDescriptor();
+ ClassDescriptor addressDescriptor = orderpkDescriptor.getMappingForAttributeName("billingAddress").getReferenceDescriptor();
+ ClassDescriptor zipcodeDescriptor = addressDescriptor.getMappingForAttributeName("zipcode").getReferenceDescriptor();
+ Assert.assertEquals("BILL_ZIP", zipcodeDescriptor.getFields().get(0).getName());
+
+ ClassDescriptor deepOrderDescriptor = ((JpaEntityManager)em).getServerSession().getDescriptor(DeepOrder.class);
+ ClassDescriptor deepOrderpkDescriptor = deepOrderDescriptor.getMappingForAttributeName("id").getReferenceDescriptor();
+ ClassDescriptor orderpkDescriptor2 = deepOrderpkDescriptor.getMappingForAttributeName("orderpk").getReferenceDescriptor();
+ ClassDescriptor addressDescriptor2 = orderpkDescriptor2.getMappingForAttributeName("billingAddress").getReferenceDescriptor();
+ ClassDescriptor zipcodeDescriptor2 = addressDescriptor2.getMappingForAttributeName("zipcode").getReferenceDescriptor();
+ Assert.assertEquals("deepOverride", zipcodeDescriptor2.getFields().get(0).getName());
+
+ } finally {
+ if (em.getTransaction().isActive()) {
+ em.getTransaction().rollback();
+ }
+ em.close();
+ }
+ }
}
diff --git a/jpa/eclipselink.jpa.test.jse/src/org/eclipse/persistence/jpa/embeddable/model/DeepOrder.java b/jpa/eclipselink.jpa.test.jse/src/org/eclipse/persistence/jpa/embeddable/model/DeepOrder.java
new file mode 100644
index 0000000..b2e42e8
--- /dev/null
+++ b/jpa/eclipselink.jpa.test.jse/src/org/eclipse/persistence/jpa/embeddable/model/DeepOrder.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * Copyright (c) 2016 IBM Corporation. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0
+ * which accompanies this distribution.
+ * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
+ * and the Eclipse Distribution License is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * Contributors:
+ * 10/19/2016 - 2.6 Will Dazey
+ * - 506168 : Nested Embeddables AttributeOverride Test
+ ******************************************************************************/
+package org.eclipse.persistence.jpa.embeddable.model;
+
+import javax.persistence.AttributeOverride;
+import javax.persistence.Column;
+import javax.persistence.EmbeddedId;
+import javax.persistence.Entity;
+
+@Entity
+public class DeepOrder {
+
+ @EmbeddedId
+ @AttributeOverride(name = "orderpk.billingAddress.zipcode.zip", column = @Column(name="deepOverride"))
+ private DeepOrderPK id;
+
+ public DeepOrder() { }
+
+ public DeepOrderPK getId() {
+ return id;
+ }
+
+ public void setId(DeepOrderPK id) {
+ this.id = id;
+ }
+}
diff --git a/jpa/eclipselink.jpa.test.jse/src/org/eclipse/persistence/jpa/embeddable/model/DeepOrderPK.java b/jpa/eclipselink.jpa.test.jse/src/org/eclipse/persistence/jpa/embeddable/model/DeepOrderPK.java
new file mode 100644
index 0000000..cdcc7c0
--- /dev/null
+++ b/jpa/eclipselink.jpa.test.jse/src/org/eclipse/persistence/jpa/embeddable/model/DeepOrderPK.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2016 IBM Corporation. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0
+ * which accompanies this distribution.
+ * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
+ * and the Eclipse Distribution License is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * Contributors:
+ * 10/19/2016 - 2.6 Will Dazey
+ * - 506168 : Nested Embeddables AttributeOverride Test
+ ******************************************************************************/
+package org.eclipse.persistence.jpa.embeddable.model;
+
+import javax.persistence.Embeddable;
+
+@Embeddable
+public class DeepOrderPK {
+
+ private OrderPK orderpk;
+
+ public DeepOrderPK() {}
+
+ public OrderPK getOrderpk() {
+ return orderpk;
+ }
+
+ public void setOrderpk(OrderPK orderpk) {
+ this.orderpk = orderpk;
+ }
+}