HHH-6263 Refactoring HibernateXmlBinder and HibernateMappingBinder. Removing the former and renaming the latter to HbmBinder
This commit is contained in:
parent
86ddbc09d9
commit
bd900d9bb1
|
@ -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;
|
||||||
|
|
|
@ -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 );
|
||||||
|
|
|
@ -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
|
||||||
);
|
);
|
||||||
|
|
|
@ -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,7 +155,7 @@ 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() );
|
||||||
}
|
}
|
||||||
|
@ -182,7 +188,8 @@ 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(
|
||||||
|
"unknown type of class or subclass: " +
|
||||||
clazzOrSubclass.getClass().getName(), jaxbRoot.getOrigin()
|
clazzOrSubclass.getClass().getName(), jaxbRoot.getOrigin()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -197,7 +204,8 @@ 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(
|
||||||
|
"unknown type of query: " +
|
||||||
queryOrSqlQuery.getClass().getName(), jaxbRoot.getOrigin()
|
queryOrSqlQuery.getClass().getName(), jaxbRoot.getOrigin()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -219,7 +227,7 @@ 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 );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -230,15 +238,17 @@ public class HibernateMappingBinder implements MappingDefaults {
|
||||||
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 );
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -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();
|
||||||
|
|
|
@ -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,7 +70,10 @@ 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;
|
||||||
|
@ -104,31 +111,49 @@ 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 NamedSQLQueryDefinition getNamedNativeQuery(String name) {
|
||||||
|
if ( name == null ) {
|
||||||
|
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) {
|
public void addTypeDef(String name, TypeDef typeDef) {
|
||||||
|
@ -136,12 +161,18 @@ public class MetadataImpl implements MetadataImplementor, Serializable {
|
||||||
typeDefs.put( name, typeDef );
|
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,10 +291,6 @@ public class MetadataImpl implements MetadataImplementor, Serializable {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public TypeDef getTypeDef(String name) {
|
|
||||||
return typeDefs.get( name );
|
|
||||||
}
|
|
||||||
|
|
||||||
public Iterable<FetchProfile> getFetchProfiles() {
|
public Iterable<FetchProfile> getFetchProfiles() {
|
||||||
return fetchProfiles.values();
|
return fetchProfiles.values();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue