mirror of
https://github.com/hibernate/hibernate-orm
synced 2025-02-12 14:14:49 +00:00
HHH-10646 - [enhancer] Add support for @MappedSuperclass
(cherry picked from commit e615d76a261d1825d9c6581b03ede7e393a13428) Conflicts: hibernate-core/src/test/java/org/hibernate/test/bytecode/enhancement/EnhancerTest.java
This commit is contained in:
parent
4f3391a592
commit
2aa76b3ef9
@ -10,6 +10,9 @@
|
|||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import javax.persistence.MappedSuperclass;
|
||||||
|
|
||||||
import javassist.CannotCompileException;
|
import javassist.CannotCompileException;
|
||||||
import javassist.CtClass;
|
import javassist.CtClass;
|
||||||
@ -208,24 +211,33 @@ private void createDirtyTrackerMethods(CtClass managedCtClass) {
|
|||||||
|
|
||||||
private List<CtField> collectCollectionFields(CtClass managedCtClass) {
|
private List<CtField> collectCollectionFields(CtClass managedCtClass) {
|
||||||
final List<CtField> collectionList = new LinkedList<CtField>();
|
final List<CtField> collectionList = new LinkedList<CtField>();
|
||||||
try {
|
|
||||||
for ( CtField ctField : managedCtClass.getDeclaredFields() ) {
|
for ( CtField ctField : managedCtClass.getDeclaredFields() ) {
|
||||||
// skip static fields and skip fields added by enhancement
|
// skip static fields and skip fields added by enhancement
|
||||||
if ( Modifier.isStatic( ctField.getModifiers() ) || ctField.getName().startsWith( "$$_hibernate_" ) ) {
|
if ( Modifier.isStatic( ctField.getModifiers() ) || ctField.getName().startsWith( "$$_hibernate_" ) ) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if ( enhancementContext.isPersistentField( ctField ) ) {
|
if ( enhancementContext.isPersistentField( ctField ) ) {
|
||||||
for ( CtClass ctClass : ctField.getType().getInterfaces() ) {
|
if ( PersistentAttributesHelper.isAssignable( ctField, Collection.class.getName() ) ||
|
||||||
if ( PersistentAttributesHelper.isAssignable( ctClass, Collection.class.getName() ) ) {
|
PersistentAttributesHelper.isAssignable( ctField, Map.class.getName() ) ) {
|
||||||
collectionList.add( ctField );
|
collectionList.add( ctField );
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// HHH-10646 Add fields inherited from @MappedSuperclass
|
||||||
|
for ( CtField ctField : managedCtClass.getDeclaredFields() ) {
|
||||||
|
if ( !ctField.getDeclaringClass().hasAnnotation( MappedSuperclass.class ) || Modifier.isStatic( ctField.getModifiers() ) ) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if ( enhancementContext.isPersistentField( ctField ) ) {
|
||||||
|
if ( PersistentAttributesHelper.isAssignable( ctField, Collection.class.getName() ) ||
|
||||||
|
PersistentAttributesHelper.isAssignable( ctField, Map.class.getName() ) ) {
|
||||||
|
collectionList.add( ctField );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (NotFoundException ignored) {
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return collectionList;
|
return collectionList;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -14,6 +14,7 @@
|
|||||||
import javax.persistence.Id;
|
import javax.persistence.Id;
|
||||||
import javax.persistence.ManyToMany;
|
import javax.persistence.ManyToMany;
|
||||||
import javax.persistence.ManyToOne;
|
import javax.persistence.ManyToOne;
|
||||||
|
import javax.persistence.MappedSuperclass;
|
||||||
import javax.persistence.OneToMany;
|
import javax.persistence.OneToMany;
|
||||||
import javax.persistence.OneToOne;
|
import javax.persistence.OneToOne;
|
||||||
|
|
||||||
@ -90,6 +91,16 @@ private CtField[] collectPersistentFields(CtClass managedCtClass) {
|
|||||||
persistentFieldList.add( ctField );
|
persistentFieldList.add( ctField );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// HHH-10646 Add fields inherited from @MappedSuperclass
|
||||||
|
// CtClass.getFields() does not return private fields, while CtClass.getDeclaredFields() does not return inherit
|
||||||
|
for ( CtField ctField : managedCtClass.getFields() ) {
|
||||||
|
if ( !ctField.getDeclaringClass().hasAnnotation( MappedSuperclass.class ) || Modifier.isStatic( ctField.getModifiers() ) ) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if ( enhancementContext.isPersistentField( ctField ) ) {
|
||||||
|
persistentFieldList.add( ctField );
|
||||||
|
}
|
||||||
|
}
|
||||||
return enhancementContext.order( persistentFieldList.toArray( new CtField[persistentFieldList.size()] ) );
|
return enhancementContext.order( persistentFieldList.toArray( new CtField[persistentFieldList.size()] ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -383,4 +383,14 @@ public static boolean isAssignable(CtClass thisCtClass, String targetClassName)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static boolean isAssignable(CtField thisCtField, String targetClassName) {
|
||||||
|
try {
|
||||||
|
return isAssignable( thisCtField.getType(), targetClassName );
|
||||||
|
}
|
||||||
|
catch (NotFoundException e) {
|
||||||
|
// keep going
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -33,6 +33,7 @@
|
|||||||
import org.hibernate.test.bytecode.enhancement.lazy.LazyLoadingTestTask;
|
import org.hibernate.test.bytecode.enhancement.lazy.LazyLoadingTestTask;
|
||||||
import org.hibernate.test.bytecode.enhancement.lazy.basic.LazyBasicFieldAccessTestTask;
|
import org.hibernate.test.bytecode.enhancement.lazy.basic.LazyBasicFieldAccessTestTask;
|
||||||
import org.hibernate.test.bytecode.enhancement.lazy.basic.LazyBasicPropertyAccessTestTask;
|
import org.hibernate.test.bytecode.enhancement.lazy.basic.LazyBasicPropertyAccessTestTask;
|
||||||
|
import org.hibernate.test.bytecode.enhancement.mapped.MappedSuperclassTestTask;
|
||||||
import org.hibernate.test.bytecode.enhancement.merge.CompositeMergeTestTask;
|
import org.hibernate.test.bytecode.enhancement.merge.CompositeMergeTestTask;
|
||||||
import org.hibernate.test.bytecode.enhancement.ondemandload.LazyCollectionWithClearedSessionTestTask;
|
import org.hibernate.test.bytecode.enhancement.ondemandload.LazyCollectionWithClearedSessionTestTask;
|
||||||
import org.hibernate.test.bytecode.enhancement.ondemandload.LazyCollectionWithClosedSessionTestTask;
|
import org.hibernate.test.bytecode.enhancement.ondemandload.LazyCollectionWithClosedSessionTestTask;
|
||||||
@ -117,6 +118,12 @@ public void testLazyUnexpectedDelete() {
|
|||||||
EnhancerTestUtils.runEnhancerTestTask( UnexpectedDeleteThreeTestTask.class );
|
EnhancerTestUtils.runEnhancerTestTask( UnexpectedDeleteThreeTestTask.class );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestForIssue( jiraKey = "HHH-10646" )
|
||||||
|
public void testMappedSuperclass() {
|
||||||
|
EnhancerTestUtils.runEnhancerTestTask( MappedSuperclassTestTask.class );
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testMerge() {
|
public void testMerge() {
|
||||||
EnhancerTestUtils.runEnhancerTestTask( CompositeMergeTestTask.class );
|
EnhancerTestUtils.runEnhancerTestTask( CompositeMergeTestTask.class );
|
||||||
|
@ -0,0 +1,67 @@
|
|||||||
|
package org.hibernate.test.bytecode.enhancement.mapped;
|
||||||
|
|
||||||
|
import javax.persistence.Entity;
|
||||||
|
import javax.persistence.Id;
|
||||||
|
import javax.persistence.MappedSuperclass;
|
||||||
|
import javax.persistence.Version;
|
||||||
|
|
||||||
|
import org.hibernate.Session;
|
||||||
|
import org.hibernate.cfg.Configuration;
|
||||||
|
import org.hibernate.cfg.Environment;
|
||||||
|
|
||||||
|
import org.hibernate.testing.bytecode.enhancement.EnhancerTestUtils;
|
||||||
|
import org.hibernate.test.bytecode.enhancement.AbstractEnhancerTestTask;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Luis Barreiro
|
||||||
|
*/
|
||||||
|
public class MappedSuperclassTestTask extends AbstractEnhancerTestTask {
|
||||||
|
|
||||||
|
public Class<?>[] getAnnotatedClasses() {
|
||||||
|
return new Class<?>[] { Person.class, Employee.class };
|
||||||
|
}
|
||||||
|
|
||||||
|
public void prepare() {
|
||||||
|
Configuration cfg = new Configuration();
|
||||||
|
cfg.setProperty( Environment.ENABLE_LAZY_LOAD_NO_TRANS, "true" );
|
||||||
|
cfg.setProperty( Environment.USE_SECOND_LEVEL_CACHE, "false" );
|
||||||
|
super.prepare( cfg );
|
||||||
|
}
|
||||||
|
|
||||||
|
public void execute() {
|
||||||
|
Employee charles = new Employee( "Charles", "Engineer" );
|
||||||
|
charles.oca = 1002;
|
||||||
|
|
||||||
|
// Check that both types of class attributes are being dirty tracked
|
||||||
|
EnhancerTestUtils.checkDirtyTracking( charles, "title", "oca" );
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void cleanup() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@MappedSuperclass private static class Person {
|
||||||
|
|
||||||
|
@Id String name;
|
||||||
|
|
||||||
|
@Version long oca;
|
||||||
|
|
||||||
|
public Person(String name) {
|
||||||
|
this();
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Person() {}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Entity private static class Employee extends Person {
|
||||||
|
|
||||||
|
private String title;
|
||||||
|
|
||||||
|
public Employee(String name, String title) {
|
||||||
|
super(name);
|
||||||
|
this.title = title;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Employee() {}
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user