HHH-7459 lazyness is not processed correctly

This commit is contained in:
Strong Liu 2012-10-21 01:01:10 +08:00
parent 5cd3f85ac5
commit 845c757e07
14 changed files with 207 additions and 88 deletions

View File

@ -41,7 +41,7 @@ public @interface Tuplizer {
/** tuplizer implementation */
Class impl();
/**
* either pojo, dynamic-map or dom4j
* either pojo, dynamic-map
* @deprecated should use #entityModeType instead
*/
@Deprecated

View File

@ -325,7 +325,7 @@ public class DefaultLoadEventListener extends AbstractLockUpgradeEventListener i
}
return existing;
}
LOG.trace( "Creating new proxy for entity" );
LOG.trace( "Creating new proxy for entity: " + event.getEntityClassName() );
// return new uninitialized proxy
Object proxy = persister.createProxy( event.getEntityId(), event.getSession() );
persistenceContext.getBatchFetchQueue().addBatchLoadableEntityKey( keyToLoad );

View File

@ -28,6 +28,7 @@ import java.util.Collections;
import org.hibernate.AssertionFailure;
import org.hibernate.engine.spi.CascadeStyle;
import org.hibernate.metamodel.internal.source.annotations.attribute.PluralAssociationAttribute;
import org.hibernate.metamodel.internal.source.annotations.util.EnumConversionHelper;
import org.hibernate.metamodel.spi.source.OneToManyPluralAttributeElementSource;
/**
@ -52,8 +53,7 @@ public class OneToManyPluralAttributeElementSourceImpl implements OneToManyPlura
@Override
public Iterable<CascadeStyle> getCascadeStyles() {
// TODO
return Collections.emptyList();
return EnumConversionHelper.cascadeTypeToCascadeStyleSet( associationAttribute.getCascadeTypes(), associationAttribute.getContext() );
}
@Override

View File

@ -73,6 +73,11 @@ public class PluralAttributeSourceImpl implements PluralAttributeSource, Orderab
return elementSource;
}
@Override
public String getMappedBy() {
return associationAttribute.getMappedBy();
}
private PluralAttributeElementSource determineElementSource() {
switch ( associationAttribute.getNature() ) {
case MANY_TO_MANY:

View File

@ -161,6 +161,11 @@ public class ToOneAttributeSourceImpl extends SingularAttributeSourceImpl implem
}
}
@Override
public boolean isUnWrapProxy() {
return associationAttribute.isUnWrapProxy();
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder();

View File

@ -37,6 +37,8 @@ import org.jboss.jandex.AnnotationValue;
import org.jboss.jandex.DotName;
import org.jboss.logging.Logger;
import org.hibernate.annotations.FetchMode;
import org.hibernate.annotations.LazyToOneOption;
import org.hibernate.annotations.NotFoundAction;
import org.hibernate.engine.FetchStyle;
import org.hibernate.internal.CoreMessageLogger;
@ -69,6 +71,7 @@ public class AssociationAttribute extends MappedAttribute {
private final Set<CascadeType> cascadeTypes;
private final boolean isOptional;
private final boolean isLazy;
private final boolean isUnWrapProxy;
private final boolean isOrphanRemoval;
private final FetchStyle fetchStyle;
private final boolean mapsId;
@ -116,6 +119,7 @@ public class AssociationAttribute extends MappedAttribute {
this.mappedBy = determineMappedByAttributeName( associationAnnotation );
this.isOptional = determineOptionality( associationAnnotation );
this.isLazy = determineIsLazy( associationAnnotation );
this.isUnWrapProxy = determinIsUnwrapProxy();
this.isOrphanRemoval = determineOrphanRemoval( associationAnnotation );
this.cascadeTypes = determineCascadeTypes( associationAnnotation );
this.joinColumnValues = determineJoinColumnAnnotations( annotations );
@ -180,6 +184,10 @@ public class AssociationAttribute extends MappedAttribute {
return isLazy;
}
public boolean isUnWrapProxy() {
return isUnWrapProxy;
}
@Override
public boolean isOptional() {
return isOptional;
@ -238,6 +246,14 @@ public class AssociationAttribute extends MappedAttribute {
return NotFoundAction.IGNORE.equals( action );
}
private boolean determinIsUnwrapProxy() {
AnnotationInstance lazyToOne = JandexHelper.getSingleAnnotation( annotations(), HibernateDotNames.LAZY_TO_ONE );
if ( lazyToOne != null ) {
return JandexHelper.getEnumValue( lazyToOne, "value", LazyToOneOption.class ) == LazyToOneOption.NO_PROXY;
}
return false;
}
private boolean determineOptionality(AnnotationInstance associationAnnotation) {
boolean optional = true;
@ -260,7 +276,30 @@ public class AssociationAttribute extends MappedAttribute {
protected boolean determineIsLazy(AnnotationInstance associationAnnotation) {
FetchType fetchType = JandexHelper.getEnumValue( associationAnnotation, "fetch", FetchType.class );
return FetchType.LAZY == fetchType;
boolean lazy = fetchType == FetchType.LAZY;
final AnnotationInstance lazyToOneAnnotation = JandexHelper.getSingleAnnotation(
annotations(),
HibernateDotNames.LAZY_TO_ONE
);
if ( lazyToOneAnnotation != null ) {
LazyToOneOption option = JandexHelper.getEnumValue( lazyToOneAnnotation, "value", LazyToOneOption.class );
lazy = option != LazyToOneOption.FALSE;
}
if ( associationAnnotation.value( "fetch" ) != null ) {
lazy = FetchType.LAZY == fetchType;
}
final AnnotationInstance fetchAnnotation = JandexHelper.getSingleAnnotation(
annotations(),
HibernateDotNames.FETCH
);
if ( fetchAnnotation != null ) {
lazy = JandexHelper.getEnumValue( fetchAnnotation, "value", FetchMode.class ) != FetchMode.JOIN;
}
if ( getFetchStyle() != null ) {
lazy = getFetchStyle() != FetchStyle.JOIN;
}
return lazy;
}
private String determineReferencedEntityType(AnnotationInstance associationAnnotation, Class<?> referencedAttributeType) {

View File

@ -26,12 +26,15 @@ package org.hibernate.metamodel.internal.source.annotations.attribute;
import java.util.List;
import java.util.Map;
import javax.persistence.FetchType;
import org.jboss.jandex.AnnotationInstance;
import org.jboss.jandex.ClassInfo;
import org.jboss.jandex.DotName;
import org.hibernate.AnnotationException;
import org.hibernate.annotations.CacheConcurrencyStrategy;
import org.hibernate.annotations.FetchMode;
import org.hibernate.annotations.LazyCollectionOption;
import org.hibernate.annotations.OnDeleteAction;
import org.hibernate.annotations.SortType;
@ -231,7 +234,10 @@ public class PluralAssociationAttribute extends AssociationAttribute {
AnnotationInstance orderColumnAnnotation = JandexHelper.getSingleAnnotation( annotations, JPADotNames.ORDER_COLUMN );
AnnotationInstance indexColumnAnnotation = JandexHelper.getSingleAnnotation( annotations, HibernateDotNames.INDEX_COLUMN );
if ( orderColumnAnnotation != null && indexColumnAnnotation != null ) {
throw new MappingException( "@OrderColumn and @IndexColumn can't be used together on property: " + getRole() ,getContext().getOrigin() );
throw new MappingException(
"@OrderColumn and @IndexColumn can't be used together on property: " + getRole(),
getContext().getOrigin()
);
}
this.isIndexed = orderColumnAnnotation != null || indexColumnAnnotation != null;
@ -276,9 +282,11 @@ public class PluralAssociationAttribute extends AssociationAttribute {
}
return entityPersisterClass;
}
@Override
protected boolean determineIsLazy(AnnotationInstance associationAnnotation) {
boolean lazy = super.determineIsLazy( associationAnnotation );
FetchType fetchType = JandexHelper.getEnumValue( associationAnnotation, "fetch", FetchType.class );
boolean lazy = fetchType == FetchType.LAZY;
final AnnotationInstance lazyCollectionAnnotationInstance = JandexHelper.getSingleAnnotation(
annotations(),
HibernateDotNames.LAZY_COLLECTION
@ -289,9 +297,19 @@ public class PluralAssociationAttribute extends AssociationAttribute {
"value",
LazyCollectionOption.class
);
return lazyOption == LazyCollectionOption.TRUE;
lazy = !( lazyOption == LazyCollectionOption.FALSE );
}
final AnnotationInstance fetchAnnotation = JandexHelper.getSingleAnnotation(
annotations(),
HibernateDotNames.FETCH
);
if ( fetchAnnotation != null && fetchAnnotation.value() != null ) {
FetchMode fetchMode = FetchMode.valueOf( fetchAnnotation.value( ).asEnum().toUpperCase() );
if ( fetchMode == FetchMode.JOIN ) {
lazy = false;
}
}
return lazy;
}

View File

@ -44,6 +44,7 @@ import org.hibernate.AssertionFailure;
import org.hibernate.EntityMode;
import org.hibernate.HibernateException;
import org.hibernate.internal.CoreMessageLogger;
import org.hibernate.internal.util.StringHelper;
import org.hibernate.metamodel.internal.source.annotations.AnnotationBindingContext;
import org.hibernate.metamodel.internal.source.annotations.attribute.AssociationAttribute;
import org.hibernate.metamodel.internal.source.annotations.attribute.AttributeOverride;
@ -526,10 +527,10 @@ public class ConfiguredClass {
if ( embeddableClassInfo == null ) {
final String msg = String.format(
"Attribute '%s#%s' is annotated with @Embedded, but '%s' does not seem to be annotated " +
"with @Embeddable. Are all annotated classes added to the configuration?",
getConfiguredClass().getSimpleName(),
"with @Embeddable.\n Are all annotated classes added to the configuration?",
getConfiguredClass().getName(),
attributeName,
type.getSimpleName()
type.getName()
);
throw new AnnotationException( msg );
}
@ -669,6 +670,9 @@ public class ConfiguredClass {
}
private Class<?> resolveCollectionValuedReferenceType(ResolvedMember resolvedMember) {
if ( resolvedMember.getType().isArray() ) {
return resolvedMember.getType().getArrayElementType().getErasedType();
}
if ( resolvedMember.getType().getTypeParameters().isEmpty() ) {
return null; // no generic at all
}
@ -752,28 +756,44 @@ public class ConfiguredClass {
final AnnotationInstance tuplizersAnnotation = JandexHelper.getSingleAnnotation(
classInfo, HibernateDotNames.TUPLIZERS
);
if ( tuplizersAnnotation == null ) {
return null;
}
final AnnotationInstance tuplizerAnnotation = JandexHelper.getSingleAnnotation(
classInfo,
HibernateDotNames.TUPLIZER
);
if ( tuplizersAnnotation != null ) {
AnnotationInstance[] annotations = JandexHelper.getValue(
tuplizersAnnotation,
"value",
AnnotationInstance[].class
);
AnnotationInstance pojoTuplizerAnnotation = null;
for ( AnnotationInstance tuplizerAnnotation : annotations ) {
if ( EntityMode.valueOf( tuplizerAnnotation.value( "entityModeType" ).asEnum() ) == EntityMode.POJO ) {
pojoTuplizerAnnotation = tuplizerAnnotation;
break;
for ( final AnnotationInstance annotationInstance : annotations ) {
final String impl = findTuplizerImpl( annotationInstance );
if ( StringHelper.isNotEmpty( impl ) ) {
return impl;
}
}
}
else if ( tuplizerAnnotation != null ) {
final String impl = findTuplizerImpl( tuplizerAnnotation );
if ( StringHelper.isNotEmpty( impl ) ) {
return impl;
}
}
return null;
}
String customTuplizer = null;
if ( pojoTuplizerAnnotation != null ) {
customTuplizer = pojoTuplizerAnnotation.value( "impl" ).asString();
private String findTuplizerImpl(final AnnotationInstance tuplizerAnnotation) {
EntityMode mode;
if ( tuplizerAnnotation.value( "entityModeType" ) != null ) {
mode = EntityMode.valueOf( tuplizerAnnotation.value( "entityModeType" ).asEnum() );
}
return customTuplizer;
else if ( tuplizerAnnotation.value( "entityMode" ) != null ) {
mode = EntityMode.parse( tuplizerAnnotation.value( "entityMode" ).asString() );
}
else {
mode = EntityMode.POJO;
}
return mode == EntityMode.POJO ? tuplizerAnnotation.value( "impl" ).asString() : null;
}
}

View File

@ -82,7 +82,7 @@ public class EntityClass extends ConfiguredClass {
private final List<String> synchronizedTableNames;
private final int batchSize;
private boolean isMutable;
private boolean isImmutable;
private boolean isExplicitPolymorphism;
private OptimisticLockStyle optimisticLockStyle;
private String whereClause;
@ -152,7 +152,7 @@ public class EntityClass extends ConfiguredClass {
}
public boolean isMutable() {
return isMutable;
return !isImmutable;
}
public OptimisticLockStyle getOptimisticLockStyle() {
@ -287,11 +287,16 @@ public class EntityClass extends ConfiguredClass {
optimisticLockStyle = OptimisticLockStyle.valueOf( optimisticLockType.name() );
AnnotationInstance hibernateImmutableAnnotation = JandexHelper.getSingleAnnotation( getClassInfo(), HibernateDotNames.IMMUTABLE, ClassInfo.class );
isMutable = hibernateImmutableAnnotation == null
&& hibernateEntityAnnotation != null
&& hibernateEntityAnnotation.value( "mutable" ) != null
&& hibernateEntityAnnotation.value( "mutable" ).asBoolean();
if ( hibernateImmutableAnnotation != null ) {
isImmutable = true;
}
else if (hibernateEntityAnnotation != null
&& hibernateEntityAnnotation.value( "mutable" ) != null){
isImmutable = !hibernateEntityAnnotation.value( "mutable" ).asBoolean();
} else {
isImmutable = false;
}
final AnnotationInstance whereAnnotation = JandexHelper.getSingleAnnotation(
getClassInfo(), HibernateDotNames.WHERE

View File

@ -127,6 +127,14 @@ class ManyToOneAttributeSourceImpl extends AbstractHbmSourceNode implements ToOn
return getFetchTiming() != FetchTiming.IMMEDIATE;
}
@Override
public boolean isUnWrapProxy() {
final String lazySelection = manyToOneElement.getLazy() != null
? manyToOneElement.getLazy().value()
: null;
return lazySelection != null && lazySelection.equals( "no-proxy" );
}
@Override
public SingularAttributeBinding.NaturalIdMutability getNaturalIdMutability() {
return naturalIdMutability;

View File

@ -53,7 +53,7 @@ public class ManyToOneAttributeBinding
private CascadeStyle cascadeStyle;
private FetchTiming fetchTiming;
private FetchStyle fetchStyle;
private boolean isUnWrapProxy;
public ManyToOneAttributeBinding(
AttributeBindingContainer container,
SingularAttribute attribute,
@ -180,6 +180,14 @@ public class ManyToOneAttributeBinding
}
}
public boolean isUnWrapProxy() {
return isUnWrapProxy;
}
public void setUnWrapProxy(boolean unWrapProxy) {
isUnWrapProxy = unWrapProxy;
}
@Override
public final EntityBinding getReferencedEntityBinding() {
return referencedEntityBinding;

View File

@ -41,4 +41,6 @@ public interface SingularAssociationAttributeBinding extends SingularAttributeBi
public EntityBinding getReferencedEntityBinding();
public SingularAttributeBinding getReferencedAttributeBinding();
public boolean isUnWrapProxy();
public void setUnWrapProxy(boolean unWrapProxy);
}

View File

@ -43,6 +43,6 @@ public interface ToOneAttributeSource
* @return The name of the referenced entity
*/
public String getReferencedEntityName();
public boolean isUnWrapProxy();
public List<Binder.DefaultNamingStrategy> getDefaultNamingStrategies(final String entityName, final String tableName, final AttributeBinding referencedAttributeBinding);
}

View File

@ -250,16 +250,25 @@ public class EnumType implements EnhancedUserType, DynamicParameterizedType, Ser
@Override
public String objectToSQLString(Object value) {
if(enumValueMapper==null){
guessTypeOfEnumValueMapper( sqlType );
}
return enumValueMapper.objectToSQLString( (Enum) value );
}
@Override
public String toXMLString(Object value) {
if(enumValueMapper==null){
guessTypeOfEnumValueMapper( sqlType );
}
return enumValueMapper.toXMLString( (Enum) value );
}
@Override
public Object fromXMLString(String xmlValue) {
if(enumValueMapper==null){
guessTypeOfEnumValueMapper( sqlType );
}
return enumValueMapper.fromXMLString( xmlValue );
}