HHH-6263 Refactoring HibernateXmlBinder and HibernateMappingBinder. Removing the former and renaming the latter to HbmBinder

This commit is contained in:
Hardy Ferentschik 2011-05-26 14:10:10 +02:00
parent 86ddbc09d9
commit bd900d9bb1
7 changed files with 136 additions and 285 deletions

View File

@ -69,6 +69,7 @@ public class EntityBinding {
private Map<String, MetaAttribute> metaAttributes; private Map<String, MetaAttribute> metaAttributes;
private String proxyInterfaceName;
private boolean lazy; private boolean lazy;
private boolean mutable; private boolean mutable;
private boolean explicitPolymorphism; private boolean explicitPolymorphism;

View File

@ -60,7 +60,7 @@ import org.hibernate.metamodel.source.spi.MetadataImplementor;
import org.hibernate.service.classloading.spi.ClassLoaderService; import org.hibernate.service.classloading.spi.ClassLoaderService;
/** /**
* Creates the domain and relational metamodel for a configured class and binds them together. * Creates the domain and relational metamodel for a configured class and <i>binds</i> them together.
* *
* @author Hardy Ferentschik * @author Hardy Ferentschik
*/ */
@ -84,11 +84,9 @@ public class EntityBinder {
schemaName = createSchemaName(); schemaName = createSchemaName();
bindTable( entityBinding ); bindTable( entityBinding );
entityBinding.setInheritanceType( configuredClass.getInheritanceType() );
bindInheritance( entityBinding ); bindInheritance( entityBinding );
bindWhereFilter( entityBinding ); bindWhereFilter( entityBinding );
bindJpaCaching( entityBinding ); bindJpaCaching( entityBinding );
bindHibernateCaching( entityBinding ); bindHibernateCaching( entityBinding );
@ -96,6 +94,8 @@ public class EntityBinder {
if ( configuredClass.isRoot() ) { if ( configuredClass.isRoot() ) {
bindId( entityBinding ); bindId( entityBinding );
} }
// bind all attributes - simple as well as associations
bindAttributes( entityBinding ); bindAttributes( entityBinding );
// last, but not least we register the new EntityBinding with the metadata // last, but not least we register the new EntityBinding with the metadata
@ -103,6 +103,7 @@ public class EntityBinder {
} }
private void bindInheritance(EntityBinding entityBinding) { private void bindInheritance(EntityBinding entityBinding) {
entityBinding.setInheritanceType( configuredClass.getInheritanceType() );
switch ( configuredClass.getInheritanceType() ) { switch ( configuredClass.getInheritanceType() ) {
case SINGLE_TABLE: { case SINGLE_TABLE: {
bindDiscriminatorColumn( entityBinding ); bindDiscriminatorColumn( entityBinding );

View File

@ -84,10 +84,10 @@ import org.hibernate.metamodel.source.spi.MetadataImplementor;
* @author Steve Ebersole * @author Steve Ebersole
*/ */
abstract class AbstractEntityBinder { abstract class AbstractEntityBinder {
private final HibernateMappingBinder hibernateMappingBinder; private final HbmBinder hibernateMappingBinder;
private final Schema.Name schemaName; private final Schema.Name schemaName;
AbstractEntityBinder(HibernateMappingBinder hibernateMappingBinder, AbstractEntityBinder(HbmBinder hibernateMappingBinder,
XMLHibernateMapping.XMLClass entityClazz) { XMLHibernateMapping.XMLClass entityClazz) {
this.hibernateMappingBinder = hibernateMappingBinder; this.hibernateMappingBinder = hibernateMappingBinder;
this.schemaName = new Schema.Name( this.schemaName = new Schema.Name(
@ -100,16 +100,12 @@ abstract class AbstractEntityBinder {
); );
} }
protected HibernateMappingBinder getHibernateMappingBinder() { public HbmBinder getHibernateMappingBinder() {
return hibernateMappingBinder; return hibernateMappingBinder;
} }
protected HibernateXmlBinder getHibernateXmlBinder() {
return hibernateMappingBinder.getHibernateXmlBinder();
}
protected MetadataImplementor getMetadata() { protected MetadataImplementor getMetadata() {
return hibernateMappingBinder.getHibernateXmlBinder().getMetadata(); return hibernateMappingBinder.getMetadata();
} }
protected Schema.Name getSchemaName() { protected Schema.Name getSchemaName() {
@ -244,14 +240,14 @@ abstract class AbstractEntityBinder {
String physicalTableName; String physicalTableName;
if ( entityClazz.getTable() == null ) { if ( entityClazz.getTable() == null ) {
logicalTableName = StringHelper.unqualify( entityName ); logicalTableName = StringHelper.unqualify( entityName );
physicalTableName = getHibernateXmlBinder().getMetadata() physicalTableName = getMetadata()
.getOptions() .getOptions()
.getNamingStrategy() .getNamingStrategy()
.classToTableName( entityName ); .classToTableName( entityName );
} }
else { else {
logicalTableName = entityClazz.getTable(); logicalTableName = entityClazz.getTable();
physicalTableName = getHibernateXmlBinder().getMetadata() physicalTableName = getMetadata()
.getOptions() .getOptions()
.getNamingStrategy() .getNamingStrategy()
.tableName( logicalTableName ); .tableName( logicalTableName );
@ -295,7 +291,7 @@ abstract class AbstractEntityBinder {
if ( XMLBagElement.class.isInstance( attribute ) ) { if ( XMLBagElement.class.isInstance( attribute ) ) {
XMLBagElement collection = XMLBagElement.class.cast( attribute ); XMLBagElement collection = XMLBagElement.class.cast( attribute );
BagBinding collectionBinding = makeBagAttributeBinding( collection, entityBinding ); BagBinding collectionBinding = makeBagAttributeBinding( collection, entityBinding );
hibernateMappingBinder.getHibernateXmlBinder().getMetadata().addCollection( collectionBinding ); hibernateMappingBinder.getMetadata().addCollection( collectionBinding );
attributeBinding = collectionBinding; attributeBinding = collectionBinding;
} }
else if ( XMLIdbagElement.class.isInstance( attribute ) ) { else if ( XMLIdbagElement.class.isInstance( attribute ) ) {
@ -447,7 +443,7 @@ PrimitiveArray
EntityBinding entityBinding) { EntityBinding entityBinding) {
SimpleAttributeBindingState bindingState = new HbmSimpleAttributeBindingState( SimpleAttributeBindingState bindingState = new HbmSimpleAttributeBindingState(
entityBinding.getEntity().getPojoEntitySpecifics().getClassName(), entityBinding.getEntity().getPojoEntitySpecifics().getClassName(),
getHibernateMappingBinder(), hibernateMappingBinder,
entityBinding.getMetaAttributes(), entityBinding.getMetaAttributes(),
property property
); );
@ -456,7 +452,7 @@ PrimitiveArray
ValueRelationalState relationalState = ValueRelationalState relationalState =
convertToSimpleValueRelationalStateIfPossible( convertToSimpleValueRelationalStateIfPossible(
new HbmSimpleValueRelationalStateContainer( new HbmSimpleValueRelationalStateContainer(
getHibernateMappingBinder(), hibernateMappingBinder,
true, true,
property property
) )
@ -534,7 +530,7 @@ PrimitiveArray
// boolean (true here) indicates that by default column names should be guessed // boolean (true here) indicates that by default column names should be guessed
ManyToOneRelationalState relationalState = ManyToOneRelationalState relationalState =
new HbmManyToOneRelationalStateContainer( new HbmManyToOneRelationalStateContainer(
getHibernateMappingBinder(), hibernateMappingBinder,
true, true,
manyToOne manyToOne
); );

View File

@ -27,7 +27,9 @@ import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import org.dom4j.Attribute; import org.dom4j.Attribute;
import org.hibernate.MappingException; import org.hibernate.MappingException;
import org.hibernate.cfg.NamingStrategy; import org.hibernate.cfg.NamingStrategy;
import org.hibernate.internal.util.StringHelper; import org.hibernate.internal.util.StringHelper;
@ -47,16 +49,16 @@ import org.hibernate.metamodel.source.hbm.xml.mapping.XMLSqlQueryElement;
import org.hibernate.metamodel.source.hbm.xml.mapping.XMLSubclassElement; import org.hibernate.metamodel.source.hbm.xml.mapping.XMLSubclassElement;
import org.hibernate.metamodel.source.hbm.xml.mapping.XMLUnionSubclassElement; import org.hibernate.metamodel.source.hbm.xml.mapping.XMLUnionSubclassElement;
import org.hibernate.metamodel.source.internal.JaxbRoot; import org.hibernate.metamodel.source.internal.JaxbRoot;
import org.hibernate.metamodel.source.spi.MetadataImplementor;
import org.hibernate.service.ServiceRegistry; import org.hibernate.service.ServiceRegistry;
/** /**
* Responsible for performing binding of the {@code <hibernate-mapping/>} DOM element * Responsible for performing binding of hbm xml.
*/ */
public class HibernateMappingBinder implements MappingDefaults { public class HbmBinder implements MappingDefaults {
private static final String DEFAULT_IDENTIFIER_COLUMN_NAME = "id"; private static final String DEFAULT_IDENTIFIER_COLUMN_NAME = "id";
private static final String DEFAULT_DISCRIMINATOR_COLUMN_NAME = "class"; private static final String DEFAULT_DISCRIMINATOR_COLUMN_NAME = "class";
private final HibernateXmlBinder hibernateXmlBinder;
private final JaxbRoot<XMLHibernateMapping> jaxbRoot; private final JaxbRoot<XMLHibernateMapping> jaxbRoot;
private final XMLHibernateMapping hibernateMapping; private final XMLHibernateMapping hibernateMapping;
@ -68,14 +70,18 @@ public class HibernateMappingBinder implements MappingDefaults {
private final String packageName; private final String packageName;
private final boolean autoImport; private final boolean autoImport;
private final MetadataImplementor metadata;
private final Map<String, MetaAttribute> globalMetas;
private Map<String, MetaAttribute> mappingMetas; private Map<String, MetaAttribute> mappingMetas;
public HbmBinder(MetadataImplementor metadata, Map<String, MetaAttribute> globalMetas, JaxbRoot<XMLHibernateMapping> jaxbRoot) {
HibernateMappingBinder(HibernateXmlBinder hibernateXmlBinder, JaxbRoot<XMLHibernateMapping> jaxbRoot) {
this.hibernateXmlBinder = hibernateXmlBinder;
this.jaxbRoot = jaxbRoot; this.jaxbRoot = jaxbRoot;
this.hibernateMapping = jaxbRoot.getRoot(); this.hibernateMapping = jaxbRoot.getRoot();
this.metadata = metadata;
this.globalMetas = globalMetas;
defaultSchemaName = hibernateMapping.getSchema(); defaultSchemaName = hibernateMapping.getSchema();
defaultCatalogName = hibernateMapping.getCatalog(); defaultCatalogName = hibernateMapping.getCatalog();
defaultCascade = MappingHelper.getStringValue( hibernateMapping.getDefaultCascade(), "none" ); defaultCascade = MappingHelper.getStringValue( hibernateMapping.getDefaultCascade(), "none" );
@ -84,17 +90,18 @@ public class HibernateMappingBinder implements MappingDefaults {
packageName = hibernateMapping.getPackage(); packageName = hibernateMapping.getPackage();
autoImport = hibernateMapping.isAutoImport(); autoImport = hibernateMapping.isAutoImport();
mappingMetas = HbmHelper.extractMetas( hibernateMapping.getMeta(), true, hibernateXmlBinder.getGlobalMetas() ); mappingMetas = HbmHelper.extractMetas( hibernateMapping.getMeta(), true, globalMetas );
} }
HibernateXmlBinder getHibernateXmlBinder() { public MetadataImplementor getMetadata() {
return hibernateXmlBinder; return metadata;
} }
XMLHibernateMapping getHibernateMapping() { XMLHibernateMapping getHibernateMapping() {
return hibernateMapping; return hibernateMapping;
} }
Origin getOrigin() { Origin getOrigin() {
return jaxbRoot.getOrigin(); return jaxbRoot.getOrigin();
} }
@ -109,9 +116,8 @@ public class HibernateMappingBinder implements MappingDefaults {
public String getDefaultIdColumnName() { public String getDefaultIdColumnName() {
return DEFAULT_IDENTIFIER_COLUMN_NAME; return DEFAULT_IDENTIFIER_COLUMN_NAME;
} }
public String getDefaultDiscriminatorColumnName() { public String getDefaultDiscriminatorColumnName() {
return DEFAULT_DISCRIMINATOR_COLUMN_NAME; return DEFAULT_DISCRIMINATOR_COLUMN_NAME;
} }
@ -130,11 +136,11 @@ public class HibernateMappingBinder implements MappingDefaults {
@Override @Override
public ServiceRegistry getServiceRegistry() { public ServiceRegistry getServiceRegistry() {
return hibernateXmlBinder.getMetadata().getServiceRegistry(); return metadata.getServiceRegistry();
} }
public NamingStrategy getNamingStrategy() { public NamingStrategy getNamingStrategy() {
return hibernateXmlBinder.getMetadata().getOptions().getNamingStrategy(); return metadata.getOptions().getNamingStrategy();
} }
public String getPackageName() { public String getPackageName() {
@ -149,14 +155,14 @@ public class HibernateMappingBinder implements MappingDefaults {
return mappingMetas; return mappingMetas;
} }
void processHibernateMapping() { public void processHibernateMapping() {
if ( hibernateMapping.getFilterDef() != null ) { if ( hibernateMapping.getFilterDef() != null ) {
// parseFilterDefs( hibernateMapping.getFilterDef() ); // parseFilterDefs( hibernateMapping.getFilterDef() );
} }
if ( hibernateMapping.getFetchProfile() != null ) { if ( hibernateMapping.getFetchProfile() != null ) {
parseFetchProfiles( hibernateMapping.getFetchProfile(), null ); parseFetchProfiles( hibernateMapping.getFetchProfile(), null );
} }
if ( hibernateMapping.getIdentifierGenerator() != null ) { if ( hibernateMapping.getIdentifierGenerator() != null ) {
// parseIdentifierGeneratorRegistrations( hibernateMapping.getIdentifierGenerator() ); // parseIdentifierGeneratorRegistrations( hibernateMapping.getIdentifierGenerator() );
} }
if ( hibernateMapping.getTypedef() != null ) { if ( hibernateMapping.getTypedef() != null ) {
@ -182,8 +188,9 @@ public class HibernateMappingBinder implements MappingDefaults {
// handleUnionSubclass( superModel, mappings, element, inheritedMetas ); // handleUnionSubclass( superModel, mappings, element, inheritedMetas );
} }
else { else {
throw new org.hibernate.metamodel.source.MappingException( "unknown type of class or subclass: " + throw new org.hibernate.metamodel.source.MappingException(
clazzOrSubclass.getClass().getName(), jaxbRoot.getOrigin() "unknown type of class or subclass: " +
clazzOrSubclass.getClass().getName(), jaxbRoot.getOrigin()
); );
} }
} }
@ -197,8 +204,9 @@ public class HibernateMappingBinder implements MappingDefaults {
// bindNamedSQLQuery( element, null, mappings ); // bindNamedSQLQuery( element, null, mappings );
} }
else { else {
throw new org.hibernate.metamodel.source.MappingException( "unknown type of query: " + throw new org.hibernate.metamodel.source.MappingException(
queryOrSqlQuery.getClass().getName(), jaxbRoot.getOrigin() "unknown type of query: " +
queryOrSqlQuery.getClass().getName(), jaxbRoot.getOrigin()
); );
} }
} }
@ -219,26 +227,28 @@ public class HibernateMappingBinder implements MappingDefaults {
String className = getClassName( importValue.getClazz() ); String className = getClassName( importValue.getClazz() );
String rename = importValue.getRename(); String rename = importValue.getRename();
rename = ( rename == null ) ? StringHelper.unqualify( className ) : rename; rename = ( rename == null ) ? StringHelper.unqualify( className ) : rename;
hibernateXmlBinder.getMetadata().addImport( className, rename ); metadata.addImport( className, rename );
} }
} }
protected void parseFetchProfiles(List<XMLFetchProfileElement> fetchProfiles, String containingEntityName) { protected void parseFetchProfiles(List<XMLFetchProfileElement> fetchProfiles, String containingEntityName) {
for ( XMLFetchProfileElement fetchProfile : fetchProfiles ) { for ( XMLFetchProfileElement fetchProfile : fetchProfiles ) {
String profileName = fetchProfile.getName(); String profileName = fetchProfile.getName();
Set<Fetch> fetches = new HashSet<Fetch>(); Set<Fetch> fetches = new HashSet<Fetch>();
for ( XMLFetch fetch : fetchProfile.getFetch() ) { for ( XMLFetch fetch : fetchProfile.getFetch() ) {
String entityName = fetch.getEntity() == null ? containingEntityName : fetch.getEntity(); String entityName = fetch.getEntity() == null ? containingEntityName : fetch.getEntity();
if ( entityName == null ) { if ( entityName == null ) {
throw new MappingException( "could not determine entity for fetch-profile fetch [" + profileName + "]:[" + fetch.getAssociation() + "]" ); throw new MappingException(
"could not determine entity for fetch-profile fetch [" + profileName + "]:[" + fetch.getAssociation() + "]"
);
} }
fetches.add(new Fetch(entityName, fetch.getAssociation(), fetch.getStyle())); fetches.add( new Fetch( entityName, fetch.getAssociation(), fetch.getStyle() ) );
} }
hibernateXmlBinder.getMetadata().addFetchProfile( new FetchProfile(profileName, fetches)); metadata.addFetchProfile( new FetchProfile( profileName, fetches ) );
} }
} }
String extractEntityName( XMLClass entityClazz) { String extractEntityName(XMLClass entityClazz) {
return HbmHelper.extractEntityName( entityClazz, packageName ); return HbmHelper.extractEntityName( entityClazz, packageName );
} }

View File

@ -1,184 +0,0 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* Copyright (c) 2010, 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;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.dom4j.Element;
import org.hibernate.internal.CoreMessageLogger;
import org.hibernate.internal.util.StringHelper;
import org.hibernate.internal.util.collections.JoinedIterator;
import org.hibernate.internal.util.xml.XmlDocument;
import org.hibernate.metamodel.domain.MetaAttribute;
import org.hibernate.metamodel.source.internal.JaxbRoot;
import org.hibernate.metamodel.source.hbm.xml.mapping.XMLHibernateMapping;
import org.hibernate.metamodel.source.spi.MetadataImplementor;
import org.jboss.logging.Logger;
/**
* Binder for {@code hbm.xml} files
*
* @author Steve Ebersole
*/
public class HibernateXmlBinder {
private static final CoreMessageLogger LOG = Logger.getMessageLogger( CoreMessageLogger.class, HibernateXmlBinder.class.getName() );
private final MetadataImplementor metadata;
private final Map<String, MetaAttribute> globalMetas;
public HibernateXmlBinder(MetadataImplementor metadata) {
this( metadata, Collections.<String, MetaAttribute>emptyMap() );
}
public HibernateXmlBinder(MetadataImplementor metadata, Map<String, MetaAttribute> globalMetas) {
this.metadata = metadata;
this.globalMetas = globalMetas;
}
public void bindRoot(JaxbRoot<XMLHibernateMapping> jaxbRoot) {
if (LOG.isDebugEnabled()) LOG.debugf( jaxbRoot.toString() );
bindRoot( jaxbRoot, Collections.<String>emptySet() );
}
public void bindRoot(JaxbRoot<XMLHibernateMapping> jaxbRoot, Set<String> entityNames) {
final HibernateMappingBinder mappingBinder = new HibernateMappingBinder( this, jaxbRoot );
// this is irrelevant due to HHH-6118 and the fact that now all sources should be
// List<String> names = locateEntityNamesAwaitingExtends( metadataXml, mappingBinder );
// if ( !names.isEmpty() ) {
// // classes mentioned in extends not available - so put it in queue
// for ( String name : names ) {
// metadata.getExtendsQueue()
// .add( new ExtendsQueueEntry( name, mappingBinder.getPackageName(), metadataXml, entityNames ) );
// }
// return;
// }
mappingBinder.processHibernateMapping();
}
MetadataImplementor getMetadata() {
return metadata;
}
Map<String, MetaAttribute> getGlobalMetas() {
return globalMetas;
}
private List<String> locateEntityNamesAwaitingExtends(XmlDocument metadataXml, HibernateMappingBinder mappingBinder) {
final String unqualifiedPackageName = mappingBinder.getPackageName();
final Element rootElement = metadataXml.getDocumentTree().getRootElement();
List<String> awaitingExtends = new ArrayList<String>();
// first, iterate over all elements capable of defining an extends attribute
// collecting all found extends references if they cannot be resolved
// against the already processed mappings.
Iterator[] subclasses = new Iterator[3];
subclasses[0] = rootElement.elementIterator( "subclass" );
subclasses[1] = rootElement.elementIterator( "joined-subclass" );
subclasses[2] = rootElement.elementIterator( "union-subclass" );
Iterator iterator = new JoinedIterator( subclasses );
while ( iterator.hasNext() ) {
final Element element = (Element) iterator.next();
final String extendsName = element.attributeValue( "extends" );
// mappings might contain either the "raw" extends name (in the case of
// an entity-name mapping) or a FQN (in the case of a POJO mapping).
if ( getMetadata().getEntityBinding( extendsName ) == null
&& getMetadata().getEntityBinding(
HbmHelper.getClassName(
extendsName, unqualifiedPackageName
)
) == null ) {
awaitingExtends.add( extendsName );
}
}
if ( !awaitingExtends.isEmpty() ) {
// So far, the 'awaitingExtends' list containg all entity names found as extends in this
// current document which were not previously processed in earlier documents.
//
// Now we will go through and remove the ones that are contained in this document
final java.util.Set<String> set = new HashSet<String>( awaitingExtends );
EntityElementHandler handler = new EntityElementHandler() {
public void handleEntity(String entityName, String className) {
if ( entityName != null ) {
set.remove( entityName );
}
else {
String fqn = HbmHelper.getClassName( className, unqualifiedPackageName );
set.remove( fqn );
if ( unqualifiedPackageName != null ) {
set.remove( StringHelper.unqualify( fqn ) );
}
}
}
};
recognizeEntities( rootElement, handler );
awaitingExtends.clear();
awaitingExtends.addAll( set );
}
return awaitingExtends;
}
/**
* Given an entity-containing-element (startNode) recursively locate all
* entity names defined within that element.
*
* @param startNode The containing element
* @param handler The thing that knows what to do whenever we recognize an
* entity-name
*/
private static void recognizeEntities(final Element startNode, EntityElementHandler handler) {
Iterator[] classes = new Iterator[4];
classes[0] = startNode.elementIterator( "class" );
classes[1] = startNode.elementIterator( "subclass" );
classes[2] = startNode.elementIterator( "joined-subclass" );
classes[3] = startNode.elementIterator( "union-subclass" );
Iterator classIterator = new JoinedIterator( classes );
while ( classIterator.hasNext() ) {
Element element = (Element) classIterator.next();
handler.handleEntity(
element.attributeValue( "entity-name" ),
element.attributeValue( "name" )
);
recognizeEntities( element, handler );
}
}
private static interface EntityElementHandler {
public void handleEntity(String entityName, String className);
}
}

View File

@ -28,6 +28,7 @@ import org.hibernate.MappingException;
import org.hibernate.cache.spi.access.AccessType; import org.hibernate.cache.spi.access.AccessType;
import org.hibernate.metamodel.binding.Caching; import org.hibernate.metamodel.binding.Caching;
import org.hibernate.metamodel.binding.EntityBinding; import org.hibernate.metamodel.binding.EntityBinding;
import org.hibernate.metamodel.binding.state.DiscriminatorBindingState;
import org.hibernate.metamodel.binding.state.SimpleAttributeBindingState; import org.hibernate.metamodel.binding.state.SimpleAttributeBindingState;
import org.hibernate.metamodel.relational.Identifier; import org.hibernate.metamodel.relational.Identifier;
import org.hibernate.metamodel.relational.InLineView; import org.hibernate.metamodel.relational.InLineView;
@ -41,7 +42,6 @@ import org.hibernate.metamodel.source.hbm.xml.mapping.XMLHibernateMapping;
import org.hibernate.metamodel.source.hbm.xml.mapping.XMLHibernateMapping.XMLClass; import org.hibernate.metamodel.source.hbm.xml.mapping.XMLHibernateMapping.XMLClass;
import org.hibernate.metamodel.source.hbm.xml.mapping.XMLHibernateMapping.XMLClass.XMLCompositeId; import org.hibernate.metamodel.source.hbm.xml.mapping.XMLHibernateMapping.XMLClass.XMLCompositeId;
import org.hibernate.metamodel.source.hbm.xml.mapping.XMLHibernateMapping.XMLClass.XMLId; import org.hibernate.metamodel.source.hbm.xml.mapping.XMLHibernateMapping.XMLClass.XMLId;
import org.hibernate.metamodel.binding.state.DiscriminatorBindingState;
/** /**
* TODO : javadoc * TODO : javadoc
@ -50,7 +50,7 @@ import org.hibernate.metamodel.binding.state.DiscriminatorBindingState;
*/ */
class RootEntityBinder extends AbstractEntityBinder { class RootEntityBinder extends AbstractEntityBinder {
RootEntityBinder(HibernateMappingBinder hibernateMappingBinder, XMLClass xmlClazz) { RootEntityBinder(HbmBinder hibernateMappingBinder, XMLClass xmlClazz) {
super( hibernateMappingBinder, xmlClazz ); super( hibernateMappingBinder, xmlClazz );
} }
@ -86,12 +86,12 @@ class RootEntityBinder extends AbstractEntityBinder {
// called createClassProperties in HBMBinder... // called createClassProperties in HBMBinder...
buildAttributeBindings( xmlClazz, entityBinding ); buildAttributeBindings( xmlClazz, entityBinding );
getHibernateXmlBinder().getMetadata().addEntity( entityBinding ); getMetadata().addEntity( entityBinding );
} }
private void basicTableBinding(XMLClass xmlClazz, private void basicTableBinding(XMLClass xmlClazz,
EntityBinding entityBinding) { EntityBinding entityBinding) {
final Schema schema = getHibernateXmlBinder().getMetadata().getDatabase().getSchema( getSchemaName() ); final Schema schema = getMetadata().getDatabase().getSchema( getSchemaName() );
final String subSelect = final String subSelect =
xmlClazz.getSubselectAttribute() == null ? xmlClazz.getSubselect() : xmlClazz.getSubselectAttribute(); xmlClazz.getSubselectAttribute() == null ? xmlClazz.getSubselect() : xmlClazz.getSubselectAttribute();
@ -245,9 +245,9 @@ class RootEntityBinder extends AbstractEntityBinder {
} }
DiscriminatorBindingState bindingState = new HbmDiscriminatorBindingState( DiscriminatorBindingState bindingState = new HbmDiscriminatorBindingState(
entityBinding.getEntity().getPojoEntitySpecifics().getClassName(), entityBinding.getEntity().getPojoEntitySpecifics().getClassName(),
getHibernateMappingBinder(), getHibernateMappingBinder(),
xmlEntityClazz.getDiscriminator() xmlEntityClazz.getDiscriminator()
); );
// boolean (true here) indicates that by default column names should be guessed // boolean (true here) indicates that by default column names should be guessed
@ -283,13 +283,13 @@ class RootEntityBinder extends AbstractEntityBinder {
} }
protected void bindVersion(XMLHibernateMapping.XMLClass.XMLVersion version, protected void bindVersion(XMLHibernateMapping.XMLClass.XMLVersion version,
EntityBinding entityBinding) { EntityBinding entityBinding) {
SimpleAttributeBindingState bindingState = SimpleAttributeBindingState bindingState =
new HbmSimpleAttributeBindingState( new HbmSimpleAttributeBindingState(
entityBinding.getEntity().getPojoEntitySpecifics().getClassName(), entityBinding.getEntity().getPojoEntitySpecifics().getClassName(),
getHibernateMappingBinder(), getHibernateMappingBinder(),
entityBinding.getMetaAttributes(), entityBinding.getMetaAttributes(),
version version
); );
// boolean (true here) indicates that by default column names should be guessed // boolean (true here) indicates that by default column names should be guessed
@ -313,10 +313,10 @@ class RootEntityBinder extends AbstractEntityBinder {
SimpleAttributeBindingState bindingState = SimpleAttributeBindingState bindingState =
new HbmSimpleAttributeBindingState( new HbmSimpleAttributeBindingState(
entityBinding.getEntity().getPojoEntitySpecifics().getClassName(), entityBinding.getEntity().getPojoEntitySpecifics().getClassName(),
getHibernateMappingBinder(), getHibernateMappingBinder(),
entityBinding.getMetaAttributes(), entityBinding.getMetaAttributes(),
timestamp timestamp
); );
// relational model has not been bound yet // relational model has not been bound yet
@ -332,7 +332,7 @@ class RootEntityBinder extends AbstractEntityBinder {
entityBinding.makeVersionBinding( bindingState.getAttributeName() ) entityBinding.makeVersionBinding( bindingState.getAttributeName() )
.initialize( bindingState ) .initialize( bindingState )
.initialize( relationalState ); .initialize( relationalState );
} }
private void bindCaching(XMLClass xmlClazz, private void bindCaching(XMLClass xmlClazz,

View File

@ -27,12 +27,15 @@ import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.Serializable; import java.io.Serializable;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
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.jboss.logging.Logger;
import org.hibernate.DuplicateMappingException; import org.hibernate.DuplicateMappingException;
import org.hibernate.HibernateException; import org.hibernate.HibernateException;
import org.hibernate.SessionFactory; import org.hibernate.SessionFactory;
@ -47,11 +50,12 @@ import org.hibernate.metamodel.binding.FetchProfile;
import org.hibernate.metamodel.binding.IdGenerator; import org.hibernate.metamodel.binding.IdGenerator;
import org.hibernate.metamodel.binding.PluralAttributeBinding; import org.hibernate.metamodel.binding.PluralAttributeBinding;
import org.hibernate.metamodel.binding.TypeDef; import org.hibernate.metamodel.binding.TypeDef;
import org.hibernate.metamodel.domain.MetaAttribute;
import org.hibernate.metamodel.relational.Database; import org.hibernate.metamodel.relational.Database;
import org.hibernate.metamodel.source.annotation.xml.XMLEntityMappings; import org.hibernate.metamodel.source.annotation.xml.XMLEntityMappings;
import org.hibernate.metamodel.source.annotations.AnnotationBinder; import org.hibernate.metamodel.source.annotations.AnnotationBinder;
import org.hibernate.metamodel.source.annotations.xml.OrmXmlParser; import org.hibernate.metamodel.source.annotations.xml.OrmXmlParser;
import org.hibernate.metamodel.source.hbm.HibernateXmlBinder; import org.hibernate.metamodel.source.hbm.HbmBinder;
import org.hibernate.metamodel.source.hbm.xml.mapping.XMLHibernateMapping; import org.hibernate.metamodel.source.hbm.xml.mapping.XMLHibernateMapping;
import org.hibernate.metamodel.source.spi.MetadataImplementor; import org.hibernate.metamodel.source.spi.MetadataImplementor;
import org.hibernate.service.BasicServiceRegistry; import org.hibernate.service.BasicServiceRegistry;
@ -66,13 +70,16 @@ import org.hibernate.type.TypeResolver;
*/ */
public class MetadataImpl implements MetadataImplementor, Serializable { public class MetadataImpl implements MetadataImplementor, Serializable {
private static final CoreMessageLogger LOG = Logger.getMessageLogger(CoreMessageLogger.class, MetadataImpl.class.getName()); private static final CoreMessageLogger LOG = Logger.getMessageLogger(
CoreMessageLogger.class,
MetadataImpl.class.getName()
);
private final BasicServiceRegistry serviceRegistry; private final BasicServiceRegistry serviceRegistry;
private final Options options; private final Options options;
private final Database database = new Database(); private final Database database = new Database();
private TypeResolver typeResolver = new TypeResolver(); private TypeResolver typeResolver = new TypeResolver();
/** /**
* Maps the fully qualified class name of an entity to its entity binding * Maps the fully qualified class name of an entity to its entity binding
@ -81,11 +88,11 @@ public class MetadataImpl implements MetadataImplementor, Serializable {
private Map<String, PluralAttributeBinding> collectionBindingMap = new HashMap<String, PluralAttributeBinding>(); private Map<String, PluralAttributeBinding> collectionBindingMap = new HashMap<String, PluralAttributeBinding>();
private Map<String, FetchProfile> fetchProfiles = new HashMap<String, FetchProfile>(); private Map<String, FetchProfile> fetchProfiles = new HashMap<String, FetchProfile>();
private Map<String, String> imports; private Map<String, String> imports;
private Map<String, TypeDef> typeDefs = new HashMap<String, TypeDef>(); private Map<String, TypeDef> typeDefs = new HashMap<String, TypeDef>();
private Map<String, IdGenerator> idGenerators = new HashMap<String, IdGenerator>(); private Map<String, IdGenerator> idGenerators = new HashMap<String, IdGenerator>();
private Map<String, NamedQueryDefinition> namedQueryDefs = new HashMap<String, NamedQueryDefinition>(); private Map<String, NamedQueryDefinition> namedQueryDefs = new HashMap<String, NamedQueryDefinition>();
private Map<String, NamedSQLQueryDefinition> namedNativeQueryDefs = new HashMap<String, NamedSQLQueryDefinition>(); private Map<String, NamedSQLQueryDefinition> namedNativeQueryDefs = new HashMap<String, NamedSQLQueryDefinition>();
private Map<String, FilterDefinition> filterDefs = new HashMap<String, FilterDefinition>(); private Map<String, FilterDefinition> filterDefs = new HashMap<String, FilterDefinition>();
public MetadataImpl(MetadataSources metadataSources, Options options) { public MetadataImpl(MetadataSources metadataSources, Options options) {
this.serviceRegistry = metadataSources.getServiceRegistry(); this.serviceRegistry = metadataSources.getServiceRegistry();
@ -104,44 +111,68 @@ public class MetadataImpl implements MetadataImplementor, Serializable {
new EntityReferenceResolver( this ).resolve(); new EntityReferenceResolver( this ).resolve();
} }
public void addFetchProfile( FetchProfile profile ) { public void addFetchProfile(FetchProfile profile) {
fetchProfiles.put(profile.getName(), profile); fetchProfiles.put( profile.getName(), profile );
} }
public void addFilterDef( FilterDefinition def ) { public void addFilterDef(FilterDefinition def) {
filterDefs.put(def.getFilterName(), def); filterDefs.put( def.getFilterName(), def );
} }
public Map<String, FilterDefinition> getFilterDefinitions() { public Map<String, FilterDefinition> getFilterDefinitions() {
return filterDefs; return filterDefs;
} }
public void addIdGenerator( IdGenerator generator ) { public void addIdGenerator(IdGenerator generator) {
idGenerators.put(generator.getName(), generator); idGenerators.put( generator.getName(), generator );
} }
public void addNamedNativeQuery( String name, public IdGenerator getIdGenerator(String name) {
NamedSQLQueryDefinition def ) { if ( name == null ) {
namedNativeQueryDefs.put(name, def); throw new IllegalArgumentException( "null is not a valid generator name" );
} }
return idGenerators.get( name );
}
public void addNamedQuery( String name, public void addNamedNativeQuery(String name, NamedSQLQueryDefinition def) {
NamedQueryDefinition def ) { namedNativeQueryDefs.put( name, def );
namedQueryDefs.put(name, def); }
}
public void addTypeDef(String name, TypeDef typeDef) { public NamedSQLQueryDefinition getNamedNativeQuery(String name) {
// TODO - should we check whether the typedef already exists? Log it? Exception? (HF) if ( name == null ) {
typeDefs.put( name, typeDef ); throw new IllegalArgumentException( "null is not a valid native query name" );
} }
return namedNativeQueryDefs.get( name );
}
public void addNamedQuery(String name, NamedQueryDefinition def) {
namedQueryDefs.put( name, def );
}
public NamedQueryDefinition getNamedQuery(String name) {
if ( name == null ) {
throw new IllegalArgumentException( "null is not a valid query name" );
}
return namedQueryDefs.get( name );
}
public void addTypeDef(String name, TypeDef typeDef) {
// TODO - should we check whether the typedef already exists? Log it? Exception? (HF)
typeDefs.put( name, typeDef );
}
public TypeDef getTypeDef(String name) {
return typeDefs.get( name );
}
private void applyHibernateMappings(MetadataSources metadataSources, List<String> processedEntityNames) { private void applyHibernateMappings(MetadataSources metadataSources, List<String> processedEntityNames) {
final HibernateXmlBinder hibernateXmlBinder = new HibernateXmlBinder( this );
for ( JaxbRoot jaxbRoot : metadataSources.getJaxbRootList() ) { for ( JaxbRoot jaxbRoot : metadataSources.getJaxbRootList() ) {
// filter to just hbm-based roots // filter to just hbm-based roots
if ( jaxbRoot.getRoot() instanceof XMLHibernateMapping ) { if ( jaxbRoot.getRoot() instanceof XMLHibernateMapping ) {
hibernateXmlBinder.bindRoot( jaxbRoot ); final HbmBinder mappingBinder = new HbmBinder(
this, Collections.<String, MetaAttribute>emptyMap(), jaxbRoot
);
mappingBinder.processHibernateMapping();
} }
} }
} }
@ -260,15 +291,11 @@ public class MetadataImpl implements MetadataImplementor, Serializable {
} }
} }
public TypeDef getTypeDef(String name) { public Iterable<FetchProfile> getFetchProfiles() {
return typeDefs.get( name ); return fetchProfiles.values();
} }
public Iterable<FetchProfile> getFetchProfiles() { public TypeResolver getTypeResolver() {
return fetchProfiles.values(); return typeResolver;
} }
public TypeResolver getTypeResolver() {
return typeResolver;
}
} }