Skip to content

Commit

Permalink
Bug 412391: Add support for hidden mappedsuperclass attributes
Browse files Browse the repository at this point in the history
Signed-off-by: Will Dazey <[email protected]>
  • Loading branch information
dazey3 committed Oct 1, 2021
1 parent 693d6d4 commit d64a494
Show file tree
Hide file tree
Showing 4 changed files with 179 additions and 3 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
/*
* Copyright (c) 2021 Oracle, and/or affiliates. All rights reserved.
* Copyright (c) 2021 IBM Corporation. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0,
* or the Eclipse Distribution License v. 1.0 which is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
*/
// Contributors:
// IBM - Bug 412391: Add support for weaving hidden variables
package org.eclipse.persistence.jpa.test.weave;

import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityManagerFactory;

import org.eclipse.persistence.jpa.test.framework.DDLGen;
import org.eclipse.persistence.jpa.test.framework.Emf;
import org.eclipse.persistence.jpa.test.framework.EmfRunner;
import org.eclipse.persistence.jpa.test.framework.Property;
import org.eclipse.persistence.jpa.test.weave.model.WeavedAbstractMS;
import org.eclipse.persistence.jpa.test.weave.model.WeavedEntityA;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;

@RunWith(EmfRunner.class)
public class TestWeaving {

@Emf(createTables = DDLGen.DROP_CREATE,
classes = { WeavedAbstractMS.class, WeavedEntityA.class },
properties = { @Property(name = "eclipselink.cache.shared.default", value = "false") })
private EntityManagerFactory emf;

private static boolean POPULATED = false;

@Test
public void testHiddenAttribute() throws Exception {
if (emf == null)
return;

if(!POPULATED)
populate();

EntityManager em = emf.createEntityManager();
try {
final WeavedEntityA e1 = em.find(WeavedEntityA.class, 123l);

Assert.assertNotNull(e1);
Assert.assertNotNull(e1.getHiddenAttribute());
} catch (Exception e) {
e.printStackTrace();
throw e;
} finally {
if (em != null) {
if (em.getTransaction().isActive()) {
em.getTransaction().rollback();
}
em.close();
}
}
}

private void populate() {
EntityManager em = emf.createEntityManager();
try {
em.getTransaction().begin();

WeavedEntityA tbl1 = new WeavedEntityA();
tbl1.setId(123l);
tbl1.setHiddenAttribute((short) 1);
em.persist(tbl1);

em.getTransaction().commit();

POPULATED = true;
} finally {
if(em.isOpen()) {
em.clear();
em.close();
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
/*
* Copyright (c) 2021 Oracle, and/or affiliates. All rights reserved.
* Copyright (c) 2021 IBM Corporation. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0,
* or the Eclipse Distribution License v. 1.0 which is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
*/
// Contributors:
// IBM - Bug 412391: Add support for weaving hidden variables
package org.eclipse.persistence.jpa.test.weave.model;

import jakarta.persistence.MappedSuperclass;

@MappedSuperclass
public abstract class WeavedAbstractMS {
private String parentOnlyAttribute;
private Short hiddenAttribute;

public String getParentOnlyAttribute() {
return parentOnlyAttribute;
}
public void setParentOnlyAttribute(String parentOnlyAttribute) {
this.parentOnlyAttribute = parentOnlyAttribute;
}
public Short getHiddenAttribute() {
return hiddenAttribute;
}
public void setHiddenAttribute(Short hiddenAttribute) {
this.hiddenAttribute = hiddenAttribute;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
/*
* Copyright (c) 2021 Oracle, and/or affiliates. All rights reserved.
* Copyright (c) 2021 IBM Corporation. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0,
* or the Eclipse Distribution License v. 1.0 which is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
*/
// Contributors:
// IBM - Bug 412391: Add support for weaving hidden variables
package org.eclipse.persistence.jpa.test.weave.model;

import jakarta.persistence.Entity;
import jakarta.persistence.Id;

@Entity
public class WeavedEntityA extends WeavedAbstractMS {

@Id private long id;
private Short hiddenAttribute;

public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
/*
* Copyright (c) 1998, 2021 Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2021 IBM Corporation. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
Expand Down Expand Up @@ -125,6 +126,26 @@ public void addClassDetailsForMappedSuperClasses(MetadataClass clz, ClassDescrip
}
}

// If the superclass declares more mappings than there are unmapped mappings still to process, this superclass has shadowed attributes
if(mappedSuperclassDescriptor != null && unMappedAttributes.size() < mappedSuperclassDescriptor.getMappings().size()) {
List<DatabaseMapping> hiddenMappings = new ArrayList<DatabaseMapping>();
for(DatabaseMapping mapping : mappedSuperclassDescriptor.getMappings()) {
boolean contains = false;
String name = mapping.getAttributeName();
for(DatabaseMapping newmapping : unMappedAttributes) {
if(name.equals(newmapping.getAttributeName())) {
contains = true;
break;
}
}
// If the super has a mapping that wasn't processed by the subclasses, add it to be processed
if(!contains) {
hiddenMappings.add(mapping);
}
}
unMappedAttributes.addAll(hiddenMappings);
}

boolean weaveValueHolders = canWeaveValueHolders(superClz, unMappedAttributes);

List<DatabaseMapping> stillUnMappedMappings = null;
Expand Down Expand Up @@ -266,11 +287,11 @@ protected boolean wasChangeTrackingAlreadyWeaved(Class<?> clz){
/**
* Determine if value holders are required to be weaved into the class.
*/
protected boolean canWeaveValueHolders(MetadataClass clz, List mappings) {
protected boolean canWeaveValueHolders(MetadataClass clz, List<DatabaseMapping> mappings) {
// we intend to change to fetch=LAZY 1:1 attributes to ValueHolders
boolean weaveValueHolders = false;
for (Iterator iterator = mappings.iterator(); iterator.hasNext();) {
DatabaseMapping mapping = (DatabaseMapping)iterator.next();
for (Iterator<DatabaseMapping> iterator = mappings.iterator(); iterator.hasNext();) {
DatabaseMapping mapping = iterator.next();
String attributeName = mapping.getAttributeName();
if (mapping.isForeignReferenceMapping()) {
ForeignReferenceMapping foreignReferenceMapping = (ForeignReferenceMapping)mapping;
Expand Down

0 comments on commit d64a494

Please sign in to comment.