Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[master] Bug 412391: Add support for hidden mappedsuperclass attributes #1328

Merged
merged 1 commit into from
Oct 1, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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