HHH-7037 pushing attribute nature into MappedAttribute and creating empty source impls for *toMany sources
This commit is contained in:
parent
1657f9f605
commit
3aaed02a2e
|
@ -31,7 +31,6 @@ import java.util.List;
|
||||||
import org.jboss.jandex.AnnotationInstance;
|
import org.jboss.jandex.AnnotationInstance;
|
||||||
import org.jboss.jandex.Index;
|
import org.jboss.jandex.Index;
|
||||||
import org.jboss.jandex.Indexer;
|
import org.jboss.jandex.Indexer;
|
||||||
import org.jboss.logging.Logger;
|
|
||||||
|
|
||||||
import org.hibernate.AssertionFailure;
|
import org.hibernate.AssertionFailure;
|
||||||
import org.hibernate.HibernateException;
|
import org.hibernate.HibernateException;
|
||||||
|
@ -60,8 +59,6 @@ import org.hibernate.service.classloading.spi.ClassLoaderService;
|
||||||
* @author Steve Ebersole
|
* @author Steve Ebersole
|
||||||
*/
|
*/
|
||||||
public class AnnotationMetadataSourceProcessorImpl implements MetadataSourceProcessor {
|
public class AnnotationMetadataSourceProcessorImpl implements MetadataSourceProcessor {
|
||||||
private static final Logger LOG = Logger.getLogger( AnnotationMetadataSourceProcessorImpl.class );
|
|
||||||
|
|
||||||
private final MetadataImplementor metadata;
|
private final MetadataImplementor metadata;
|
||||||
|
|
||||||
private AnnotationBindingContext bindingContext;
|
private AnnotationBindingContext bindingContext;
|
||||||
|
|
|
@ -54,7 +54,6 @@ import org.hibernate.metamodel.spi.source.MappingException;
|
||||||
* @author Hardy Ferentschik
|
* @author Hardy Ferentschik
|
||||||
*/
|
*/
|
||||||
public class AssociationAttribute extends MappedAttribute {
|
public class AssociationAttribute extends MappedAttribute {
|
||||||
private final AttributeNature associationNature;
|
|
||||||
private final boolean ignoreNotFound;
|
private final boolean ignoreNotFound;
|
||||||
private final String referencedEntityType;
|
private final String referencedEntityType;
|
||||||
private final String mappedBy;
|
private final String mappedBy;
|
||||||
|
@ -90,17 +89,16 @@ public class AssociationAttribute extends MappedAttribute {
|
||||||
|
|
||||||
AssociationAttribute(String name,
|
AssociationAttribute(String name,
|
||||||
Class<?> javaType,
|
Class<?> javaType,
|
||||||
AttributeNature associationType,
|
AttributeNature attributeNature,
|
||||||
String accessType,
|
String accessType,
|
||||||
Map<DotName, List<AnnotationInstance>> annotations,
|
Map<DotName, List<AnnotationInstance>> annotations,
|
||||||
EntityBindingContext context) {
|
EntityBindingContext context) {
|
||||||
super( name, javaType, accessType, annotations, context );
|
super( name, javaType, attributeNature, accessType, annotations, context );
|
||||||
this.associationNature = associationType;
|
|
||||||
this.ignoreNotFound = ignoreNotFound();
|
this.ignoreNotFound = ignoreNotFound();
|
||||||
|
|
||||||
AnnotationInstance associationAnnotation = JandexHelper.getSingleAnnotation(
|
AnnotationInstance associationAnnotation = JandexHelper.getSingleAnnotation(
|
||||||
annotations,
|
annotations,
|
||||||
associationType.getAnnotationDotName()
|
attributeNature.getAnnotationDotName()
|
||||||
);
|
);
|
||||||
|
|
||||||
// using jandex we don't really care which exact type of annotation we are dealing with
|
// using jandex we don't really care which exact type of annotation we are dealing with
|
||||||
|
@ -129,10 +127,6 @@ public class AssociationAttribute extends MappedAttribute {
|
||||||
return mappedBy;
|
return mappedBy;
|
||||||
}
|
}
|
||||||
|
|
||||||
public AttributeNature getAssociationNature() {
|
|
||||||
return associationNature;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Set<CascadeType> getCascadeTypes() {
|
public Set<CascadeType> getCascadeTypes() {
|
||||||
return cascadeTypes;
|
return cascadeTypes;
|
||||||
}
|
}
|
||||||
|
@ -324,8 +318,8 @@ public class AssociationAttribute extends MappedAttribute {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( !( AttributeNature.MANY_TO_ONE.equals( getAssociationNature() ) || AttributeNature.MANY_TO_ONE
|
if ( !( AttributeNature.MANY_TO_ONE.equals( getAttributeNature() ) || AttributeNature.MANY_TO_ONE
|
||||||
.equals( getAssociationNature() ) ) ) {
|
.equals( getAttributeNature() ) ) ) {
|
||||||
throw new MappingException(
|
throw new MappingException(
|
||||||
"@MapsId can only be specified on a many-to-one or one-to-one associations",
|
"@MapsId can only be specified on a many-to-one or one-to-one associations",
|
||||||
getContext().getOrigin()
|
getContext().getOrigin()
|
||||||
|
|
|
@ -25,6 +25,7 @@ package org.hibernate.metamodel.internal.source.annotations.attribute;
|
||||||
|
|
||||||
import org.jboss.jandex.DotName;
|
import org.jboss.jandex.DotName;
|
||||||
|
|
||||||
|
import org.hibernate.metamodel.internal.source.annotations.HibernateDotNames;
|
||||||
import org.hibernate.metamodel.internal.source.annotations.JPADotNames;
|
import org.hibernate.metamodel.internal.source.annotations.JPADotNames;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -38,6 +39,7 @@ public enum AttributeNature {
|
||||||
ONE_TO_MANY( JPADotNames.ONE_TO_MANY ),
|
ONE_TO_MANY( JPADotNames.ONE_TO_MANY ),
|
||||||
MANY_TO_ONE( JPADotNames.MANY_TO_ONE ),
|
MANY_TO_ONE( JPADotNames.MANY_TO_ONE ),
|
||||||
MANY_TO_MANY( JPADotNames.MANY_TO_MANY ),
|
MANY_TO_MANY( JPADotNames.MANY_TO_MANY ),
|
||||||
|
MANY_TO_ANY( HibernateDotNames.MANY_TO_ANY ),
|
||||||
ELEMENT_COLLECTION( JPADotNames.ELEMENT_COLLECTION ),
|
ELEMENT_COLLECTION( JPADotNames.ELEMENT_COLLECTION ),
|
||||||
EMBEDDED_ID( JPADotNames.EMBEDDED_ID ),
|
EMBEDDED_ID( JPADotNames.EMBEDDED_ID ),
|
||||||
EMBEDDED( JPADotNames.EMBEDDED );
|
EMBEDDED( JPADotNames.EMBEDDED );
|
||||||
|
|
|
@ -93,23 +93,24 @@ public class BasicAttribute extends MappedAttribute {
|
||||||
|
|
||||||
private final String customWriteFragment;
|
private final String customWriteFragment;
|
||||||
private final String customReadFragment;
|
private final String customReadFragment;
|
||||||
private final String checkCondition;
|
|
||||||
private AttributeTypeResolver resolver;
|
private AttributeTypeResolver resolver;
|
||||||
|
|
||||||
public static BasicAttribute createSimpleAttribute(String name,
|
public static BasicAttribute createSimpleAttribute(String name,
|
||||||
Class<?> attributeType,
|
Class<?> attributeType,
|
||||||
|
AttributeNature attributeNature,
|
||||||
Map<DotName, List<AnnotationInstance>> annotations,
|
Map<DotName, List<AnnotationInstance>> annotations,
|
||||||
String accessType,
|
String accessType,
|
||||||
EntityBindingContext context) {
|
EntityBindingContext context) {
|
||||||
return new BasicAttribute( name, attributeType, accessType, annotations, context );
|
return new BasicAttribute( name, attributeType, attributeNature, accessType, annotations, context );
|
||||||
}
|
}
|
||||||
|
|
||||||
BasicAttribute(String name,
|
BasicAttribute(String name,
|
||||||
Class<?> attributeType,
|
Class<?> attributeType,
|
||||||
|
AttributeNature attributeNature,
|
||||||
String accessType,
|
String accessType,
|
||||||
Map<DotName, List<AnnotationInstance>> annotations,
|
Map<DotName, List<AnnotationInstance>> annotations,
|
||||||
EntityBindingContext context) {
|
EntityBindingContext context) {
|
||||||
super( name, attributeType, accessType, annotations, context );
|
super( name, attributeType, attributeNature, accessType, annotations, context );
|
||||||
|
|
||||||
AnnotationInstance versionAnnotation = JandexHelper.getSingleAnnotation( annotations, JPADotNames.VERSION );
|
AnnotationInstance versionAnnotation = JandexHelper.getSingleAnnotation( annotations, JPADotNames.VERSION );
|
||||||
isVersioned = versionAnnotation != null;
|
isVersioned = versionAnnotation != null;
|
||||||
|
@ -149,7 +150,7 @@ public class BasicAttribute extends MappedAttribute {
|
||||||
String[] readWrite = createCustomReadWrite( columnTransformerAnnotations );
|
String[] readWrite = createCustomReadWrite( columnTransformerAnnotations );
|
||||||
this.customReadFragment = readWrite[0];
|
this.customReadFragment = readWrite[0];
|
||||||
this.customWriteFragment = readWrite[1];
|
this.customWriteFragment = readWrite[1];
|
||||||
this.checkCondition = parseCheckAnnotation();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isVersioned() {
|
public boolean isVersioned() {
|
||||||
|
@ -184,10 +185,6 @@ public class BasicAttribute extends MappedAttribute {
|
||||||
return customReadFragment;
|
return customReadFragment;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getCheckCondition() {
|
|
||||||
return checkCondition;
|
|
||||||
}
|
|
||||||
|
|
||||||
public IdGenerator getIdGenerator() {
|
public IdGenerator getIdGenerator() {
|
||||||
return idGenerator;
|
return idGenerator;
|
||||||
}
|
}
|
||||||
|
@ -291,15 +288,6 @@ public class BasicAttribute extends MappedAttribute {
|
||||||
return readWrite;
|
return readWrite;
|
||||||
}
|
}
|
||||||
|
|
||||||
private String parseCheckAnnotation() {
|
|
||||||
String checkCondition = null;
|
|
||||||
AnnotationInstance checkAnnotation = JandexHelper.getSingleAnnotation( annotations(), HibernateDotNames.CHECK );
|
|
||||||
if ( checkAnnotation != null ) {
|
|
||||||
checkCondition = checkAnnotation.value( "constraints" ).toString();
|
|
||||||
}
|
|
||||||
return checkCondition;
|
|
||||||
}
|
|
||||||
|
|
||||||
private IdGenerator checkGeneratedValueAnnotation() {
|
private IdGenerator checkGeneratedValueAnnotation() {
|
||||||
IdGenerator generator = null;
|
IdGenerator generator = null;
|
||||||
AnnotationInstance generatedValueAnnotation = JandexHelper.getSingleAnnotation(
|
AnnotationInstance generatedValueAnnotation = JandexHelper.getSingleAnnotation(
|
||||||
|
|
|
@ -25,10 +25,9 @@ package org.hibernate.metamodel.internal.source.annotations.attribute;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.hibernate.FetchMode;
|
|
||||||
import org.hibernate.annotations.common.reflection.java.JavaXMember;
|
|
||||||
import org.hibernate.engine.spi.CascadeStyle;
|
import org.hibernate.engine.spi.CascadeStyle;
|
||||||
import org.hibernate.metamodel.spi.binding.CascadeType;
|
import org.hibernate.metamodel.spi.binding.CascadeType;
|
||||||
import org.hibernate.metamodel.spi.source.ManyToManyPluralAttributeElementSource;
|
import org.hibernate.metamodel.spi.source.ManyToManyPluralAttributeElementSource;
|
||||||
|
@ -38,11 +37,10 @@ import org.hibernate.metamodel.spi.source.RelationalValueSource;
|
||||||
/**
|
/**
|
||||||
* @author Hardy Ferentschik
|
* @author Hardy Ferentschik
|
||||||
*/
|
*/
|
||||||
public class ManyToManyPluralAttributeElementSourceImpl
|
public class ManyToManyPluralAttributeElementSourceImpl implements ManyToManyPluralAttributeElementSource {
|
||||||
implements ManyToManyPluralAttributeElementSource {
|
private final PluralAssociationAttribute associationAttribute;
|
||||||
private final CollectionAssociationAttribute associationAttribute;
|
|
||||||
|
|
||||||
public ManyToManyPluralAttributeElementSourceImpl(CollectionAssociationAttribute associationAttribute) {
|
public ManyToManyPluralAttributeElementSourceImpl(PluralAssociationAttribute associationAttribute) {
|
||||||
this.associationAttribute = associationAttribute;
|
this.associationAttribute = associationAttribute;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -59,7 +57,13 @@ public class ManyToManyPluralAttributeElementSourceImpl
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Collection<String> getReferencedColumnNames() {
|
public Collection<String> getReferencedColumnNames() {
|
||||||
return null; //To change body of implemented methods use File | Settings | File Templates.
|
HashSet<String> referencedColumnNames = new HashSet<String>();
|
||||||
|
for ( Column column : associationAttribute.getColumnValues() ) {
|
||||||
|
if ( column.getReferencedColumnName() != null ) {
|
||||||
|
referencedColumnNames.add( column.getReferencedColumnName() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return referencedColumnNames;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -59,6 +59,11 @@ public abstract class MappedAttribute implements Comparable<MappedAttribute> {
|
||||||
*/
|
*/
|
||||||
private final Class<?> attributeType;
|
private final Class<?> attributeType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The nature of the attribute
|
||||||
|
*/
|
||||||
|
AttributeNature attributeNature;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The access type for this property. At the moment this is either 'field' or 'property', but Hibernate
|
* The access type for this property. At the moment this is either 'field' or 'property', but Hibernate
|
||||||
* also allows custom named accessors (see {@link org.hibernate.property.PropertyAccessorFactory}).
|
* also allows custom named accessors (see {@link org.hibernate.property.PropertyAccessorFactory}).
|
||||||
|
@ -82,16 +87,23 @@ public abstract class MappedAttribute implements Comparable<MappedAttribute> {
|
||||||
*/
|
*/
|
||||||
private final boolean isOptimisticLockable;
|
private final boolean isOptimisticLockable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Contains the SQL check condition specified via {@link org.hibernate.annotations.Check} or null if no annotation
|
||||||
|
* is specified.
|
||||||
|
*/
|
||||||
|
private final String checkCondition;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The binding context
|
* The binding context
|
||||||
*/
|
*/
|
||||||
private final EntityBindingContext context;
|
private final EntityBindingContext context;
|
||||||
|
|
||||||
MappedAttribute(String name, Class<?> attributeType, String accessType, Map<DotName, List<AnnotationInstance>> annotations, EntityBindingContext context) {
|
MappedAttribute(String name, Class<?> attributeType, AttributeNature attributeNature, String accessType, Map<DotName, List<AnnotationInstance>> annotations, EntityBindingContext context) {
|
||||||
this.context = context;
|
this.context = context;
|
||||||
this.annotations = annotations;
|
this.annotations = annotations;
|
||||||
this.name = name;
|
this.name = name;
|
||||||
this.attributeType = attributeType;
|
this.attributeType = attributeType;
|
||||||
|
this.attributeNature = attributeNature;
|
||||||
this.accessType = accessType;
|
this.accessType = accessType;
|
||||||
|
|
||||||
//if this attribute has either @Id or @EmbeddedId, then it is an id attribute
|
//if this attribute has either @Id or @EmbeddedId, then it is an id attribute
|
||||||
|
@ -101,7 +113,9 @@ public abstract class MappedAttribute implements Comparable<MappedAttribute> {
|
||||||
JPADotNames.EMBEDDED_ID
|
JPADotNames.EMBEDDED_ID
|
||||||
);
|
);
|
||||||
this.isId = ( idAnnotation != null || embeddedIdAnnotation != null );
|
this.isId = ( idAnnotation != null || embeddedIdAnnotation != null );
|
||||||
|
|
||||||
this.isOptimisticLockable = checkOptimisticLockAnnotation();
|
this.isOptimisticLockable = checkOptimisticLockAnnotation();
|
||||||
|
this.checkCondition = checkCheckAnnotation();
|
||||||
checkColumnAnnotations( annotations );
|
checkColumnAnnotations( annotations );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -137,6 +151,14 @@ public abstract class MappedAttribute implements Comparable<MappedAttribute> {
|
||||||
return isOptimisticLockable;
|
return isOptimisticLockable;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public AttributeNature getAttributeNature() {
|
||||||
|
return attributeNature;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getCheckCondition() {
|
||||||
|
return checkCondition;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int compareTo(MappedAttribute mappedProperty) {
|
public int compareTo(MappedAttribute mappedProperty) {
|
||||||
return name.compareTo( mappedProperty.getName() );
|
return name.compareTo( mappedProperty.getName() );
|
||||||
|
@ -224,7 +246,15 @@ public abstract class MappedAttribute implements Comparable<MappedAttribute> {
|
||||||
columnValues.add( new Column( annotation ) );
|
columnValues.add( new Column( annotation ) );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private String checkCheckAnnotation() {
|
||||||
|
String checkCondition = null;
|
||||||
|
AnnotationInstance checkAnnotation = JandexHelper.getSingleAnnotation( annotations(), HibernateDotNames.CHECK );
|
||||||
|
if ( checkAnnotation != null ) {
|
||||||
|
checkCondition = checkAnnotation.value( "constraints" ).toString();
|
||||||
|
}
|
||||||
|
return checkCondition;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -37,23 +37,24 @@ import org.hibernate.metamodel.internal.source.annotations.JandexHelper;
|
||||||
import org.hibernate.metamodel.internal.source.annotations.entity.EntityBindingContext;
|
import org.hibernate.metamodel.internal.source.annotations.entity.EntityBindingContext;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Represents an collection association attribute.
|
* Represents an collection (collection, list, set, map) association attribute.
|
||||||
*
|
*
|
||||||
* @author Hardy Ferentschik
|
* @author Hardy Ferentschik
|
||||||
*/
|
*/
|
||||||
public class CollectionAssociationAttribute extends AssociationAttribute {
|
public class PluralAssociationAttribute extends AssociationAttribute {
|
||||||
private final String whereClause;
|
private final String whereClause;
|
||||||
private final String orderBy;
|
private final String orderBy;
|
||||||
|
|
||||||
// Used for the non-owning side of a ManyToMany relationship
|
// Used for the non-owning side of a ManyToMany relationship
|
||||||
private final String inverseForeignKeyName;
|
private final String inverseForeignKeyName;
|
||||||
|
|
||||||
public static CollectionAssociationAttribute createPluralAssociationAttribute(String name,
|
public static PluralAssociationAttribute createPluralAssociationAttribute(String name,
|
||||||
Class<?> attributeType,
|
Class<?> attributeType,
|
||||||
AttributeNature attributeNature,
|
AttributeNature attributeNature,
|
||||||
String accessType,
|
String accessType,
|
||||||
Map<DotName, List<AnnotationInstance>> annotations,
|
Map<DotName, List<AnnotationInstance>> annotations,
|
||||||
EntityBindingContext context) {
|
EntityBindingContext context) {
|
||||||
return new CollectionAssociationAttribute(
|
return new PluralAssociationAttribute(
|
||||||
name,
|
name,
|
||||||
attributeType,
|
attributeType,
|
||||||
attributeNature,
|
attributeNature,
|
||||||
|
@ -63,17 +64,28 @@ public class CollectionAssociationAttribute extends AssociationAttribute {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
private CollectionAssociationAttribute(String name,
|
public String getWhereClause() {
|
||||||
Class<?> javaType,
|
return whereClause;
|
||||||
AttributeNature associationType,
|
}
|
||||||
String accessType,
|
|
||||||
Map<DotName, List<AnnotationInstance>> annotations,
|
public String getOrderBy() {
|
||||||
EntityBindingContext context) {
|
return orderBy;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getInverseForeignKeyName() {
|
||||||
|
return inverseForeignKeyName;
|
||||||
|
}
|
||||||
|
|
||||||
|
private PluralAssociationAttribute(String name,
|
||||||
|
Class<?> javaType,
|
||||||
|
AttributeNature associationType,
|
||||||
|
String accessType,
|
||||||
|
Map<DotName, List<AnnotationInstance>> annotations,
|
||||||
|
EntityBindingContext context) {
|
||||||
super( name, javaType, associationType, accessType, annotations, context );
|
super( name, javaType, associationType, accessType, annotations, context );
|
||||||
this.whereClause = determineWereClause();
|
this.whereClause = determineWereClause();
|
||||||
this.orderBy = determineOrderBy();
|
this.orderBy = determineOrderBy();
|
||||||
this.inverseForeignKeyName = determineInverseForeignKeyName();
|
this.inverseForeignKeyName = determineInverseForeignKeyName();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private String determineInverseForeignKeyName() {
|
private String determineInverseForeignKeyName() {
|
||||||
|
@ -137,18 +149,6 @@ public class CollectionAssociationAttribute extends AssociationAttribute {
|
||||||
|
|
||||||
return orderBy;
|
return orderBy;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getWhereClause() {
|
|
||||||
return whereClause;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getOrderBy() {
|
|
||||||
return orderBy;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getInverseForeignKeyName() {
|
|
||||||
return inverseForeignKeyName;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,248 @@
|
||||||
|
/*
|
||||||
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* Copyright (c) 2012, Red Hat Inc. or third-party contributors as
|
||||||
|
* indicated by the @author tags or express copyright attribution
|
||||||
|
* statements applied by the authors. All third-party contributions are
|
||||||
|
* distributed under license by Red Hat Inc.
|
||||||
|
*
|
||||||
|
* This copyrighted material is made available to anyone wishing to use, modify,
|
||||||
|
* copy, or redistribute it subject to the terms and conditions of the GNU
|
||||||
|
* Lesser General Public License, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||||
|
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
|
||||||
|
* for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with this distribution; if not, write to:
|
||||||
|
* Free Software Foundation, Inc.
|
||||||
|
* 51 Franklin Street, Fifth Floor
|
||||||
|
* Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
package org.hibernate.metamodel.internal.source.annotations.attribute;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import org.hibernate.FetchMode;
|
||||||
|
import org.hibernate.engine.FetchStyle;
|
||||||
|
import org.hibernate.engine.FetchTiming;
|
||||||
|
import org.hibernate.engine.spi.CascadeStyle;
|
||||||
|
import org.hibernate.metamodel.spi.binding.Caching;
|
||||||
|
import org.hibernate.metamodel.spi.binding.CustomSQL;
|
||||||
|
import org.hibernate.metamodel.spi.source.ExplicitHibernateTypeSource;
|
||||||
|
import org.hibernate.metamodel.spi.source.ManyToAnyPluralAttributeElementSource;
|
||||||
|
import org.hibernate.metamodel.spi.source.MetaAttributeSource;
|
||||||
|
import org.hibernate.metamodel.spi.source.OneToManyPluralAttributeElementSource;
|
||||||
|
import org.hibernate.metamodel.spi.source.PluralAttributeElementNature;
|
||||||
|
import org.hibernate.metamodel.spi.source.PluralAttributeElementSource;
|
||||||
|
import org.hibernate.metamodel.spi.source.PluralAttributeKeySource;
|
||||||
|
import org.hibernate.metamodel.spi.source.PluralAttributeNature;
|
||||||
|
import org.hibernate.metamodel.spi.source.PluralAttributeSource;
|
||||||
|
import org.hibernate.metamodel.spi.source.TableSpecificationSource;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Hardy Ferentschik
|
||||||
|
*/
|
||||||
|
public class PluralAttributeSourceImpl implements PluralAttributeSource {
|
||||||
|
|
||||||
|
PluralAssociationAttribute attribute;
|
||||||
|
|
||||||
|
public PluralAttributeSourceImpl(PluralAssociationAttribute attribute) {
|
||||||
|
this.attribute = attribute;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PluralAttributeNature getPluralAttributeNature() {
|
||||||
|
if ( Map.class.isAssignableFrom( attribute.getAttributeType() ) ) {
|
||||||
|
return PluralAttributeNature.MAP;
|
||||||
|
}
|
||||||
|
else if ( List.class.isAssignableFrom( attribute.getAttributeType() ) ) {
|
||||||
|
return PluralAttributeNature.LIST;
|
||||||
|
}
|
||||||
|
else if ( Set.class.isAssignableFrom( attribute.getAttributeType() ) ) {
|
||||||
|
return PluralAttributeNature.SET;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return PluralAttributeNature.BAG;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PluralAttributeKeySource getKeySource() {
|
||||||
|
return null; //To change body of implemented methods use File | Settings | File Templates.
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PluralAttributeElementSource getElementSource() {
|
||||||
|
switch ( attribute.getAttributeNature() ) {
|
||||||
|
case MANY_TO_MANY:
|
||||||
|
return new ManyToManyPluralAttributeElementSourceImpl( attribute );
|
||||||
|
case MANY_TO_ANY:
|
||||||
|
return new ManyToAnyPluralAttributeElementSourceImpl();
|
||||||
|
case ONE_TO_MANY:
|
||||||
|
return new OneToManyPluralAttributeElementSourceImpl();
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TableSpecificationSource getCollectionTableSpecificationSource() {
|
||||||
|
return null; //To change body of implemented methods use File | Settings | File Templates.
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getExplicitSchemaName() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getExplicitCatalogName() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getExplicitCollectionTableName() {
|
||||||
|
return null; //To change body of implemented methods use File | Settings | File Templates.
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getCollectionTableComment() {
|
||||||
|
return null; //To change body of implemented methods use File | Settings | File Templates.
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getCollectionTableCheck() {
|
||||||
|
return attribute.getCheckCondition();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Caching getCaching() {
|
||||||
|
return null; //To change body of implemented methods use File | Settings | File Templates.
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getCustomPersisterClassName() {
|
||||||
|
return null; //To change body of implemented methods use File | Settings | File Templates.
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getWhere() {
|
||||||
|
return null; //To change body of implemented methods use File | Settings | File Templates.
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isInverse() {
|
||||||
|
return false; //To change body of implemented methods use File | Settings | File Templates.
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getCustomLoaderName() {
|
||||||
|
return null; //To change body of implemented methods use File | Settings | File Templates.
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CustomSQL getCustomSqlInsert() {
|
||||||
|
return null; //To change body of implemented methods use File | Settings | File Templates.
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CustomSQL getCustomSqlUpdate() {
|
||||||
|
return null; //To change body of implemented methods use File | Settings | File Templates.
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CustomSQL getCustomSqlDelete() {
|
||||||
|
return null; //To change body of implemented methods use File | Settings | File Templates.
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CustomSQL getCustomSqlDeleteAll() {
|
||||||
|
return null; //To change body of implemented methods use File | Settings | File Templates.
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getName() {
|
||||||
|
return null; //To change body of implemented methods use File | Settings | File Templates.
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isSingular() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ExplicitHibernateTypeSource getTypeInformation() {
|
||||||
|
return null; //To change body of implemented methods use File | Settings | File Templates.
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getPropertyAccessorName() {
|
||||||
|
return null; //To change body of implemented methods use File | Settings | File Templates.
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isIncludedInOptimisticLocking() {
|
||||||
|
return false; //To change body of implemented methods use File | Settings | File Templates.
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Iterable<MetaAttributeSource> metaAttributes() {
|
||||||
|
return null; //To change body of implemented methods use File | Settings | File Templates.
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public FetchMode getFetchMode() {
|
||||||
|
return null; //To change body of implemented methods use File | Settings | File Templates.
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public FetchTiming getFetchTiming() {
|
||||||
|
return null; //To change body of implemented methods use File | Settings | File Templates.
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public FetchStyle getFetchStyle() {
|
||||||
|
return null; //To change body of implemented methods use File | Settings | File Templates.
|
||||||
|
}
|
||||||
|
|
||||||
|
private class OneToManyPluralAttributeElementSourceImpl implements OneToManyPluralAttributeElementSource {
|
||||||
|
@Override
|
||||||
|
public String getReferencedEntityName() {
|
||||||
|
return null; //To change body of implemented methods use File | Settings | File Templates.
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isNotFoundAnException() {
|
||||||
|
return false; //To change body of implemented methods use File | Settings | File Templates.
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Iterable<CascadeStyle> getCascadeStyles() {
|
||||||
|
return null; //To change body of implemented methods use File | Settings | File Templates.
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PluralAttributeElementNature getNature() {
|
||||||
|
return null; //To change body of implemented methods use File | Settings | File Templates.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private class ManyToAnyPluralAttributeElementSourceImpl implements ManyToAnyPluralAttributeElementSource {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Iterable<CascadeStyle> getCascadeStyles() {
|
||||||
|
return null; //To change body of implemented methods use File | Settings | File Templates.
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PluralAttributeElementNature getNature() {
|
||||||
|
return null; //To change body of implemented methods use File | Settings | File Templates.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -54,7 +54,7 @@ import org.hibernate.AssertionFailure;
|
||||||
import org.hibernate.EntityMode;
|
import org.hibernate.EntityMode;
|
||||||
import org.hibernate.HibernateException;
|
import org.hibernate.HibernateException;
|
||||||
import org.hibernate.cfg.NotYetImplementedException;
|
import org.hibernate.cfg.NotYetImplementedException;
|
||||||
import org.hibernate.metamodel.internal.source.annotations.attribute.CollectionAssociationAttribute;
|
import org.hibernate.metamodel.internal.source.annotations.attribute.PluralAssociationAttribute;
|
||||||
import org.hibernate.metamodel.spi.source.MappingException;
|
import org.hibernate.metamodel.spi.source.MappingException;
|
||||||
import org.hibernate.metamodel.internal.source.annotations.AnnotationBindingContext;
|
import org.hibernate.metamodel.internal.source.annotations.AnnotationBindingContext;
|
||||||
import org.hibernate.metamodel.internal.source.annotations.HibernateDotNames;
|
import org.hibernate.metamodel.internal.source.annotations.HibernateDotNames;
|
||||||
|
@ -427,7 +427,7 @@ public class ConfiguredClass {
|
||||||
switch ( attributeNature ) {
|
switch ( attributeNature ) {
|
||||||
case BASIC: {
|
case BASIC: {
|
||||||
BasicAttribute attribute = BasicAttribute.createSimpleAttribute(
|
BasicAttribute attribute = BasicAttribute.createSimpleAttribute(
|
||||||
attributeName, attributeType, annotations, accessTypeString, getLocalBindingContext()
|
attributeName, attributeType, attributeNature, annotations, accessTypeString, getLocalBindingContext()
|
||||||
);
|
);
|
||||||
if ( attribute.isId() ) {
|
if ( attribute.isId() ) {
|
||||||
idAttributeMap.put( attributeName, attribute );
|
idAttributeMap.put( attributeName, attribute );
|
||||||
|
@ -480,7 +480,7 @@ public class ConfiguredClass {
|
||||||
}
|
}
|
||||||
case ONE_TO_MANY:
|
case ONE_TO_MANY:
|
||||||
case MANY_TO_MANY: {
|
case MANY_TO_MANY: {
|
||||||
AssociationAttribute attribute = CollectionAssociationAttribute.createPluralAssociationAttribute(
|
AssociationAttribute attribute = PluralAssociationAttribute.createPluralAssociationAttribute(
|
||||||
attributeName,
|
attributeName,
|
||||||
attributeType,
|
attributeType,
|
||||||
attributeNature,
|
attributeNature,
|
||||||
|
|
|
@ -29,17 +29,20 @@ import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
|
import org.hibernate.cfg.NotYetImplementedException;
|
||||||
import org.hibernate.internal.jaxb.Origin;
|
import org.hibernate.internal.jaxb.Origin;
|
||||||
import org.hibernate.metamodel.spi.binding.CustomSQL;
|
|
||||||
import org.hibernate.metamodel.spi.source.ConstraintSource;
|
|
||||||
import org.hibernate.metamodel.spi.source.EntitySource;
|
|
||||||
import org.hibernate.metamodel.spi.source.LocalBindingContext;
|
|
||||||
import org.hibernate.metamodel.internal.source.annotations.attribute.AssociationAttribute;
|
import org.hibernate.metamodel.internal.source.annotations.attribute.AssociationAttribute;
|
||||||
import org.hibernate.metamodel.internal.source.annotations.attribute.BasicAttribute;
|
import org.hibernate.metamodel.internal.source.annotations.attribute.BasicAttribute;
|
||||||
|
import org.hibernate.metamodel.internal.source.annotations.attribute.PluralAssociationAttribute;
|
||||||
|
import org.hibernate.metamodel.internal.source.annotations.attribute.PluralAttributeSourceImpl;
|
||||||
import org.hibernate.metamodel.internal.source.annotations.attribute.SingularAttributeSourceImpl;
|
import org.hibernate.metamodel.internal.source.annotations.attribute.SingularAttributeSourceImpl;
|
||||||
import org.hibernate.metamodel.internal.source.annotations.attribute.ToOneAttributeSourceImpl;
|
import org.hibernate.metamodel.internal.source.annotations.attribute.ToOneAttributeSourceImpl;
|
||||||
|
import org.hibernate.metamodel.spi.binding.CustomSQL;
|
||||||
import org.hibernate.metamodel.spi.source.AttributeSource;
|
import org.hibernate.metamodel.spi.source.AttributeSource;
|
||||||
|
import org.hibernate.metamodel.spi.source.ConstraintSource;
|
||||||
|
import org.hibernate.metamodel.spi.source.EntitySource;
|
||||||
import org.hibernate.metamodel.spi.source.JpaCallbackSource;
|
import org.hibernate.metamodel.spi.source.JpaCallbackSource;
|
||||||
|
import org.hibernate.metamodel.spi.source.LocalBindingContext;
|
||||||
import org.hibernate.metamodel.spi.source.MetaAttributeSource;
|
import org.hibernate.metamodel.spi.source.MetaAttributeSource;
|
||||||
import org.hibernate.metamodel.spi.source.SecondaryTableSource;
|
import org.hibernate.metamodel.spi.source.SecondaryTableSource;
|
||||||
import org.hibernate.metamodel.spi.source.SubclassEntitySource;
|
import org.hibernate.metamodel.spi.source.SubclassEntitySource;
|
||||||
|
@ -187,7 +190,20 @@ public class EntitySourceImpl implements EntitySource {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
for ( AssociationAttribute associationAttribute : entityClass.getAssociationAttributes() ) {
|
for ( AssociationAttribute associationAttribute : entityClass.getAssociationAttributes() ) {
|
||||||
attributeList.add( new ToOneAttributeSourceImpl( associationAttribute ) );
|
switch ( associationAttribute.getAttributeNature() ) {
|
||||||
|
case ONE_TO_ONE:
|
||||||
|
case MANY_TO_ONE: {
|
||||||
|
attributeList.add( new ToOneAttributeSourceImpl( associationAttribute ) );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MANY_TO_MANY: {
|
||||||
|
attributeList.add( new PluralAttributeSourceImpl( (PluralAssociationAttribute) associationAttribute ) );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default: {
|
||||||
|
throw new NotYetImplementedException();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return attributeList;
|
return attributeList;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue