HHH-6171 Implementing lazy, optional, property generation, insertable and updatable ofSimpleAttributeBindingState
This commit is contained in:
parent
d6b36fca5a
commit
fc456e3756
|
@ -23,8 +23,12 @@
|
||||||
*/
|
*/
|
||||||
package org.hibernate.metamodel.source.annotations.entity;
|
package org.hibernate.metamodel.source.annotations.entity;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
import org.jboss.jandex.AnnotationInstance;
|
import org.jboss.jandex.AnnotationInstance;
|
||||||
import org.jboss.jandex.AnnotationValue;
|
import org.jboss.jandex.AnnotationValue;
|
||||||
|
import org.jboss.jandex.DotName;
|
||||||
|
|
||||||
import org.hibernate.AnnotationException;
|
import org.hibernate.AnnotationException;
|
||||||
import org.hibernate.AssertionFailure;
|
import org.hibernate.AssertionFailure;
|
||||||
|
@ -116,9 +120,10 @@ public class EntityBinder {
|
||||||
}
|
}
|
||||||
|
|
||||||
private void bindDiscriminatorColumn(EntityBinding entityBinding) {
|
private void bindDiscriminatorColumn(EntityBinding entityBinding) {
|
||||||
MappedAttribute discriminatorAttribute = MappedAttribute.createDiscriminatorAttribute(
|
final Map<DotName, List<AnnotationInstance>> typeAnnotations = JandexHelper.getTypeAnnotations(
|
||||||
configuredClass.getClassInfo().annotations()
|
configuredClass.getClassInfo()
|
||||||
);
|
);
|
||||||
|
MappedAttribute discriminatorAttribute = MappedAttribute.createDiscriminatorAttribute( typeAnnotations );
|
||||||
|
|
||||||
bindSingleMappedAttribute( entityBinding, discriminatorAttribute );
|
bindSingleMappedAttribute( entityBinding, discriminatorAttribute );
|
||||||
|
|
||||||
|
|
|
@ -27,6 +27,7 @@ import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import javax.persistence.DiscriminatorType;
|
import javax.persistence.DiscriminatorType;
|
||||||
|
import javax.persistence.FetchType;
|
||||||
|
|
||||||
import org.jboss.jandex.AnnotationInstance;
|
import org.jboss.jandex.AnnotationInstance;
|
||||||
import org.jboss.jandex.AnnotationValue;
|
import org.jboss.jandex.AnnotationValue;
|
||||||
|
@ -34,12 +35,14 @@ import org.jboss.jandex.DotName;
|
||||||
|
|
||||||
import org.hibernate.AnnotationException;
|
import org.hibernate.AnnotationException;
|
||||||
import org.hibernate.AssertionFailure;
|
import org.hibernate.AssertionFailure;
|
||||||
|
import org.hibernate.annotations.GenerationTime;
|
||||||
|
import org.hibernate.mapping.PropertyGeneration;
|
||||||
import org.hibernate.metamodel.source.annotations.HibernateDotNames;
|
import org.hibernate.metamodel.source.annotations.HibernateDotNames;
|
||||||
import org.hibernate.metamodel.source.annotations.JPADotNames;
|
import org.hibernate.metamodel.source.annotations.JPADotNames;
|
||||||
import org.hibernate.metamodel.source.annotations.util.JandexHelper;
|
import org.hibernate.metamodel.source.annotations.util.JandexHelper;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Represent a mapped attribute (explicitly or implicitly mapped). Also used for synthetic attributes likes a
|
* Represent a mapped attribute (explicitly or implicitly mapped). Also used for synthetic attributes like a
|
||||||
* discriminator column.
|
* discriminator column.
|
||||||
*
|
*
|
||||||
* @author Hardy Ferentschik
|
* @author Hardy Ferentschik
|
||||||
|
@ -52,25 +55,24 @@ public class MappedAttribute implements Comparable<MappedAttribute> {
|
||||||
private final String type;
|
private final String type;
|
||||||
private final Map<String, String> typeParameters;
|
private final Map<String, String> typeParameters;
|
||||||
|
|
||||||
private final ColumnValues columnValues;
|
|
||||||
|
|
||||||
private final boolean isId;
|
private final boolean isId;
|
||||||
private final boolean isVersioned;
|
private final boolean isVersioned;
|
||||||
private final boolean isDiscriminator;
|
private final boolean isDiscriminator;
|
||||||
|
|
||||||
|
private boolean isLazy = false;
|
||||||
|
private boolean isOptional = true;
|
||||||
|
|
||||||
|
private PropertyGeneration propertyGeneration;
|
||||||
|
private boolean isInsertable = true;
|
||||||
|
private boolean isUpdatable = true;
|
||||||
|
|
||||||
|
private final ColumnValues columnValues;
|
||||||
|
|
||||||
static MappedAttribute createMappedAttribute(String name, String type, Map<DotName, List<AnnotationInstance>> annotations) {
|
static MappedAttribute createMappedAttribute(String name, String type, Map<DotName, List<AnnotationInstance>> annotations) {
|
||||||
return new MappedAttribute( name, type, annotations, false );
|
return new MappedAttribute( name, type, annotations, false );
|
||||||
}
|
}
|
||||||
|
|
||||||
static MappedAttribute createDiscriminatorAttribute(Map<DotName, List<AnnotationInstance>> annotations) {
|
static MappedAttribute createDiscriminatorAttribute(Map<DotName, List<AnnotationInstance>> annotations) {
|
||||||
Map<DotName, List<AnnotationInstance>> discriminatorAnnotations = JandexHelper.filterAnnotations(
|
|
||||||
annotations,
|
|
||||||
JPADotNames.DISCRIMINATOR_COLUMN,
|
|
||||||
JPADotNames.DISCRIMINATOR_VALUE,
|
|
||||||
HibernateDotNames.DISCRIMINATOR_FORMULA,
|
|
||||||
HibernateDotNames.DISCRIMINATOR_OPTIONS
|
|
||||||
);
|
|
||||||
|
|
||||||
AnnotationInstance discriminatorOptionsAnnotation = JandexHelper.getSingleAnnotation(
|
AnnotationInstance discriminatorOptionsAnnotation = JandexHelper.getSingleAnnotation(
|
||||||
annotations, JPADotNames.DISCRIMINATOR_COLUMN
|
annotations, JPADotNames.DISCRIMINATOR_COLUMN
|
||||||
);
|
);
|
||||||
|
@ -100,7 +102,7 @@ public class MappedAttribute implements Comparable<MappedAttribute> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return new MappedAttribute( name, type, discriminatorAnnotations, true );
|
return new MappedAttribute( name, type, annotations, true );
|
||||||
}
|
}
|
||||||
|
|
||||||
private MappedAttribute(String name, String type, Map<DotName, List<AnnotationInstance>> annotations, boolean isDiscriminator) {
|
private MappedAttribute(String name, String type, Map<DotName, List<AnnotationInstance>> annotations, boolean isDiscriminator) {
|
||||||
|
@ -130,6 +132,9 @@ public class MappedAttribute implements Comparable<MappedAttribute> {
|
||||||
columnValues.setUnique( true );
|
columnValues.setUnique( true );
|
||||||
columnValues.setNullable( false );
|
columnValues.setNullable( false );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
checkBasicAnnotation();
|
||||||
|
checkGeneratedAnnotation();
|
||||||
}
|
}
|
||||||
|
|
||||||
public final String getName() {
|
public final String getName() {
|
||||||
|
@ -160,6 +165,26 @@ public class MappedAttribute implements Comparable<MappedAttribute> {
|
||||||
return isDiscriminator;
|
return isDiscriminator;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isLazy() {
|
||||||
|
return isLazy;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isOptional() {
|
||||||
|
return isOptional;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isInsertable() {
|
||||||
|
return isInsertable;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isUpdatable() {
|
||||||
|
return isUpdatable;
|
||||||
|
}
|
||||||
|
|
||||||
|
public PropertyGeneration getPropertyGeneration() {
|
||||||
|
return propertyGeneration;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the annotation with the specified name or {@code null}
|
* Returns the annotation with the specified name or {@code null}
|
||||||
*
|
*
|
||||||
|
@ -227,6 +252,40 @@ public class MappedAttribute implements Comparable<MappedAttribute> {
|
||||||
|
|
||||||
return typeAnnotation.value( "type" ).asString();
|
return typeAnnotation.value( "type" ).asString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void checkBasicAnnotation() {
|
||||||
|
AnnotationInstance basicAnnotation = getIfExists( JPADotNames.BASIC );
|
||||||
|
if ( basicAnnotation != null ) {
|
||||||
|
FetchType fetchType = FetchType.LAZY;
|
||||||
|
AnnotationValue fetchValue = basicAnnotation.value( "fetch" );
|
||||||
|
if ( fetchValue != null ) {
|
||||||
|
fetchType = Enum.valueOf( FetchType.class, fetchValue.asEnum() );
|
||||||
|
}
|
||||||
|
this.isLazy = fetchType == FetchType.LAZY;
|
||||||
|
|
||||||
|
AnnotationValue optionalValue = basicAnnotation.value( "optional" );
|
||||||
|
if ( optionalValue != null ) {
|
||||||
|
this.isOptional = optionalValue.asBoolean();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO - there is more todo for updatable and insertable. Checking the @Generated annotation is only one part (HF)
|
||||||
|
private void checkGeneratedAnnotation() {
|
||||||
|
AnnotationInstance generatedAnnotation = getIfExists( HibernateDotNames.GENERATED );
|
||||||
|
if ( generatedAnnotation != null ) {
|
||||||
|
this.isInsertable = false;
|
||||||
|
|
||||||
|
AnnotationValue generationTimeValue = generatedAnnotation.value();
|
||||||
|
if ( generationTimeValue != null ) {
|
||||||
|
GenerationTime genTime = Enum.valueOf( GenerationTime.class, generationTimeValue.asEnum() );
|
||||||
|
if ( GenerationTime.ALWAYS.equals( genTime ) ) {
|
||||||
|
this.isUpdatable = false;
|
||||||
|
this.propertyGeneration = PropertyGeneration.parse( genTime.toString().toLowerCase() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -37,7 +37,6 @@ import org.hibernate.metamodel.source.annotations.entity.MappedAttribute;
|
||||||
*/
|
*/
|
||||||
public class AttributeBindingStateImpl implements SimpleAttributeBindingState {
|
public class AttributeBindingStateImpl implements SimpleAttributeBindingState {
|
||||||
private final MappedAttribute mappedAttribute;
|
private final MappedAttribute mappedAttribute;
|
||||||
private final PropertyGeneration propertyGeneration = null;
|
|
||||||
private final String typeName;
|
private final String typeName;
|
||||||
private final Map<String, String> typeParameters;
|
private final Map<String, String> typeParameters;
|
||||||
|
|
||||||
|
@ -54,35 +53,17 @@ public class AttributeBindingStateImpl implements SimpleAttributeBindingState {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public PropertyGeneration getPropertyGeneration() {
|
public PropertyGeneration getPropertyGeneration() {
|
||||||
|
return mappedAttribute.getPropertyGeneration();
|
||||||
// GeneratedValue generatedValue = property.getAnnotation( GeneratedValue.class );
|
|
||||||
// String generatorType = generatedValue != null ?
|
|
||||||
// generatorType( generatedValue.strategy(), mappings ) :
|
|
||||||
// "assigned";
|
|
||||||
// String generatorName = generatedValue != null ?
|
|
||||||
// generatedValue.generator() :
|
|
||||||
// BinderHelper.ANNOTATION_STRING_DEFAULT;
|
|
||||||
return propertyGeneration;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isInsertable() {
|
public boolean isInsertable() {
|
||||||
return false; //To change body of implemented methods use File | Settings | File Templates.
|
return mappedAttribute.isInsertable();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isUpdatable() {
|
public boolean isUpdatable() {
|
||||||
return false; //To change body of implemented methods use File | Settings | File Templates.
|
return mappedAttribute.isUpdatable();
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isKeyCascadeDeleteEnabled() {
|
|
||||||
return false; //To change body of implemented methods use File | Settings | File Templates.
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getUnsavedValue() {
|
|
||||||
return null; //To change body of implemented methods use File | Settings | File Templates.
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -97,9 +78,19 @@ public class AttributeBindingStateImpl implements SimpleAttributeBindingState {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isLazy() {
|
public boolean isLazy() {
|
||||||
|
return mappedAttribute.isLazy();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isKeyCascadeDeleteEnabled() {
|
||||||
return false; //To change body of implemented methods use File | Settings | File Templates.
|
return false; //To change body of implemented methods use File | Settings | File Templates.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getUnsavedValue() {
|
||||||
|
return null; //To change body of implemented methods use File | Settings | File Templates.
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getPropertyAccessorName() {
|
public String getPropertyAccessorName() {
|
||||||
return null; //To change body of implemented methods use File | Settings | File Templates.
|
return null; //To change body of implemented methods use File | Settings | File Templates.
|
||||||
|
|
|
@ -126,20 +126,6 @@ public class JandexHelper {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @param annotations List of annotation instances keyed against their dot name.
|
|
||||||
* @param annotationNames the annotation names to filter
|
|
||||||
*
|
|
||||||
* @return a new map of annotation instances only containing annotations of the specified dot names.
|
|
||||||
*/
|
|
||||||
public static Map<DotName, List<AnnotationInstance>> filterAnnotations(Map<DotName, List<AnnotationInstance>> annotations, DotName... annotationNames) {
|
|
||||||
Map<DotName, List<AnnotationInstance>> filteredAnnotations = new HashMap<DotName, List<AnnotationInstance>>();
|
|
||||||
for ( DotName name : annotationNames ) {
|
|
||||||
filteredAnnotations.put( name, annotations.get( name ) );
|
|
||||||
}
|
|
||||||
return filteredAnnotations;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a jandex index for the specified classes
|
* Creates a jandex index for the specified classes
|
||||||
*
|
*
|
||||||
|
@ -202,6 +188,22 @@ public class JandexHelper {
|
||||||
return annotations;
|
return annotations;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static Map<DotName, List<AnnotationInstance>> getTypeAnnotations(ClassInfo classInfo) {
|
||||||
|
if ( classInfo == null ) {
|
||||||
|
throw new IllegalArgumentException( "classInfo cannot be null" );
|
||||||
|
}
|
||||||
|
|
||||||
|
Map<DotName, List<AnnotationInstance>> annotations = new HashMap<DotName, List<AnnotationInstance>>();
|
||||||
|
for ( List<AnnotationInstance> annotationList : classInfo.annotations().values() ) {
|
||||||
|
for ( AnnotationInstance instance : annotationList ) {
|
||||||
|
if ( instance.target() instanceof ClassInfo ) {
|
||||||
|
addAnnotationToMap( instance, annotations );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return annotations;
|
||||||
|
}
|
||||||
|
|
||||||
private static void addAnnotationToMap(AnnotationInstance instance, Map<DotName, List<AnnotationInstance>> annotations) {
|
private static void addAnnotationToMap(AnnotationInstance instance, Map<DotName, List<AnnotationInstance>> annotations) {
|
||||||
DotName dotName = instance.name();
|
DotName dotName = instance.name();
|
||||||
List<AnnotationInstance> list;
|
List<AnnotationInstance> list;
|
||||||
|
|
Loading…
Reference in New Issue