Skip to content

Commit 01bab54

Browse files
committed
HHH-7832 - map entity mode support, not finished yet
1 parent 7c48f03 commit 01bab54

File tree

8 files changed

+44
-15
lines changed

8 files changed

+44
-15
lines changed

hibernate-core/src/main/java/org/hibernate/cfg/beanvalidation/TypeSafeActivator.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
import org.jboss.logging.Logger;
4343

4444
import org.hibernate.AssertionFailure;
45+
import org.hibernate.EntityMode;
4546
import org.hibernate.HibernateException;
4647
import org.hibernate.MappingException;
4748
import org.hibernate.boot.registry.classloading.spi.ClassLoaderService;
@@ -58,6 +59,7 @@
5859
import org.hibernate.event.spi.EventType;
5960
import org.hibernate.internal.CoreMessageLogger;
6061
import org.hibernate.internal.util.ReflectHelper;
62+
import org.hibernate.internal.util.StringHelper;
6163
import org.hibernate.mapping.Component;
6264
import org.hibernate.mapping.PersistentClass;
6365
import org.hibernate.mapping.Property;
@@ -254,6 +256,9 @@ public static void applyDDL(Iterable<EntityBinding> bindings,
254256

255257
for ( EntityBinding binding : bindings ) {
256258
final String className = binding.getEntity().getClassName();
259+
if ( binding.getHierarchyDetails().getEntityMode() != EntityMode.POJO ){
260+
continue;
261+
}
257262
Class<?> clazz;
258263
try {
259264
clazz = classLoaderService.classForName( className );

hibernate-core/src/main/java/org/hibernate/jpa/metamodel/internal/builder/MetamodelBuilder.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535

3636
import org.jboss.logging.Logger;
3737

38+
import org.hibernate.EntityMode;
3839
import org.hibernate.HibernateException;
3940
import org.hibernate.engine.spi.SessionFactoryImplementor;
4041
import org.hibernate.jpa.metamodel.internal.AbstractIdentifiableType;
@@ -93,7 +94,9 @@ public MetamodelBuilder(SessionFactoryImplementor sessionFactory, JpaMetaModelPo
9394
}
9495

9596
public void add(EntityBinding entityBinding) {
96-
locateOrBuildEntityType( entityBinding );
97+
if ( entityBinding.getHierarchyDetails().getEntityMode() == EntityMode.POJO ) {
98+
locateOrBuildEntityType( entityBinding );
99+
}
97100
entityBindingList.add( entityBinding );
98101
}
99102

hibernate-core/src/main/java/org/hibernate/metamodel/internal/Binder.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1848,8 +1848,7 @@ private void bindPrimaryTable(final EntityBinding entityBinding, final EntitySou
18481848
@Override
18491849
public String defaultName() {
18501850
String name = StringHelper.isNotEmpty( entityBinding.getJpaEntityName() ) ? entityBinding.getJpaEntityName() : entityBinding
1851-
.getEntity()
1852-
.getClassName();
1851+
.getEntity().getName();
18531852
return bindingContexts.peek().getNamingStrategy().classToTableName( name );
18541853
}
18551854
}

hibernate-core/src/main/java/org/hibernate/metamodel/internal/HibernateTypeHelper.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import java.util.Properties;
3333

3434
import org.hibernate.AssertionFailure;
35+
import org.hibernate.EntityMode;
3536
import org.hibernate.internal.util.ReflectHelper;
3637
import org.hibernate.internal.util.beans.BeanInfoHelper;
3738
import org.hibernate.internal.util.collections.CollectionHelper;
@@ -109,8 +110,12 @@ public void bindSingularAttributeTypeInformation(
109110
final HibernateTypeDescriptor hibernateTypeDescriptor = attributeBinding
110111
.getHibernateTypeDescriptor();
111112

112-
final Class<?> attributeJavaType = determineJavaType(
113-
attributeBinding.getAttribute() );
113+
final Class<?> attributeJavaType = attributeBinding.getContainer()
114+
.seekEntityBinding()
115+
.getHierarchyDetails()
116+
.getEntityMode() == EntityMode.POJO ? determineJavaType(
117+
attributeBinding.getAttribute()
118+
) : null;
114119
if ( attributeJavaType != null ) {
115120
attributeBinding.getAttribute().resolveType( makeJavaType(
116121
attributeJavaType.getName() ) );
@@ -308,6 +313,9 @@ private void pushHibernateTypeInformationDown(
308313
Type resolvedHibernateType) {
309314
final HibernateTypeDescriptor hibernateTypeDescriptor = attributeBinding.getHibernateTypeDescriptor();
310315
final SingularAttribute singularAttribute = SingularAttribute.class.cast( attributeBinding.getAttribute() );
316+
if ( hibernateTypeDescriptor.getResolvedTypeMapping() != null && hibernateTypeDescriptor.getJavaTypeName() == null ) {
317+
hibernateTypeDescriptor.setJavaTypeName( resolvedHibernateType.getReturnedClass().getName() );
318+
}
311319
if ( ! singularAttribute.isTypeResolved() && hibernateTypeDescriptor.getJavaTypeName() != null ) {
312320
singularAttribute.resolveType( makeJavaType( hibernateTypeDescriptor.getJavaTypeName() ) );
313321
}

hibernate-core/src/main/java/org/hibernate/tuple/PropertyFactory.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -439,6 +439,12 @@ public static Setter getIdentifierMapperSetter(
439439
}
440440

441441
private static Getter getGetterOrNull(AttributeBinding mappingProperty) {
442+
if ( mappingProperty.getContainer()
443+
.seekEntityBinding()
444+
.getHierarchyDetails()
445+
.getEntityMode() != EntityMode.POJO ) {
446+
return null;
447+
}
442448
try {
443449
return getGetter( mappingProperty );
444450
}

hibernate-core/src/main/java/org/hibernate/tuple/entity/DynamicMapEntityTuplizer.java

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,14 @@ public class DynamicMapEntityTuplizer extends AbstractEntityTuplizer {
7070
public EntityMode getEntityMode() {
7171
return EntityMode.MAP;
7272
}
73-
73+
private PropertyAccessor buildPropertyAccessor(AttributeBinding mappedProperty) {
74+
if ( mappedProperty.isBackRef() ) {
75+
return PropertyAccessorFactory.getPropertyAccessor( "map" ); //todo use getPropertyAccessorName instead of hardcode
76+
}
77+
else {
78+
return PropertyAccessorFactory.getDynamicMapPropertyAccessor();
79+
}
80+
}
7481
private PropertyAccessor buildPropertyAccessor(Property mappedProperty) {
7582
if ( mappedProperty.isBackRef() ) {
7683
return mappedProperty.getPropertyAccessor(null);
@@ -134,15 +141,15 @@ protected ProxyFactory buildProxyFactory(PersistentClass mappingInfo, Getter idG
134141
*/
135142
@Override
136143
protected Getter buildPropertyGetter(AttributeBinding mappedProperty) {
137-
return PropertyFactory.getGetter( mappedProperty );
144+
return buildPropertyAccessor(mappedProperty).getGetter( null, mappedProperty.getAttribute().getName() );
138145
}
139146

140147
/**
141148
* {@inheritDoc}
142149
*/
143150
@Override
144151
protected Setter buildPropertySetter(AttributeBinding mappedProperty) {
145-
return PropertyFactory.getSetter( mappedProperty );
152+
return buildPropertyAccessor(mappedProperty).getSetter( null, mappedProperty.getAttribute().getName() );
146153
}
147154

148155
/**

hibernate-core/src/main/java/org/hibernate/tuple/entity/EntityMetamodel.java

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -382,15 +382,18 @@ public EntityMetamodel(EntityBinding entityBinding, SessionFactoryImplementor se
382382

383383
versioned = entityBinding.isVersioned();
384384

385-
boolean hasPojoRepresentation = false;
386-
Class<?> mappedClass = null;
385+
boolean hasPojoRepresentation = entityBinding.getHierarchyDetails().getEntityMode() == EntityMode.POJO;
387386
Class<?> proxyInterfaceClass = null;
388-
if ( entityBinding.getEntity().getClassReferenceUnresolved() != null ) {
389-
hasPojoRepresentation = true;
387+
Class<?> mappedClass = null;
388+
if ( hasPojoRepresentation ) {
390389
mappedClass = entityBinding.getEntity().getClassReference();
391390
proxyInterfaceClass = entityBinding.getProxyInterfaceType().getValue();
391+
instrumentationMetadata = Environment.getBytecodeProvider().getEntityInstrumentationMetadata( mappedClass );
392392
}
393-
instrumentationMetadata = Environment.getBytecodeProvider().getEntityInstrumentationMetadata( mappedClass );
393+
else {
394+
instrumentationMetadata = new NonPojoInstrumentationMetadata( entityBinding.getEntity().getName() );
395+
}
396+
394397

395398
boolean hasLazy = false;
396399

hibernate-core/src/test/java/org/hibernate/test/entitymode/map/subclass/SubclassDynamicMapTest.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,11 @@
2828
import org.junit.Test;
2929

3030
import org.hibernate.Session;
31-
import org.hibernate.testing.FailureExpectedWithNewMetamodel;
3231
import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase;
3332

3433
/**
3534
* @author Steve Ebersole
3635
*/
37-
@FailureExpectedWithNewMetamodel
3836
public class SubclassDynamicMapTest extends BaseCoreFunctionalTestCase {
3937
@Override
4038
public String[] getMappings() {

0 commit comments

Comments
 (0)