HHH-6503 - Develop Set-style plural attribute support for new metamodel

This commit is contained in:
Steve Ebersole 2011-07-29 16:40:27 -05:00
parent 631286c77b
commit 7742811466
21 changed files with 655 additions and 284 deletions

View File

@ -26,23 +26,21 @@ package org.hibernate.metamodel.binding;
import org.hibernate.metamodel.relational.Value;
/**
* TODO : javadoc
* Basic contract describing the commonality between the various types of collection element mappings.
*
* @author Steve Ebersole
*/
public abstract class CollectionElement {
public abstract class AbstractCollectionElement {
private final AbstractPluralAttributeBinding collectionBinding;
private final CollectionElementNature collectionElementNature;
private final HibernateTypeDescriptor hibernateTypeDescriptor = new HibernateTypeDescriptor();
private Value elementValue;
CollectionElement(AbstractPluralAttributeBinding collectionBinding, CollectionElementNature collectionElementNature) {
AbstractCollectionElement(AbstractPluralAttributeBinding collectionBinding) {
this.collectionBinding = collectionBinding;
this.collectionElementNature = collectionElementNature;
}
public abstract CollectionElementNature getCollectionElementNature();
public AbstractPluralAttributeBinding getCollectionBinding() {
return collectionBinding;
}
@ -50,12 +48,4 @@ public abstract class CollectionElement {
public Value getElementValue() {
return elementValue;
}
public final CollectionElementNature getCollectionElementNature() {
return collectionElementNature;
}
public HibernateTypeDescriptor getHibernateTypeDescriptor() {
return hibernateTypeDescriptor;
}
}

View File

@ -32,8 +32,10 @@ import java.util.List;
import org.hibernate.AssertionFailure;
import org.hibernate.FetchMode;
import org.hibernate.engine.spi.CascadeStyle;
import org.hibernate.metamodel.domain.Attribute;
import org.hibernate.metamodel.domain.PluralAttribute;
import org.hibernate.metamodel.relational.Table;
import org.hibernate.metamodel.relational.TableSpecification;
/**
* TODO : javadoc
@ -42,7 +44,7 @@ import org.hibernate.metamodel.relational.Table;
*/
public abstract class AbstractPluralAttributeBinding extends AbstractAttributeBinding implements PluralAttributeBinding {
private final CollectionKey collectionKey;
private final CollectionElement collectionElement;
private final AbstractCollectionElement collectionElement;
private Table collectionTable;
@ -85,7 +87,7 @@ public abstract class AbstractPluralAttributeBinding extends AbstractAttributeBi
this.collectionElement = interpretNature( collectionElementNature );
}
private CollectionElement interpretNature(CollectionElementNature collectionElementNature) {
private AbstractCollectionElement interpretNature(CollectionElementNature collectionElementNature) {
switch ( collectionElementNature ) {
case BASIC: {
return new BasicCollectionElement( this );
@ -142,6 +144,11 @@ public abstract class AbstractPluralAttributeBinding extends AbstractAttributeBi
// loaderName = state.getLoaderName();
// }
@Override
public PluralAttribute getAttribute() {
return (PluralAttribute) super.getAttribute();
}
@Override
public boolean isAssociation() {
return collectionElement.getCollectionElementNature() == CollectionElementNature.MANY_TO_ANY
@ -149,7 +156,7 @@ public abstract class AbstractPluralAttributeBinding extends AbstractAttributeBi
|| collectionElement.getCollectionElementNature() == CollectionElementNature.ONE_TO_MANY;
}
public Table getCollectionTable() {
public TableSpecification getCollectionTable() {
return collectionTable;
}
@ -161,7 +168,7 @@ public abstract class AbstractPluralAttributeBinding extends AbstractAttributeBi
return collectionKey;
}
public CollectionElement getCollectionElement() {
public AbstractCollectionElement getCollectionElement() {
return collectionElement;
}
@ -229,10 +236,18 @@ public abstract class AbstractPluralAttributeBinding extends AbstractAttributeBi
return orderBy;
}
public void setOrderBy(String orderBy) {
this.orderBy = orderBy;
}
public String getWhere() {
return where;
}
public void setWhere(String where) {
this.where = where;
}
public String getReferencedPropertyName() {
return referencedPropertyName;
}

View File

@ -24,10 +24,21 @@
package org.hibernate.metamodel.binding;
/**
* @author Steve Ebersole
* @author Gail Badner
*/
public class BasicCollectionElement extends CollectionElement {
public class BasicCollectionElement extends AbstractCollectionElement {
private final HibernateTypeDescriptor hibernateTypeDescriptor = new HibernateTypeDescriptor();
public BasicCollectionElement(AbstractPluralAttributeBinding binding) {
super( binding, CollectionElementNature.BASIC );
super( binding );
}
public CollectionElementNature getCollectionElementNature() {
return CollectionElementNature.BASIC;
}
public HibernateTypeDescriptor getHibernateTypeDescriptor() {
return hibernateTypeDescriptor;
}
}

View File

@ -23,7 +23,9 @@
*/
package org.hibernate.metamodel.binding;
import org.hibernate.AssertionFailure;
import org.hibernate.metamodel.relational.ForeignKey;
import org.hibernate.metamodel.relational.TableSpecification;
/**
* TODO : javadoc
@ -31,7 +33,7 @@ import org.hibernate.metamodel.relational.ForeignKey;
* @author Steve Ebersole
*/
public class CollectionKey {
private final AbstractPluralAttributeBinding collection;
private final AbstractPluralAttributeBinding pluralAttributeBinding;
private ForeignKey foreignKey;
private boolean inverse;
@ -40,7 +42,33 @@ public class CollectionKey {
// todo : this would be nice to have but we do not always know it, especially in HBM case.
// private BasicAttributeBinding otherSide;
public CollectionKey(AbstractPluralAttributeBinding collection) {
this.collection = collection;
public CollectionKey(AbstractPluralAttributeBinding pluralAttributeBinding) {
this.pluralAttributeBinding = pluralAttributeBinding;
}
public AbstractPluralAttributeBinding getPluralAttributeBinding() {
return pluralAttributeBinding;
}
public void prepareForeignKey(String foreignKeyName, String targetTableName) {
if ( foreignKey != null ) {
throw new AssertionFailure( "Foreign key already initialized" );
}
final TableSpecification collectionTable = pluralAttributeBinding.getCollectionTable();
if ( collectionTable == null ) {
throw new AssertionFailure( "Collection table not yet bound" );
}
final TableSpecification targetTable = pluralAttributeBinding.getContainer()
.seekEntityBinding()
.locateTable( targetTableName );
// todo : handle implicit fk names...
foreignKey = collectionTable.createForeignKey( targetTable, foreignKeyName );
}
public ForeignKey getForeignKey() {
return foreignKey;
}
}

View File

@ -24,10 +24,16 @@
package org.hibernate.metamodel.binding;
/**
* @author Steve Ebersole
* @author Gail Badner
*/
public class CompositeCollectionElement extends CollectionElement {
public class CompositeCollectionElement extends AbstractCollectionElement {
public CompositeCollectionElement(AbstractPluralAttributeBinding binding) {
super( binding, CollectionElementNature.COMPOSITE );
super( binding );
}
@Override
public CollectionElementNature getCollectionElementNature() {
return CollectionElementNature.COMPOSITE;
}
}

View File

@ -24,10 +24,16 @@
package org.hibernate.metamodel.binding;
/**
* @author Steve Ebersole
* @author Gail Badner
*/
public class ManyToAnyCollectionElement extends CollectionElement {
public class ManyToAnyCollectionElement extends AbstractCollectionElement {
ManyToAnyCollectionElement(AbstractPluralAttributeBinding binding) {
super( binding, CollectionElementNature.MANY_TO_ANY );
super( binding );
}
@Override
public CollectionElementNature getCollectionElementNature() {
return CollectionElementNature.MANY_TO_ANY;
}
}

View File

@ -28,9 +28,10 @@ import java.util.HashMap;
import org.dom4j.Element;
/**
* @author Steve Ebersole
* @author Gail Badner
*/
public class ManyToManyCollectionElement extends CollectionElement {
public class ManyToManyCollectionElement extends AbstractCollectionElement {
private final java.util.Map manyToManyFilters = new HashMap();
private String manyToManyWhere;
@ -38,7 +39,12 @@ public class ManyToManyCollectionElement extends CollectionElement {
ManyToManyCollectionElement(AbstractPluralAttributeBinding binding) {
super( binding, CollectionElementNature.MANY_TO_MANY );
super( binding );
}
@Override
public CollectionElementNature getCollectionElementNature() {
return CollectionElementNature.MANY_TO_MANY;
}
public void fromHbmXml(Element node){

View File

@ -24,11 +24,17 @@
package org.hibernate.metamodel.binding;
/**
* @author Steve Ebersole
* @author Gail Badner
*/
public class OneToManyCollectionElement extends CollectionElement {
public class OneToManyCollectionElement extends AbstractCollectionElement {
OneToManyCollectionElement(AbstractPluralAttributeBinding binding) {
super( binding, CollectionElementNature.ONE_TO_MANY );
super( binding );
}
@Override
public CollectionElementNature getCollectionElementNature() {
return CollectionElementNature.ONE_TO_MANY;
}
}

View File

@ -23,7 +23,7 @@
*/
package org.hibernate.metamodel.binding;
import org.hibernate.metamodel.relational.Table;
import org.hibernate.metamodel.relational.TableSpecification;
import org.hibernate.persister.collection.CollectionPersister;
/**
@ -34,9 +34,9 @@ public interface PluralAttributeBinding extends AttributeBinding, AssociationAtt
public CollectionKey getCollectionKey();
public CollectionElement getCollectionElement();
public AbstractCollectionElement getCollectionElement();
public Table getCollectionTable();
public TableSpecification getCollectionTable();
public boolean isMutable();

View File

@ -64,7 +64,7 @@ public class Database {
return schemaMap.get( implicitSchemaName );
}
public Schema getSchema(Schema.Name name) {
public Schema locateSchema(Schema.Name name) {
if ( name.getSchema() == null && name.getCatalog() == null ) {
return getDefaultSchema();
}
@ -83,11 +83,11 @@ public class Database {
}
public Schema getSchema(Identifier schema, Identifier catalog) {
return getSchema( new Schema.Name( schema, catalog ) );
return locateSchema( new Schema.Name( schema, catalog ) );
}
public Schema getSchema(String schema, String catalog) {
return getSchema( new Schema.Name( Identifier.toIdentifier( schema ), Identifier.toIdentifier( catalog ) ) );
return locateSchema( new Schema.Name( Identifier.toIdentifier( schema ), Identifier.toIdentifier( catalog ) ) );
}
public void addAuxiliaryDatabaseObject(AuxiliaryDatabaseObject auxiliaryDatabaseObject) {

View File

@ -28,6 +28,7 @@ import java.util.LinkedHashMap;
import java.util.List;
import org.hibernate.dialect.Dialect;
import org.hibernate.internal.util.StringHelper;
/**
* Models the concept of a relational <tt>TABLE</tt> (or <tt>VIEW</tt>).

View File

@ -25,7 +25,10 @@ package org.hibernate.metamodel.source.binder;
import java.beans.BeanInfo;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Member;
import java.lang.reflect.ParameterizedType;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
@ -34,14 +37,17 @@ import org.hibernate.EntityMode;
import org.hibernate.cfg.NotYetImplementedException;
import org.hibernate.internal.util.StringHelper;
import org.hibernate.internal.util.beans.BeanInfoHelper;
import org.hibernate.metamodel.binding.AbstractCollectionElement;
import org.hibernate.metamodel.binding.AbstractPluralAttributeBinding;
import org.hibernate.metamodel.binding.AttributeBinding;
import org.hibernate.metamodel.binding.AttributeBindingContainer;
import org.hibernate.metamodel.binding.BasicAttributeBinding;
import org.hibernate.metamodel.binding.BasicCollectionElement;
import org.hibernate.metamodel.binding.CollectionElementNature;
import org.hibernate.metamodel.binding.ComponentAttributeBinding;
import org.hibernate.metamodel.binding.EntityBinding;
import org.hibernate.metamodel.binding.EntityDiscriminator;
import org.hibernate.metamodel.binding.HibernateTypeDescriptor;
import org.hibernate.metamodel.binding.InheritanceType;
import org.hibernate.metamodel.binding.ManyToOneAttributeBinding;
import org.hibernate.metamodel.binding.MetaAttribute;
@ -53,6 +59,7 @@ import org.hibernate.metamodel.domain.Component;
import org.hibernate.metamodel.domain.Entity;
import org.hibernate.metamodel.domain.PluralAttribute;
import org.hibernate.metamodel.domain.SingularAttribute;
import org.hibernate.metamodel.domain.Type;
import org.hibernate.metamodel.relational.Column;
import org.hibernate.metamodel.relational.DerivedValue;
import org.hibernate.metamodel.relational.Identifier;
@ -440,8 +447,8 @@ public class Binder {
private void bindPersistentCollection(PluralAttributeSource attributeSource, AttributeBindingContainer attributeBindingContainer) {
final PluralAttribute existingAttribute = attributeBindingContainer.getAttributeContainer().locatePluralAttribute(
attributeSource.getName()
);
attributeSource.getName()
);
final AbstractPluralAttributeBinding pluralAttributeBinding;
if ( attributeSource.getPluralAttributeNature() == PluralAttributeNature.BAG ) {
@ -467,15 +474,34 @@ public class Binder {
throw new NotYetImplementedException( "Collections other than bag not yet implemented :(" );
}
doBasicAttributeBinding( attributeSource, pluralAttributeBinding );
doBasicPluralAttributeBinding( attributeSource, pluralAttributeBinding );
bindCollectionTable( attributeSource, pluralAttributeBinding );
bindCollectionKey( attributeSource, pluralAttributeBinding );
bindSortingAndOrdering( attributeSource, pluralAttributeBinding );
bindCollectionKey( attributeSource, pluralAttributeBinding );
bindCollectionElement( attributeSource, pluralAttributeBinding );
bindCollectionIndex( attributeSource, pluralAttributeBinding );
metadata.addCollection( pluralAttributeBinding );
}
private void doBasicPluralAttributeBinding(
PluralAttributeSource attributeSource,
AbstractPluralAttributeBinding pluralAttributeBinding) {
pluralAttributeBinding.setFetchMode( attributeSource.getFetchMode() );
pluralAttributeBinding.setCascadeStyles( attributeSource.getCascadeStyles() );
pluralAttributeBinding.setMetaAttributeContext(
buildMetaAttributeContext(
attributeSource.metaAttributes(),
pluralAttributeBinding.getContainer().getMetaAttributeContext()
)
);
doBasicAttributeBinding( attributeSource, pluralAttributeBinding );
}
private void bindCollectionTable(
PluralAttributeSource attributeSource,
AbstractPluralAttributeBinding pluralAttributeBinding) {
@ -483,23 +509,101 @@ public class Binder {
return;
}
if ( StringHelper.isNotEmpty( attributeSource.getExplicitCollectionTableName() ) ) {
final Identifier tableIdentifier = Identifier.toIdentifier( attributeSource.getExplicitCollectionTableName() );
Table collectionTable = metadata.getDatabase().getDefaultSchema().locateTable( tableIdentifier );
final Schema.Name schemaName = Helper.determineDatabaseSchemaName(
attributeSource.getExplicitSchemaName(),
attributeSource.getExplicitCatalogName(),
currentBindingContext
);
final Schema schema = metadata.getDatabase().locateSchema( schemaName );
final String tableName = attributeSource.getExplicitCollectionTableName();
if ( StringHelper.isNotEmpty( tableName ) ) {
final Identifier tableIdentifier = Identifier.toIdentifier( currentBindingContext.getNamingStrategy().tableName(
tableName
) );
Table collectionTable = schema.locateTable( tableIdentifier );
if ( collectionTable == null ) {
collectionTable = metadata.getDatabase().getDefaultSchema().createTable( tableIdentifier );
collectionTable = schema.createTable( tableIdentifier );
}
pluralAttributeBinding.setCollectionTable( collectionTable );
}
else {
// todo : we need to infer the name, but that requires possibly knowing the other side
// todo : not sure wel have all the needed info here in all cases, specifically when needing to know the "other side"
final EntityBinding owner = pluralAttributeBinding.getContainer().seekEntityBinding();
final String ownerTableLogicalName = Table.class.isInstance( owner.getPrimaryTable() )
? Table.class.cast( owner.getPrimaryTable() ).getTableName().getName()
: null;
String collectionTableName = currentBindingContext.getNamingStrategy().collectionTableName(
owner.getEntity().getName(),
ownerTableLogicalName,
null, // todo : here
null, // todo : and here
pluralAttributeBinding.getContainer().getPathBase() + '.' + attributeSource.getName()
);
if ( currentBindingContext.isGloballyQuotedIdentifiers() ) {
collectionTableName = StringHelper.quote( collectionTableName );
}
pluralAttributeBinding.setCollectionTable( schema.locateOrCreateTable( Identifier.toIdentifier( collectionTableName ) ) );
}
if ( StringHelper.isNotEmpty( attributeSource.getCollectionTableComment() ) ) {
pluralAttributeBinding.getCollectionTable().addComment( attributeSource.getCollectionTableComment() );
}
if ( StringHelper.isNotEmpty( attributeSource.getCollectionTableCheck() ) ) {
pluralAttributeBinding.getCollectionTable().addCheckConstraint( attributeSource.getCollectionTableCheck() );
}
pluralAttributeBinding.setWhere( attributeSource.getWhere() );
}
private void bindCollectionKey(
PluralAttributeSource attributeSource,
AbstractPluralAttributeBinding pluralAttributeBinding) {
pluralAttributeBinding.getCollectionKey().prepareForeignKey(
attributeSource.getKeySource().getExplicitForeignKeyName(),
null // todo : handle secondary table names
);
pluralAttributeBinding.getCollectionKey().getForeignKey().setDeleteRule(
attributeSource.getKeySource().getOnDeleteAction()
);
// todo : need to bind "relational values", account for property-ref
}
private void bindCollectionElement(
PluralAttributeSource attributeSource,
AbstractPluralAttributeBinding pluralAttributeBinding) {
final PluralAttributeElementSource elementSource = attributeSource.getElementSource();
if ( elementSource.getNature() == PluralAttributeElementNature.BASIC ) {
final BasicPluralAttributeElementSource basicElementSource = (BasicPluralAttributeElementSource) elementSource;
final BasicCollectionElement basicCollectionElement = (BasicCollectionElement) pluralAttributeBinding.getCollectionElement();
resolveTypeInformation(
basicElementSource.getExplicitHibernateTypeSource(),
pluralAttributeBinding.getAttribute(),
basicCollectionElement
);
// todo : temp
return;
}
// todo : implement
throw new NotYetImplementedException(
String.format(
"Support for collection elements of type %s not yet implemented",
elementSource.getNature()
)
);
}
private void bindCollectionIndex(
PluralAttributeSource attributeSource,
AbstractPluralAttributeBinding pluralAttributeBinding) {
if ( attributeSource.getPluralAttributeNature() != PluralAttributeNature.LIST
&& attributeSource.getPluralAttributeNature() != PluralAttributeNature.MAP ) {
return;
}
// todo : implement
throw new NotYetImplementedException();
}
private void bindSortingAndOrdering(
@ -536,8 +640,8 @@ public class Binder {
SingularAttributeSource attributeSource,
AttributeBindingContainer attributeBindingContainer) {
final SingularAttribute existingAttribute = attributeBindingContainer.getAttributeContainer().locateSingularAttribute(
attributeSource.getName()
);
attributeSource.getName()
);
final SingularAttribute attribute;
if ( existingAttribute != null ) {
attribute = existingAttribute;
@ -590,36 +694,55 @@ public class Binder {
private void resolveTypeInformation(ExplicitHibernateTypeSource typeSource, BasicAttributeBinding attributeBinding) {
final Class<?> attributeJavaType = determineJavaType( attributeBinding.getAttribute() );
if ( attributeJavaType != null ) {
attributeBinding.getHibernateTypeDescriptor().setJavaTypeName( attributeJavaType.getName() );
attributeBinding.getAttribute()
.resolveType( currentBindingContext.makeJavaType( attributeJavaType.getName() ) );
}
resolveTypeInformation( typeSource, attributeBinding.getHibernateTypeDescriptor(), attributeJavaType );
}
private void resolveTypeInformation(
ExplicitHibernateTypeSource typeSource,
PluralAttribute attribute,
BasicCollectionElement collectionElement) {
final Class<?> attributeJavaType = determineJavaType( attribute );
resolveTypeInformation( typeSource, collectionElement.getHibernateTypeDescriptor(), attributeJavaType );
}
private void resolveTypeInformation(
ExplicitHibernateTypeSource typeSource,
HibernateTypeDescriptor hibernateTypeDescriptor,
Class<?> discoveredJavaType) {
if ( discoveredJavaType != null ) {
hibernateTypeDescriptor.setJavaTypeName( discoveredJavaType.getName() );
}
final String explicitTypeName = typeSource.getName();
if ( explicitTypeName != null ) {
final TypeDef typeDef = currentBindingContext.getMetadataImplementor()
.getTypeDefinition( explicitTypeName );
if ( typeDef != null ) {
attributeBinding.getHibernateTypeDescriptor().setExplicitTypeName( typeDef.getTypeClass() );
attributeBinding.getHibernateTypeDescriptor().getTypeParameters().putAll( typeDef.getParameters() );
hibernateTypeDescriptor.setExplicitTypeName( typeDef.getTypeClass() );
hibernateTypeDescriptor.getTypeParameters().putAll( typeDef.getParameters() );
}
else {
attributeBinding.getHibernateTypeDescriptor().setExplicitTypeName( explicitTypeName );
hibernateTypeDescriptor.setExplicitTypeName( explicitTypeName );
}
final Map<String, String> parameters = typeSource.getParameters();
if ( parameters!=null) {
attributeBinding.getHibernateTypeDescriptor().getTypeParameters().putAll( parameters );
hibernateTypeDescriptor.getTypeParameters().putAll( parameters );
}
}
else {
if ( attributeJavaType == null ) {
if ( discoveredJavaType == null ) {
// we will have problems later determining the Hibernate Type to use. Should we throw an
// exception now? Might be better to get better contextual info
}
}
}
private Class<?> determineJavaType(final Attribute attribute) {
private Class<?> determineJavaType(final SingularAttribute attribute) {
try {
final Class<?> ownerClass = attribute.getAttributeContainer().getClassReference();
AttributeJavaTypeDeterminerDelegate delegate = new AttributeJavaTypeDeterminerDelegate( attribute.getName() );
@ -651,6 +774,76 @@ public class Binder {
}
}
private Class<?> determineJavaType(PluralAttribute attribute) {
try {
final Class<?> ownerClass = attribute.getAttributeContainer().getClassReference();
PluralAttributeJavaTypeDeterminerDelegate delegate = new PluralAttributeJavaTypeDeterminerDelegate( ownerClass, attribute.getName() );
BeanInfoHelper.visitBeanInfo( ownerClass, delegate );
return delegate.javaType;
}
catch ( Exception ignore ) {
// todo : log it?
}
return null;
}
private class PluralAttributeJavaTypeDeterminerDelegate implements BeanInfoHelper.BeanInfoDelegate {
private final Class<?> ownerClass;
private final String attributeName;
private Class<?> javaType = null;
private PluralAttributeJavaTypeDeterminerDelegate(Class<?> ownerClass, String attributeName) {
this.ownerClass = ownerClass;
this.attributeName = attributeName;
}
@Override
public void processBeanInfo(BeanInfo beanInfo) throws Exception {
for ( PropertyDescriptor propertyDescriptor : beanInfo.getPropertyDescriptors() ) {
if ( propertyDescriptor.getName().equals( attributeName ) ) {
javaType = extractCollectionComponentType( beanInfo, propertyDescriptor );
break;
}
}
}
@SuppressWarnings( {"unchecked"})
private Class<?> extractCollectionComponentType(BeanInfo beanInfo, PropertyDescriptor propertyDescriptor) {
final java.lang.reflect.Type collectionAttributeType;
if ( propertyDescriptor.getReadMethod() != null ) {
collectionAttributeType = propertyDescriptor.getReadMethod().getGenericReturnType();
}
else if ( propertyDescriptor.getWriteMethod() != null ) {
collectionAttributeType = propertyDescriptor.getWriteMethod().getGenericParameterTypes()[0];
}
else {
// we need to look for the field and look at it...
try {
collectionAttributeType = ownerClass.getField( propertyDescriptor.getName() ).getGenericType();
}
catch (Exception e) {
return null;
}
}
if ( ParameterizedType.class.isInstance( collectionAttributeType ) ) {
final java.lang.reflect.Type[] types = ( (ParameterizedType) collectionAttributeType ).getActualTypeArguments();
if ( types == null ) {
return null;
}
else if ( types.length == 1 ) {
return (Class<?>) types[0];
}
else if ( types.length == 2 ) {
// Map<K,V>
return (Class<?>) types[1];
}
}
return null;
}
}
private void resolveToOneInformation(ToOneAttributeSource attributeSource, ManyToOneAttributeBinding attributeBinding) {
final String referencedEntityName = attributeSource.getReferencedEntityName() != null
? attributeSource.getReferencedEntityName()
@ -718,17 +911,6 @@ public class Binder {
}
private Table createTable(EntityBinding entityBinding, TableSource tableSource) {
final String schemaName = StringHelper.isEmpty( tableSource.getExplicitSchemaName() )
? currentBindingContext.getMappingDefaults().getSchemaName()
: currentBindingContext.isGloballyQuotedIdentifiers()
? StringHelper.quote( tableSource.getExplicitSchemaName() )
: tableSource.getExplicitSchemaName();
final String catalogName = StringHelper.isEmpty( tableSource.getExplicitCatalogName() )
? currentBindingContext.getMappingDefaults().getCatalogName()
: currentBindingContext.isGloballyQuotedIdentifiers()
? StringHelper.quote( tableSource.getExplicitCatalogName() )
: tableSource.getExplicitCatalogName();
String tableName = tableSource.getExplicitTableName();
if ( StringHelper.isEmpty( tableName ) ) {
tableName = currentBindingContext.getNamingStrategy()
@ -741,9 +923,14 @@ public class Binder {
tableName = StringHelper.quote( tableName );
}
final Schema.Name databaseSchemaName = Helper.determineDatabaseSchemaName(
tableSource.getExplicitSchemaName(),
tableSource.getExplicitCatalogName(),
currentBindingContext
);
return currentBindingContext.getMetadataImplementor()
.getDatabase()
.getSchema( new Schema.Name( schemaName, catalogName ) )
.locateSchema( databaseSchemaName )
.locateOrCreateTable( Identifier.toIdentifier( tableName ) );
}
@ -847,5 +1034,4 @@ public class Binder {
private void processFetchProfiles(EntitySource entitySource, EntityBinding entityBinding) {
// todo : process the entity-local fetch-profile declaration
}
}

View File

@ -33,7 +33,14 @@ public interface PluralAttributeSource extends AssociationAttributeSource {
public PluralAttributeElementSource getElementSource();
public String getExplicitSchemaName();
public String getExplicitCatalogName();
public String getExplicitCollectionTableName();
public String getCollectionTableComment();
public String getCollectionTableCheck();
public String getWhere();
public boolean isInverse();
}

View File

@ -23,18 +23,73 @@
*/
package org.hibernate.metamodel.source.hbm;
import org.hibernate.FetchMode;
import org.hibernate.cfg.NotYetImplementedException;
import org.hibernate.engine.spi.CascadeStyle;
import org.hibernate.metamodel.source.LocalBindingContext;
import org.hibernate.metamodel.source.MappingException;
import org.hibernate.metamodel.source.binder.AttributeSourceContainer;
import org.hibernate.metamodel.source.binder.MetaAttributeSource;
import org.hibernate.metamodel.source.binder.PluralAttributeElementSource;
import org.hibernate.metamodel.source.binder.PluralAttributeKeySource;
import org.hibernate.metamodel.source.binder.PluralAttributeSource;
import org.hibernate.metamodel.source.hbm.jaxb.mapping.PluralAttributeElement;
/**
* @author Steve Ebersole
*/
public abstract class AbstractPluralAttributeSourceImpl implements PluralAttributeSource {
private final PluralAttributeElement pluralAttributeElement;
private final AttributeSourceContainer container;
protected AbstractPluralAttributeSourceImpl(AttributeSourceContainer container) {
private final PluralAttributeKeySource keySource;
private final PluralAttributeElementSource elementSource;
protected AbstractPluralAttributeSourceImpl(
PluralAttributeElement pluralAttributeElement,
AttributeSourceContainer container) {
this.pluralAttributeElement = pluralAttributeElement;
this.container = container;
this.keySource = new PluralAttributeKeySourceImpl( pluralAttributeElement.getKey(), container );
this.elementSource = interpretElementType();
}
private PluralAttributeElementSource interpretElementType() {
if ( pluralAttributeElement.getElement() != null ) {
return new BasicPluralAttributeElementSourceImpl(
pluralAttributeElement.getElement(), container.getLocalBindingContext()
);
}
else if ( pluralAttributeElement.getCompositeElement() != null ) {
return new CompositePluralAttributeElementSourceImpl(
pluralAttributeElement.getCompositeElement(), container.getLocalBindingContext()
);
}
else if ( pluralAttributeElement.getOneToMany() != null ) {
return new OneToManyPluralAttributeElementSourceImpl(
pluralAttributeElement.getOneToMany(), container.getLocalBindingContext()
);
}
else if ( pluralAttributeElement.getManyToMany() != null ) {
return new ManyToManyPluralAttributeElementSourceImpl(
pluralAttributeElement.getManyToMany(), container.getLocalBindingContext()
);
}
else if ( pluralAttributeElement.getManyToAny() != null ) {
throw new NotYetImplementedException( "Support for many-to-any not yet implemented" );
// return PluralAttributeElementNature.MANY_TO_ANY;
}
else {
throw new MappingException(
"Unexpected collection element type : " + pluralAttributeElement.getName(),
bindingContext().getOrigin()
);
}
}
public PluralAttributeElement getPluralAttributeElement() {
return pluralAttributeElement;
}
protected AttributeSourceContainer container() {
@ -45,8 +100,85 @@ public abstract class AbstractPluralAttributeSourceImpl implements PluralAttribu
return container().getLocalBindingContext();
}
@Override
public PluralAttributeKeySource getKeySource() {
return keySource;
}
@Override
public PluralAttributeElementSource getElementSource() {
return elementSource;
}
@Override
public String getExplicitSchemaName() {
return pluralAttributeElement.getSchema();
}
@Override
public String getExplicitCatalogName() {
return pluralAttributeElement.getCatalog();
}
@Override
public String getExplicitCollectionTableName() {
return pluralAttributeElement.getTable();
}
@Override
public String getCollectionTableComment() {
return pluralAttributeElement.getComment();
}
@Override
public String getCollectionTableCheck() {
return pluralAttributeElement.getCheck();
}
@Override
public String getWhere() {
return pluralAttributeElement.getWhere();
}
@Override
public String getName() {
return pluralAttributeElement.getName();
}
@Override
public boolean isSingular() {
return false;
}
@Override
public String getPropertyAccessorName() {
return pluralAttributeElement.getAccess();
}
@Override
public boolean isIncludedInOptimisticLocking() {
return pluralAttributeElement.isOptimisticLock();
}
@Override
public boolean isInverse() {
return pluralAttributeElement.isInverse();
}
@Override
public Iterable<MetaAttributeSource> metaAttributes() {
return Helper.buildMetaAttributeSources( pluralAttributeElement.getMeta() );
}
@Override
public Iterable<CascadeStyle> getCascadeStyles() {
return Helper.interpretCascadeStyles( pluralAttributeElement.getCascade(), bindingContext() );
}
@Override
public FetchMode getFetchMode() {
return pluralAttributeElement.getFetch() == null
? FetchMode.DEFAULT
: FetchMode.valueOf( pluralAttributeElement.getFetch().value() );
}
}

View File

@ -23,62 +23,18 @@
*/
package org.hibernate.metamodel.source.hbm;
import org.hibernate.FetchMode;
import org.hibernate.cfg.NotYetImplementedException;
import org.hibernate.engine.spi.CascadeStyle;
import org.hibernate.metamodel.source.LocalBindingContext;
import org.hibernate.metamodel.source.MappingException;
import org.hibernate.internal.util.StringHelper;
import org.hibernate.metamodel.source.binder.AttributeSourceContainer;
import org.hibernate.metamodel.source.binder.MetaAttributeSource;
import org.hibernate.metamodel.source.binder.PluralAttributeElementSource;
import org.hibernate.metamodel.source.binder.PluralAttributeKeySource;
import org.hibernate.metamodel.source.binder.Orderable;
import org.hibernate.metamodel.source.binder.PluralAttributeNature;
import org.hibernate.metamodel.source.binder.PluralAttributeSource;
import org.hibernate.metamodel.source.hbm.jaxb.mapping.XMLBagElement;
/**
* @author Steve Ebersole
*/
public class BagAttributeSourceImpl implements PluralAttributeSource {
private final XMLBagElement bagElement;
private final AttributeSourceContainer container;
// todo : a lot of this could be consolidated with common JAXB interface for collection mappings and moved to a base class
private final PluralAttributeKeySource keySource;
private final PluralAttributeElementSource elementSource;
public class BagAttributeSourceImpl extends AbstractPluralAttributeSourceImpl implements Orderable {
public BagAttributeSourceImpl(XMLBagElement bagElement, AttributeSourceContainer container) {
this.bagElement = bagElement;
this.container = container;
this.keySource = new PluralAttributeKeySourceImpl( bagElement.getKey(), container );
this.elementSource = interpretElementType( bagElement );
}
private PluralAttributeElementSource interpretElementType(XMLBagElement bagElement) {
if ( bagElement.getElement() != null ) {
return new BasicPluralAttributeElementSourceImpl( bagElement.getElement(), container.getLocalBindingContext() );
}
else if ( bagElement.getCompositeElement() != null ) {
return new CompositePluralAttributeElementSourceImpl( bagElement.getCompositeElement(), container.getLocalBindingContext() );
}
else if ( bagElement.getOneToMany() != null ) {
return new OneToManyPluralAttributeElementSourceImpl( bagElement.getOneToMany(), container.getLocalBindingContext() );
}
else if ( bagElement.getManyToMany() != null ) {
return new ManyToManyPluralAttributeElementSourceImpl( bagElement.getManyToMany(), container.getLocalBindingContext() );
}
else if ( bagElement.getManyToAny() != null ) {
throw new NotYetImplementedException( "Support for many-to-any not yet implemented" );
// return PluralAttributeElementNature.MANY_TO_ANY;
}
else {
throw new MappingException(
"Unexpected collection element type : " + bagElement.getName(),
bindingContext().getOrigin()
);
}
super( bagElement, container );
}
@Override
@ -87,63 +43,17 @@ public class BagAttributeSourceImpl implements PluralAttributeSource {
}
@Override
public PluralAttributeKeySource getKeySource() {
return keySource;
public XMLBagElement getPluralAttributeElement() {
return (XMLBagElement) super.getPluralAttributeElement();
}
@Override
public PluralAttributeElementSource getElementSource() {
return elementSource;
public boolean isOrdered() {
return StringHelper.isNotEmpty( getOrder() );
}
@Override
public String getExplicitCollectionTableName() {
return bagElement.getTable();
}
private LocalBindingContext bindingContext() {
return container.getLocalBindingContext();
}
@Override
public String getName() {
return bagElement.getName();
}
@Override
public boolean isSingular() {
return false;
}
@Override
public String getPropertyAccessorName() {
return bagElement.getAccess();
}
@Override
public boolean isIncludedInOptimisticLocking() {
return bagElement.isOptimisticLock();
}
@Override
public boolean isInverse() {
return bagElement.isInverse();
}
@Override
public Iterable<MetaAttributeSource> metaAttributes() {
return Helper.buildMetaAttributeSources( bagElement.getMeta() );
}
@Override
public Iterable<CascadeStyle> getCascadeStyles() {
return Helper.interpretCascadeStyles( bagElement.getCascade(), bindingContext() );
}
@Override
public FetchMode getFetchMode() {
return bagElement.getFetch() == null
? FetchMode.DEFAULT
: FetchMode.valueOf( bagElement.getFetch().value() );
public String getOrder() {
return getPluralAttributeElement().getOrderBy();
}
}

View File

@ -37,6 +37,8 @@ import org.hibernate.internal.util.StringHelper;
import org.hibernate.metamodel.binding.CustomSQL;
import org.hibernate.metamodel.binding.InheritanceType;
import org.hibernate.metamodel.binding.MetaAttribute;
import org.hibernate.metamodel.relational.Identifier;
import org.hibernate.metamodel.relational.Schema;
import org.hibernate.metamodel.source.LocalBindingContext;
import org.hibernate.metamodel.source.MetaAttributeContext;
import org.hibernate.metamodel.source.binder.ExplicitHibernateTypeSource;
@ -233,6 +235,32 @@ public class Helper {
return result;
}
public static Schema.Name determineDatabaseSchemaName(
String explicitSchemaName,
String explicitCatalogName,
LocalBindingContext bindingContext) {
return new Schema.Name(
resolveIdentifier(
explicitSchemaName,
bindingContext.getMappingDefaults().getSchemaName(),
bindingContext.isGloballyQuotedIdentifiers()
),
resolveIdentifier(
explicitCatalogName,
bindingContext.getMappingDefaults().getCatalogName(),
bindingContext.isGloballyQuotedIdentifiers()
)
);
}
public static Identifier resolveIdentifier(String explicitName, String defaultName, boolean globalQuoting) {
String name = StringHelper.isNotEmpty( explicitName ) ? explicitName : defaultName;
if ( globalQuoting ) {
name = StringHelper.quote( name );
}
return Identifier.toIdentifier( name );
}
public static interface ValueSourcesAdapter {
public String getContainingTableName();
public boolean isIncludedInInsertByDefault();

View File

@ -23,150 +23,48 @@
*/
package org.hibernate.metamodel.source.hbm;
import org.hibernate.FetchMode;
import org.hibernate.cfg.NotYetImplementedException;
import org.hibernate.engine.spi.CascadeStyle;
import org.hibernate.internal.util.StringHelper;
import org.hibernate.metamodel.source.LocalBindingContext;
import org.hibernate.metamodel.source.MappingException;
import org.hibernate.metamodel.source.binder.AttributeSourceContainer;
import org.hibernate.metamodel.source.binder.MetaAttributeSource;
import org.hibernate.metamodel.source.binder.Orderable;
import org.hibernate.metamodel.source.binder.PluralAttributeElementSource;
import org.hibernate.metamodel.source.binder.PluralAttributeKeySource;
import org.hibernate.metamodel.source.binder.PluralAttributeNature;
import org.hibernate.metamodel.source.binder.PluralAttributeSource;
import org.hibernate.metamodel.source.binder.Sortable;
import org.hibernate.metamodel.source.hbm.jaxb.mapping.XMLSetElement;
/**
* @author Steve Ebersole
*/
public class SetAttributeSourceImpl implements PluralAttributeSource, Sortable, Orderable {
private XMLSetElement setElement;
private AttributeSourceContainer container;
// todo : a lot of this could be consolidated with common JAXB interface for collection mappings and moved to a base class
private final PluralAttributeKeySource keySource;
private final PluralAttributeElementSource elementSource;
public class SetAttributeSourceImpl extends AbstractPluralAttributeSourceImpl implements Orderable, Sortable {
public SetAttributeSourceImpl(XMLSetElement setElement, AttributeSourceContainer container) {
this.setElement = setElement;
this.container = container;
this.keySource = new PluralAttributeKeySourceImpl( setElement.getKey(), container );
this.elementSource = interpretElementType( setElement );
super( setElement, container );
}
private PluralAttributeElementSource interpretElementType(XMLSetElement setElement) {
if ( setElement.getElement() != null ) {
return new BasicPluralAttributeElementSourceImpl( setElement.getElement(), container.getLocalBindingContext() );
}
else if ( setElement.getCompositeElement() != null ) {
return new CompositePluralAttributeElementSourceImpl( setElement.getCompositeElement(), container.getLocalBindingContext() );
}
else if ( setElement.getOneToMany() != null ) {
return new OneToManyPluralAttributeElementSourceImpl( setElement.getOneToMany(), container.getLocalBindingContext() );
}
else if ( setElement.getManyToMany() != null ) {
return new ManyToManyPluralAttributeElementSourceImpl( setElement.getManyToMany(), container.getLocalBindingContext() );
}
else if ( setElement.getManyToAny() != null ) {
throw new NotYetImplementedException( "Support for many-to-any not yet implemented" );
// return PluralAttributeElementNature.MANY_TO_ANY;
}
else {
throw new MappingException(
"Unexpected collection element type : " + setElement.getName(),
bindingContext().getOrigin()
);
}
}
private LocalBindingContext bindingContext() {
return container.getLocalBindingContext();
@Override
public XMLSetElement getPluralAttributeElement() {
return (XMLSetElement) super.getPluralAttributeElement();
}
@Override
public PluralAttributeNature getPluralAttributeNature() {
return PluralAttributeNature.BAG;
}
@Override
public PluralAttributeKeySource getKeySource() {
return keySource;
}
@Override
public PluralAttributeElementSource getElementSource() {
return elementSource;
}
@Override
public String getExplicitCollectionTableName() {
return setElement.getTable();
}
@Override
public boolean isInverse() {
return setElement.isInverse();
}
@Override
public String getName() {
return setElement.getName();
}
@Override
public boolean isSingular() {
return false;
}
@Override
public String getPropertyAccessorName() {
return setElement.getAccess();
}
@Override
public boolean isIncludedInOptimisticLocking() {
return setElement.isOptimisticLock();
}
@Override
public Iterable<MetaAttributeSource> metaAttributes() {
return Helper.buildMetaAttributeSources( setElement.getMeta() );
}
@Override
public Iterable<CascadeStyle> getCascadeStyles() {
return Helper.interpretCascadeStyles( setElement.getCascade(), bindingContext() );
}
@Override
public FetchMode getFetchMode() {
return setElement.getFetch() == null
? FetchMode.DEFAULT
: FetchMode.valueOf( setElement.getFetch().value() );
return PluralAttributeNature.SET;
}
@Override
public boolean isSorted() {
return StringHelper.isNotEmpty( setElement.getSort() );
return StringHelper.isNotEmpty( getComparatorName() );
}
@Override
public String getComparatorName() {
return setElement.getSort();
return getPluralAttributeElement().getSort();
}
@Override
public boolean isOrdered() {
return StringHelper.isNotEmpty( setElement.getOrderBy() );
return StringHelper.isNotEmpty( getOrder() );
}
@Override
public String getOrder() {
return setElement.getOrderBy();
return getPluralAttributeElement().getOrderBy();
}
}

View File

@ -0,0 +1,43 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* Copyright (c) 2011, 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.source.hbm.jaxb.mapping;
/**
* Adaptive implementation of the {@link PluralAttributeElement} for {@code <idbag/>} mappings which
* do not support all the configuration available on other collection mappings.
*
* @author Steve Ebersole
*/
public abstract class IdBagPluralAttributeElementAdapter implements PluralAttributeElement {
public XMLOneToManyElement getOneToMany() {
// idbag collections cannot contain 1-m mappings.
return null;
}
@Override
public boolean isInverse() {
// idbag collections own the association, and are therefore non-inverse
return false;
}
}

View File

@ -0,0 +1,81 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* Copyright (c) 2011, 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.source.hbm.jaxb.mapping;
import java.util.List;
/**
* Commonality between the various forms of plural attribute (collection) mappings: {@code <bag/>}, {@code <set/>}, etc.
*
* @author Steve Ebersole
*/
public interface PluralAttributeElement extends MetaAttributeContainer {
public String getName();
public String getAccess();
public XMLKeyElement getKey();
public XMLElementElement getElement();
public XMLCompositeElementElement getCompositeElement();
public XMLOneToManyElement getOneToMany();
public XMLManyToManyElement getManyToMany();
public XMLManyToAnyElement getManyToAny();
public String getSchema();
public String getCatalog();
public String getTable();
public String getComment();
public String getCheck();
public String getSubselect();
public String getSubselectAttribute();
public String getWhere();
public XMLLoaderElement getLoader();
public XMLSqlInsertElement getSqlInsert();
public XMLSqlUpdateElement getSqlUpdate();
public XMLSqlDeleteElement getSqlDelete();
public XMLSqlDeleteAllElement getSqlDeleteAll();
public List<XMLSynchronizeElement> getSynchronize();
public XMLCacheElement getCache();
public List<XMLFilterElement> getFilter();
public String getCascade();
public XMLFetchAttributeWithSubselect getFetch();
public XMLLazyAttributeWithExtra getLazy();
public XMLOuterJoinAttribute getOuterJoin();
public String getBatchSize();
public boolean isInverse();
public boolean isMutable();
public boolean isOptimisticLock();
public String getCollectionType();
public String getPersister();
// todo : not available on all. do we need a specific interface for these?
// public String getSort();
// public String getOrderBy();
}

View File

@ -59,6 +59,23 @@
<inheritance:implements>org.hibernate.metamodel.source.hbm.jaxb.mapping.SingularAttributeSource</inheritance:implements>
</jaxb:bindings>
-->
<jaxb:bindings node="//xsd:complexType[@name='bag-element']">
<inheritance:implements>org.hibernate.metamodel.source.hbm.jaxb.mapping.PluralAttributeElement</inheritance:implements>
</jaxb:bindings>
<jaxb:bindings node="//xsd:complexType[@name='idbag-element']">
<inheritance:implements>org.hibernate.metamodel.source.hbm.jaxb.mapping.PluralAttributeElement</inheritance:implements>
<inheritance:extends>org.hibernate.metamodel.source.hbm.jaxb.mapping.IdBagPluralAttributeElementAdapter</inheritance:extends>
</jaxb:bindings>
<jaxb:bindings node="//xsd:complexType[@name='list-element']">
<inheritance:implements>org.hibernate.metamodel.source.hbm.jaxb.mapping.PluralAttributeElement</inheritance:implements>
</jaxb:bindings>
<jaxb:bindings node="//xsd:complexType[@name='map-element']">
<inheritance:implements>org.hibernate.metamodel.source.hbm.jaxb.mapping.PluralAttributeElement</inheritance:implements>
</jaxb:bindings>
<jaxb:bindings node="//xsd:complexType[@name='set-element']">
<inheritance:implements>org.hibernate.metamodel.source.hbm.jaxb.mapping.PluralAttributeElement</inheritance:implements>
</jaxb:bindings>
<jaxb:bindings node="//xsd:element[@name='class']//xsd:attribute[@name='subselect']">
<jaxb:property name="subselectAttribute"/>

View File

@ -79,13 +79,13 @@ public class BasicCollectionBindingTests extends BaseUnitTestCase {
assertSame( bagBinding, entityBinding.locateAttributeBinding( "theBag" ) );
assertNotNull( bagBinding.getCollectionTable() );
assertEquals( CollectionElementNature.BASIC, bagBinding.getCollectionElement().getCollectionElementNature() );
assertEquals( String.class.getName(), bagBinding.getCollectionElement().getHibernateTypeDescriptor().getJavaTypeName() );
assertEquals( String.class.getName(), ( (BasicCollectionElement) bagBinding.getCollectionElement() ).getHibernateTypeDescriptor().getJavaTypeName() );
PluralAttributeBinding setBinding = metadata.getCollection( EntityWithBasicCollections.class.getName() + ".theSet" );
assertNotNull( setBinding );
assertSame( setBinding, entityBinding.locateAttributeBinding( "theSet" ) );
assertNotNull( setBinding.getCollectionTable() );
assertEquals( CollectionElementNature.BASIC, setBinding.getCollectionElement().getCollectionElementNature() );
assertEquals( String.class.getName(), setBinding.getCollectionElement().getHibernateTypeDescriptor().getJavaTypeName() );
assertEquals( String.class.getName(), ( (BasicCollectionElement) setBinding.getCollectionElement() ).getHibernateTypeDescriptor().getJavaTypeName() );
}
}