HHH-8893 removed o.h.metadata.source.internal.hbm,
MetadataSourceProcessor, and MetadataSourceProcessingOrder
This commit is contained in:
parent
8634da864b
commit
77f0c9a1ed
|
@ -37,9 +37,7 @@ import org.hibernate.metamodel.spi.TypeContributor;
|
|||
import org.hibernate.type.BasicType;
|
||||
import org.hibernate.usertype.CompositeUserType;
|
||||
import org.hibernate.usertype.UserType;
|
||||
|
||||
import org.jboss.jandex.IndexView;
|
||||
|
||||
import org.xml.sax.EntityResolver;
|
||||
|
||||
/**
|
||||
|
@ -67,15 +65,6 @@ public interface MetadataBuilder {
|
|||
*/
|
||||
public MetadataBuilder with(EntityResolver entityResolver);
|
||||
|
||||
/**
|
||||
* Specify the order in which to process metadata sources.
|
||||
*
|
||||
* @param metadataSourceProcessingOrder The order.
|
||||
*
|
||||
* @return {@code this}, for method chaining
|
||||
*/
|
||||
public MetadataBuilder with(MetadataSourceProcessingOrder metadataSourceProcessingOrder);
|
||||
|
||||
/**
|
||||
* Specify the second-level cache mode to be used. This is the cache mode in terms of whether or
|
||||
* not to cache.
|
||||
|
|
|
@ -1,35 +0,0 @@
|
|||
/*
|
||||
* 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;
|
||||
|
||||
/**
|
||||
* Enumeration of the possible orders for processing metadata sources. The implication is in terms of precedence;
|
||||
* for duplicate information in different sources, whichever is processed first has precedence.
|
||||
*
|
||||
* @author Steve Ebersole
|
||||
*/
|
||||
public enum MetadataSourceProcessingOrder {
|
||||
ANNOTATIONS_FIRST,
|
||||
HBM_FIRST
|
||||
}
|
|
@ -25,6 +25,7 @@ package org.hibernate.metamodel.internal;
|
|||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import javax.persistence.SharedCacheMode;
|
||||
|
||||
import org.hibernate.HibernateException;
|
||||
|
@ -43,7 +44,6 @@ import org.hibernate.cfg.NamingStrategy;
|
|||
import org.hibernate.engine.config.spi.ConfigurationService;
|
||||
import org.hibernate.engine.config.spi.StandardConverters;
|
||||
import org.hibernate.metamodel.MetadataBuilder;
|
||||
import org.hibernate.metamodel.MetadataSourceProcessingOrder;
|
||||
import org.hibernate.metamodel.MetadataSources;
|
||||
import org.hibernate.metamodel.archive.scan.internal.StandardScanOptions;
|
||||
import org.hibernate.metamodel.archive.scan.spi.ScanEnvironment;
|
||||
|
@ -62,10 +62,8 @@ import org.hibernate.type.CompositeCustomType;
|
|||
import org.hibernate.type.CustomType;
|
||||
import org.hibernate.usertype.CompositeUserType;
|
||||
import org.hibernate.usertype.UserType;
|
||||
|
||||
import org.jboss.jandex.IndexView;
|
||||
import org.jboss.logging.Logger;
|
||||
|
||||
import org.xml.sax.EntityResolver;
|
||||
|
||||
import static org.hibernate.internal.DeprecationLogger.DEPRECATION_LOGGER;
|
||||
|
@ -136,12 +134,6 @@ public class MetadataBuilderImpl implements MetadataBuilder, TypeContributions {
|
|||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public MetadataBuilder with(MetadataSourceProcessingOrder metadataSourceProcessingOrder) {
|
||||
this.options.metadataSourceProcessingOrder = metadataSourceProcessingOrder;
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public MetadataBuilder with(SharedCacheMode sharedCacheMode) {
|
||||
this.options.sharedCacheMode = sharedCacheMode;
|
||||
|
@ -338,7 +330,6 @@ public class MetadataBuilderImpl implements MetadataBuilder, TypeContributions {
|
|||
StandardPersistentAttributeMemberResolver.INSTANCE;
|
||||
|
||||
// todo : go away
|
||||
private MetadataSourceProcessingOrder metadataSourceProcessingOrder = MetadataSourceProcessingOrder.HBM_FIRST;
|
||||
private EntityResolver entityResolver = EJB3DTDEntityResolver.INSTANCE;
|
||||
|
||||
public Options(StandardServiceRegistry serviceRegistry) {
|
||||
|
@ -491,11 +482,6 @@ public class MetadataBuilderImpl implements MetadataBuilder, TypeContributions {
|
|||
return persistentAttributeMemberResolver;
|
||||
}
|
||||
|
||||
@Override
|
||||
public MetadataSourceProcessingOrder getMetadataSourceProcessingOrder() {
|
||||
return metadataSourceProcessingOrder;
|
||||
}
|
||||
|
||||
@Override
|
||||
public EntityResolver getEntityResolver() {
|
||||
return entityResolver;
|
||||
|
|
|
@ -60,7 +60,6 @@ import org.hibernate.id.factory.IdentifierGeneratorFactory;
|
|||
import org.hibernate.id.factory.spi.MutableIdentifierGeneratorFactory;
|
||||
import org.hibernate.internal.util.collections.CollectionHelper;
|
||||
import org.hibernate.internal.util.config.ConfigurationHelper;
|
||||
import org.hibernate.metamodel.MetadataSourceProcessingOrder;
|
||||
import org.hibernate.metamodel.MetadataSources;
|
||||
import org.hibernate.metamodel.NamedStoredProcedureQueryDefinition;
|
||||
import org.hibernate.metamodel.SessionFactoryBuilder;
|
||||
|
@ -78,10 +77,9 @@ import org.hibernate.metamodel.internal.binder.Binder;
|
|||
import org.hibernate.metamodel.reflite.internal.JavaTypeDescriptorRepositoryImpl;
|
||||
import org.hibernate.metamodel.reflite.spi.JavaTypeDescriptor;
|
||||
import org.hibernate.metamodel.reflite.spi.JavaTypeDescriptorRepository;
|
||||
import org.hibernate.metamodel.source.internal.annotations.AnnotationMetadataSourceProcessorImpl;
|
||||
import org.hibernate.metamodel.source.internal.annotations.AnnotationMetadataSourceProcessor;
|
||||
import org.hibernate.metamodel.source.internal.annotations.JandexAccess;
|
||||
import org.hibernate.metamodel.source.internal.annotations.JandexAccessImpl;
|
||||
import org.hibernate.metamodel.source.internal.hbm.HbmMetadataSourceProcessorImpl;
|
||||
import org.hibernate.metamodel.source.internal.jandex.Unifier;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.JaxbEntityMappings;
|
||||
import org.hibernate.metamodel.source.spi.FilterDefinitionSource;
|
||||
|
@ -91,12 +89,12 @@ import org.hibernate.metamodel.source.spi.MappingDefaults;
|
|||
import org.hibernate.metamodel.source.spi.MetaAttributeContext;
|
||||
import org.hibernate.metamodel.source.spi.TypeDescriptorSource;
|
||||
import org.hibernate.metamodel.spi.AdditionalJaxbRootProducer;
|
||||
import org.hibernate.metamodel.spi.AdditionalJaxbRootProducer.AdditionalJaxbRootProducerContext;
|
||||
import org.hibernate.metamodel.spi.BindingContext;
|
||||
import org.hibernate.metamodel.spi.ClassLoaderAccess;
|
||||
import org.hibernate.metamodel.spi.InFlightMetadataCollector;
|
||||
import org.hibernate.metamodel.spi.MetadataBuildingOptions;
|
||||
import org.hibernate.metamodel.spi.MetadataContributor;
|
||||
import org.hibernate.metamodel.spi.MetadataSourceProcessor;
|
||||
import org.hibernate.metamodel.spi.PluralAttributeElementNature;
|
||||
import org.hibernate.metamodel.spi.TypeContributions;
|
||||
import org.hibernate.metamodel.spi.TypeContributor;
|
||||
|
@ -132,13 +130,10 @@ import org.hibernate.type.TypeResolver;
|
|||
import org.hibernate.usertype.CompositeUserType;
|
||||
import org.hibernate.usertype.UserType;
|
||||
import org.hibernate.xml.spi.BindResult;
|
||||
|
||||
import org.jboss.jandex.DotName;
|
||||
import org.jboss.jandex.IndexView;
|
||||
import org.jboss.logging.Logger;
|
||||
|
||||
import static org.hibernate.metamodel.spi.AdditionalJaxbRootProducer.AdditionalJaxbRootProducerContext;
|
||||
|
||||
/**
|
||||
* Represents the process of building a Metadata object. The main entry point is the
|
||||
* static {@link #build}
|
||||
|
@ -224,25 +219,14 @@ public class MetadataBuildingProcess {
|
|||
// NOTE : this becomes even more simplified after we move purely
|
||||
// to unified model
|
||||
|
||||
final MetadataSourceProcessor[] metadataSourceProcessors;
|
||||
if ( options.getMetadataSourceProcessingOrder() == MetadataSourceProcessingOrder.HBM_FIRST ) {
|
||||
metadataSourceProcessors = new MetadataSourceProcessor[] {
|
||||
new HbmMetadataSourceProcessorImpl( rootBindingContext, sources ),
|
||||
new AnnotationMetadataSourceProcessorImpl( rootBindingContext, jandexView )
|
||||
};
|
||||
}
|
||||
else {
|
||||
metadataSourceProcessors = new MetadataSourceProcessor[] {
|
||||
new AnnotationMetadataSourceProcessorImpl( rootBindingContext, jandexView ),
|
||||
new HbmMetadataSourceProcessorImpl( rootBindingContext, sources )
|
||||
};
|
||||
}
|
||||
final AnnotationMetadataSourceProcessor processor = new AnnotationMetadataSourceProcessor(
|
||||
rootBindingContext, jandexView );
|
||||
|
||||
processTypeDefinitions( metadataSourceProcessors, rootBindingContext );
|
||||
processFilterDefinitions( metadataSourceProcessors, rootBindingContext );
|
||||
processIdentifierGenerators( metadataSourceProcessors, rootBindingContext );
|
||||
processMappings( metadataSourceProcessors, rootBindingContext );
|
||||
bindMappingDependentMetadata( metadataSourceProcessors, rootBindingContext );
|
||||
processTypeDefinitions( processor, rootBindingContext );
|
||||
processFilterDefinitions( processor, rootBindingContext );
|
||||
processIdentifierGenerators( processor, rootBindingContext );
|
||||
processMappings( processor, rootBindingContext );
|
||||
bindMappingDependentMetadata( processor, rootBindingContext );
|
||||
|
||||
final ClassLoaderService classLoaderService = options.getServiceRegistry().getService( ClassLoaderService.class );
|
||||
|
||||
|
@ -265,10 +249,6 @@ public class MetadataBuildingProcess {
|
|||
for ( AdditionalJaxbRootProducer producer : classLoaderService.loadJavaServices( AdditionalJaxbRootProducer.class ) ) {
|
||||
bindResults.addAll( producer.produceRoots( metadataCollector, jaxbRootProducerContext ) );
|
||||
}
|
||||
final HbmMetadataSourceProcessorImpl processor = new HbmMetadataSourceProcessorImpl( rootBindingContext, bindResults );
|
||||
final Binder binder = new Binder( rootBindingContext );
|
||||
binder.addEntityHierarchies( processor.extractEntityHierarchies() );
|
||||
binder.bindEntityHierarchies();
|
||||
|
||||
secondPass( rootBindingContext );
|
||||
|
||||
|
@ -476,40 +456,36 @@ public class MetadataBuildingProcess {
|
|||
}
|
||||
|
||||
private static void processTypeDefinitions(
|
||||
MetadataSourceProcessor[] metadataSourceProcessors,
|
||||
AnnotationMetadataSourceProcessor processor,
|
||||
RootBindingContextImpl bindingContext) {
|
||||
final ClassLoaderService cls = bindingContext.getBuildingOptions().getServiceRegistry().getService( ClassLoaderService.class );
|
||||
|
||||
for ( MetadataSourceProcessor processor : metadataSourceProcessors ) {
|
||||
for ( TypeDescriptorSource typeDescriptorSource : processor.extractTypeDefinitionSources() ) {
|
||||
bindingContext.getMetadataCollector().addTypeDefinition(
|
||||
new TypeDefinition(
|
||||
typeDescriptorSource.getName(),
|
||||
cls.classForName( typeDescriptorSource.getTypeImplementationClassName() ),
|
||||
typeDescriptorSource.getRegistrationKeys(),
|
||||
typeDescriptorSource.getParameters()
|
||||
)
|
||||
);
|
||||
}
|
||||
for ( TypeDescriptorSource typeDescriptorSource : processor.extractTypeDefinitionSources() ) {
|
||||
bindingContext.getMetadataCollector().addTypeDefinition(
|
||||
new TypeDefinition(
|
||||
typeDescriptorSource.getName(),
|
||||
cls.classForName( typeDescriptorSource.getTypeImplementationClassName() ),
|
||||
typeDescriptorSource.getRegistrationKeys(),
|
||||
typeDescriptorSource.getParameters()
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
private static void processFilterDefinitions(
|
||||
MetadataSourceProcessor[] metadataSourceProcessors,
|
||||
AnnotationMetadataSourceProcessor processor,
|
||||
RootBindingContextImpl bindingContext) {
|
||||
for ( MetadataSourceProcessor processor : metadataSourceProcessors ) {
|
||||
for ( FilterDefinitionSource filterDefinitionSource : processor.extractFilterDefinitionSources() ) {
|
||||
bindingContext.getMetadataCollector().addFilterDefinition(
|
||||
new FilterDefinition(
|
||||
filterDefinitionSource.getName(),
|
||||
filterDefinitionSource.getCondition(),
|
||||
resolveFilterDefinitionParamType(
|
||||
filterDefinitionSource.getParameterSources(),
|
||||
bindingContext
|
||||
)
|
||||
)
|
||||
);
|
||||
}
|
||||
for ( FilterDefinitionSource filterDefinitionSource : processor.extractFilterDefinitionSources() ) {
|
||||
bindingContext.getMetadataCollector().addFilterDefinition(
|
||||
new FilterDefinition(
|
||||
filterDefinitionSource.getName(),
|
||||
filterDefinitionSource.getCondition(),
|
||||
resolveFilterDefinitionParamType(
|
||||
filterDefinitionSource.getParameterSources(),
|
||||
bindingContext
|
||||
)
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -533,34 +509,30 @@ public class MetadataBuildingProcess {
|
|||
}
|
||||
|
||||
private static void processIdentifierGenerators(
|
||||
MetadataSourceProcessor[] metadataSourceProcessors,
|
||||
AnnotationMetadataSourceProcessor processor,
|
||||
RootBindingContextImpl bindingContext) {
|
||||
for ( MetadataSourceProcessor processor : metadataSourceProcessors ) {
|
||||
for ( IdentifierGeneratorSource identifierGeneratorSource : processor.extractGlobalIdentifierGeneratorSources() ) {
|
||||
bindingContext.getMetadataCollector().addIdGenerator(
|
||||
new IdentifierGeneratorDefinition(
|
||||
identifierGeneratorSource.getGeneratorName(),
|
||||
identifierGeneratorSource.getGeneratorImplementationName(),
|
||||
identifierGeneratorSource.getParameters()
|
||||
)
|
||||
);
|
||||
}
|
||||
for ( IdentifierGeneratorSource identifierGeneratorSource : processor.extractGlobalIdentifierGeneratorSources() ) {
|
||||
bindingContext.getMetadataCollector().addIdGenerator(
|
||||
new IdentifierGeneratorDefinition(
|
||||
identifierGeneratorSource.getGeneratorName(),
|
||||
identifierGeneratorSource.getGeneratorImplementationName(),
|
||||
identifierGeneratorSource.getParameters()
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
private static void processMappings(
|
||||
MetadataSourceProcessor[] metadataSourceProcessors,
|
||||
AnnotationMetadataSourceProcessor processor,
|
||||
RootBindingContextImpl bindingContext) {
|
||||
final Binder binder = new Binder( bindingContext );
|
||||
// Add all hierarchies first, before binding.
|
||||
for ( MetadataSourceProcessor processor : metadataSourceProcessors ) {
|
||||
binder.addEntityHierarchies( processor.extractEntityHierarchies() );
|
||||
}
|
||||
binder.addEntityHierarchies( processor.extractEntityHierarchies() );
|
||||
binder.bindEntityHierarchies();
|
||||
}
|
||||
|
||||
private static void bindMappingDependentMetadata(
|
||||
MetadataSourceProcessor[] metadataSourceProcessors,
|
||||
AnnotationMetadataSourceProcessor processor,
|
||||
RootBindingContextImpl bindingContext) {
|
||||
// Create required back references, which are required for one-to-many associations with key bindings that are non-inverse,
|
||||
// non-nullable, and unidirectional
|
||||
|
@ -643,9 +615,7 @@ public class MetadataBuildingProcess {
|
|||
}
|
||||
}
|
||||
|
||||
for ( MetadataSourceProcessor metadataSourceProcessor : metadataSourceProcessors ) {
|
||||
metadataSourceProcessor.processMappingDependentMetadata();
|
||||
}
|
||||
processor.processMappingDependentMetadata();
|
||||
}
|
||||
|
||||
private static void secondPass(RootBindingContextImpl bindingContext) {
|
||||
|
|
|
@ -42,8 +42,6 @@ import org.hibernate.metamodel.source.spi.FilterDefinitionSource;
|
|||
import org.hibernate.metamodel.source.spi.IdentifierGeneratorSource;
|
||||
import org.hibernate.metamodel.source.spi.TypeDescriptorSource;
|
||||
import org.hibernate.metamodel.spi.BindingContext;
|
||||
import org.hibernate.metamodel.spi.MetadataSourceProcessor;
|
||||
|
||||
import org.jboss.jandex.AnnotationInstance;
|
||||
import org.jboss.jandex.IndexView;
|
||||
|
||||
|
@ -55,10 +53,10 @@ import org.jboss.jandex.IndexView;
|
|||
* @author Hardy Ferentschik
|
||||
* @author Steve Ebersole
|
||||
*/
|
||||
public class AnnotationMetadataSourceProcessorImpl implements MetadataSourceProcessor {
|
||||
public class AnnotationMetadataSourceProcessor {
|
||||
private final AnnotationBindingContext bindingContext;
|
||||
|
||||
public AnnotationMetadataSourceProcessorImpl(BindingContext bindingContext, IndexView jandexView) {
|
||||
public AnnotationMetadataSourceProcessor(BindingContext bindingContext, IndexView jandexView) {
|
||||
|
||||
if ( !jandexView.getAnnotations( PseudoJpaDotNames.DEFAULT_DELIMITED_IDENTIFIERS ).isEmpty() ) {
|
||||
// todo : this needs to move to AnnotationBindingContext
|
||||
|
@ -69,7 +67,6 @@ public class AnnotationMetadataSourceProcessorImpl implements MetadataSourceProc
|
|||
this.bindingContext = new AnnotationBindingContextImpl( bindingContext );
|
||||
}
|
||||
|
||||
@Override
|
||||
public Iterable<TypeDescriptorSource> extractTypeDefinitionSources() {
|
||||
List<TypeDescriptorSource> typeDescriptorSources = new ArrayList<TypeDescriptorSource>();
|
||||
Collection<AnnotationInstance> annotations = JandexHelper.getAnnotations(
|
||||
|
@ -84,7 +81,6 @@ public class AnnotationMetadataSourceProcessorImpl implements MetadataSourceProc
|
|||
return typeDescriptorSources;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Iterable<FilterDefinitionSource> extractFilterDefinitionSources() {
|
||||
List<FilterDefinitionSource> filterDefinitionSources = new ArrayList<FilterDefinitionSource>();
|
||||
Collection<AnnotationInstance> annotations = JandexHelper.getAnnotations(
|
||||
|
@ -99,18 +95,15 @@ public class AnnotationMetadataSourceProcessorImpl implements MetadataSourceProc
|
|||
return filterDefinitionSources;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Iterable<IdentifierGeneratorSource> extractGlobalIdentifierGeneratorSources() {
|
||||
return IdGeneratorProcessor.extractGlobalIdentifierGeneratorSources( bindingContext );
|
||||
}
|
||||
|
||||
@Override
|
||||
public Collection<EntityHierarchySource> extractEntityHierarchies() {
|
||||
// need to order our annotated entities into an order we can process
|
||||
return EntityHierarchyBuilder.createEntityHierarchies( bindingContext );
|
||||
}
|
||||
|
||||
@Override
|
||||
public void processMappingDependentMetadata() {
|
||||
TableProcessor.bind( bindingContext );
|
||||
FetchProfileProcessor.bind( bindingContext );
|
|
@ -1,108 +0,0 @@
|
|||
/*
|
||||
* 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.internal.hbm;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import org.hibernate.metamodel.source.spi.ConstraintSource;
|
||||
|
||||
/**
|
||||
* @author Hardy Ferentschik
|
||||
*/
|
||||
class AbstractConstraintSource implements ConstraintSource {
|
||||
protected final String name;
|
||||
protected final String tableName;
|
||||
protected final List<String> columnNames = new ArrayList<String>();
|
||||
protected final List<String> orderings = new ArrayList<String>();
|
||||
|
||||
protected AbstractConstraintSource(String name, String tableName) {
|
||||
this.name = name;
|
||||
this.tableName = tableName;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String name() {
|
||||
return name;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getTableName() {
|
||||
return tableName;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> columnNames() {
|
||||
return columnNames;
|
||||
}
|
||||
|
||||
public void addColumnName( String columnName ) {
|
||||
columnNames.add( columnName );
|
||||
// TODO: Can HBM have orderings? For now, just add a null -- Binder expects columnNames and
|
||||
// orderings to be the same size. Find a better data representation...
|
||||
orderings.add( null );
|
||||
}
|
||||
|
||||
public List<String> orderings() {
|
||||
return orderings;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if ( this == o ) {
|
||||
return true;
|
||||
}
|
||||
if ( o == null || getClass() != o.getClass() ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
AbstractConstraintSource that = (AbstractConstraintSource) o;
|
||||
|
||||
if ( columnNames != null ? !columnNames.equals( that.columnNames ) : that.columnNames != null ) {
|
||||
return false;
|
||||
}
|
||||
if ( orderings != null ? !orderings.equals( that.orderings ) : that.orderings != null ) {
|
||||
return false;
|
||||
}
|
||||
if ( name != null ? !name.equals( that.name ) : that.name != null ) {
|
||||
return false;
|
||||
}
|
||||
if ( tableName != null ? !tableName.equals( that.tableName ) : that.tableName != null ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
int result = name != null ? name.hashCode() : 0;
|
||||
result = 31 * result + ( tableName != null ? tableName.hashCode() : 0 );
|
||||
result = 31 * result + ( columnNames != null ? columnNames.hashCode() : 0 );
|
||||
result = 31 * result + ( orderings != null ? orderings.hashCode() : 0 );
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1,129 +0,0 @@
|
|||
/*
|
||||
* Hibernate, Relational Persistence for Idiomatic Java
|
||||
*
|
||||
* Copyright (c) 2014, 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.internal.hbm;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbAnyElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbArrayElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbBagElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbComponentElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbDynamicComponentElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbKeyManyToOneElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbKeyPropertyElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbListElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbManyToOneElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbMapElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbNestedCompositeElementElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbOneToOneElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbPrimitiveArrayElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbPropertiesElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbPropertyElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbSetElement;
|
||||
|
||||
/**
|
||||
* @author Steve Ebersole
|
||||
*/
|
||||
public abstract class AbstractEmbeddableJaxbSource implements EmbeddableJaxbSource {
|
||||
@Override
|
||||
public List<JaxbKeyPropertyElement> getKeyPropertyElementList() {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<JaxbKeyManyToOneElement> getKeyManyToOneElementList() {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<JaxbPropertyElement> getPropertyElementList() {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<JaxbManyToOneElement> getManyToOneElementList() {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<JaxbOneToOneElement> getOneToOneElementList() {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<JaxbComponentElement> getComponentElementList() {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<JaxbNestedCompositeElementElement> getNestedCompositeElementList() {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<JaxbDynamicComponentElement> getDynamicComponentElementList() {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<JaxbPropertiesElement> getPropertiesElementList() {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<JaxbAnyElement> getAnyElementList() {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<JaxbMapElement> getMapElementList() {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<JaxbSetElement> getSetElementList() {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<JaxbListElement> getListElementList() {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<JaxbBagElement> getBagElementList() {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<JaxbArrayElement> getArrayElementList() {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<JaxbPrimitiveArrayElement> getPrimitiveArrayElementList() {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
}
|
|
@ -1,150 +0,0 @@
|
|||
/*
|
||||
* Hibernate, Relational Persistence for Idiomatic Java
|
||||
*
|
||||
* Copyright (c) 2012, Red Hat Inc. or third-party contributors as
|
||||
* indicated by the @author tags or express copyright attribution
|
||||
* statements applied by the authors. All third-party contributions are
|
||||
* distributed under license by Red Hat Inc.
|
||||
*
|
||||
* This copyrighted material is made available to anyone wishing to use, modify,
|
||||
* copy, or redistribute it subject to the terms and conditions of the GNU
|
||||
* Lesser General Public License, as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
|
||||
* for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this distribution; if not, write to:
|
||||
* Free Software Foundation, Inc.
|
||||
* 51 Franklin Street, Fifth Floor
|
||||
* Boston, MA 02110-1301 USA
|
||||
*/
|
||||
package org.hibernate.metamodel.source.internal.hbm;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
import org.hibernate.mapping.PropertyGeneration;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.ComponentSourceElement;
|
||||
import org.hibernate.metamodel.source.spi.AttributeSourceContainer;
|
||||
import org.hibernate.metamodel.source.spi.EmbeddableSource;
|
||||
import org.hibernate.metamodel.source.spi.EmbeddedAttributeSource;
|
||||
import org.hibernate.metamodel.source.spi.HibernateTypeSource;
|
||||
import org.hibernate.metamodel.source.spi.RelationalValueSource;
|
||||
import org.hibernate.metamodel.source.spi.ToolingHintSource;
|
||||
import org.hibernate.metamodel.spi.AttributePath;
|
||||
import org.hibernate.metamodel.spi.AttributeRole;
|
||||
import org.hibernate.metamodel.spi.NaturalIdMutability;
|
||||
import org.hibernate.metamodel.spi.SingularAttributeNature;
|
||||
|
||||
/**
|
||||
* Common bas class for <component/> and <composite-id/> mappings.
|
||||
*
|
||||
* @author Steve Ebersole
|
||||
*/
|
||||
public abstract class AbstractEmbeddedAttributeSourceImpl
|
||||
extends AbstractHbmSourceNode
|
||||
implements EmbeddedAttributeSource {
|
||||
|
||||
private final ComponentSourceElement jaxbComponentSourceElement;
|
||||
private final EmbeddableSourceImpl embeddableSource;
|
||||
|
||||
protected AbstractEmbeddedAttributeSourceImpl(
|
||||
MappingDocument sourceMappingDocument,
|
||||
AttributeSourceContainer parentContainer,
|
||||
AttributeRole attributeRoleBase,
|
||||
AttributePath attributePathBase,
|
||||
ComponentSourceElement jaxbComponentSourceElement,
|
||||
EmbeddableJaxbSource embeddableJaxbSource,
|
||||
NaturalIdMutability naturalIdMutability,
|
||||
String logicalTableName) {
|
||||
super( sourceMappingDocument );
|
||||
this.jaxbComponentSourceElement = jaxbComponentSourceElement;
|
||||
this.embeddableSource = new EmbeddableSourceImpl(
|
||||
sourceMappingDocument,
|
||||
attributeRoleBase,
|
||||
attributePathBase,
|
||||
embeddableJaxbSource,
|
||||
logicalTableName,
|
||||
naturalIdMutability
|
||||
);
|
||||
}
|
||||
|
||||
protected ComponentSourceElement jaxbComponentSourceElement() {
|
||||
return jaxbComponentSourceElement;
|
||||
}
|
||||
|
||||
@Override
|
||||
public EmbeddableSource getEmbeddableSource() {
|
||||
return embeddableSource;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return jaxbComponentSourceElement.getName();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isSingular() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isVirtualAttribute() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public SingularAttributeNature getSingularAttributeNature() {
|
||||
return SingularAttributeNature.COMPOSITE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public HibernateTypeSource getTypeInformation() {
|
||||
// <component/> does not support type information.
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getPropertyAccessorName() {
|
||||
return jaxbComponentSourceElement.getAccess();
|
||||
}
|
||||
|
||||
@Override
|
||||
public NaturalIdMutability getNaturalIdMutability() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Collection<? extends ToolingHintSource> getToolingHintSources() {
|
||||
return jaxbComponentSourceElement.getMeta();
|
||||
}
|
||||
|
||||
@Override
|
||||
public PropertyGeneration getGeneration() {
|
||||
// todo : is this correct here?
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean areValuesNullableByDefault() {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
// relational value source info comes from the individual sub-attributes
|
||||
|
||||
@Override
|
||||
public String getContainingTableName() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<RelationalValueSource> relationalValueSources() {
|
||||
// none, they are defined on the simple sub-attributes
|
||||
return null;
|
||||
}
|
||||
}
|
|
@ -1,638 +0,0 @@
|
|||
/*
|
||||
* 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.internal.hbm;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import org.hibernate.EntityMode;
|
||||
import org.hibernate.TruthValue;
|
||||
import org.hibernate.internal.util.StringHelper;
|
||||
import org.hibernate.internal.util.collections.CollectionHelper;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.EntityElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbAnyElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbArrayElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbBagElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbClassElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbColumnElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbComponentElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbDynamicComponentElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbFilterElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbIdbagElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbJoinElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbListElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbManyToOneElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbMapElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbOneToOneElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbPropertyElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbSetElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbTuplizerElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JoinElementSource;
|
||||
import org.hibernate.metamodel.source.spi.AttributeSource;
|
||||
import org.hibernate.metamodel.source.spi.ConstraintSource;
|
||||
import org.hibernate.metamodel.source.spi.EntityHierarchySource;
|
||||
import org.hibernate.metamodel.source.spi.EntitySource;
|
||||
import org.hibernate.metamodel.source.spi.FilterSource;
|
||||
import org.hibernate.metamodel.source.spi.IdentifiableTypeSource;
|
||||
import org.hibernate.metamodel.source.spi.JpaCallbackSource;
|
||||
import org.hibernate.metamodel.source.spi.SecondaryTableSource;
|
||||
import org.hibernate.metamodel.source.spi.SubclassEntitySource;
|
||||
import org.hibernate.metamodel.source.spi.ToolingHintSource;
|
||||
import org.hibernate.metamodel.spi.AttributePath;
|
||||
import org.hibernate.metamodel.spi.AttributeRole;
|
||||
import org.hibernate.metamodel.spi.LocalBindingContext;
|
||||
import org.hibernate.metamodel.spi.NaturalIdMutability;
|
||||
import org.hibernate.metamodel.spi.binding.CustomSQL;
|
||||
import org.hibernate.xml.spi.Origin;
|
||||
|
||||
/**
|
||||
* @author Steve Ebersole
|
||||
* @author Hardy Ferentschik
|
||||
* @author Brett Meyer
|
||||
*/
|
||||
public abstract class AbstractEntitySourceImpl
|
||||
extends AbstractHbmSourceNode
|
||||
implements EntitySource, Helper.InLineViewNameInferrer {
|
||||
|
||||
private final EntityElement entityElement;
|
||||
private final String className;
|
||||
private final String entityName;
|
||||
private final String jpaEntityName;
|
||||
|
||||
private final AttributeRole attributeRoleBase;
|
||||
private final AttributePath attributePathBase;
|
||||
|
||||
private List<IdentifiableTypeSource> subclassEntitySources = new ArrayList<IdentifiableTypeSource>();
|
||||
|
||||
private int inLineViewCount = 0;
|
||||
|
||||
// logically final, but built during 'afterInstantiation' callback
|
||||
private List<AttributeSource> attributeSources;
|
||||
private Set<SecondaryTableSource> secondaryTableSources;
|
||||
private final FilterSource[] filterSources;
|
||||
|
||||
private Map<String, ConstraintSource> constraintMap = new HashMap<String, ConstraintSource>();
|
||||
|
||||
protected AbstractEntitySourceImpl(MappingDocument sourceMappingDocument, EntityElement entityElement) {
|
||||
super( sourceMappingDocument );
|
||||
this.entityElement = entityElement;
|
||||
|
||||
this.className = bindingContext().qualifyClassName( entityElement.getName() );
|
||||
if ( StringHelper.isNotEmpty( entityElement.getEntityName() ) ) {
|
||||
this.entityName = entityElement.getEntityName();
|
||||
this.jpaEntityName = entityElement.getEntityName();
|
||||
}
|
||||
else {
|
||||
this.entityName = className;
|
||||
this.jpaEntityName = StringHelper.unqualify( className );
|
||||
}
|
||||
|
||||
this.attributePathBase = new AttributePath();
|
||||
this.attributeRoleBase = new AttributeRole( entityName );
|
||||
|
||||
this.filterSources = buildFilterSources();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getTypeName() {
|
||||
return StringHelper.isNotEmpty( className ) ? className : entityName;
|
||||
}
|
||||
|
||||
@Override
|
||||
public AttributePath getAttributePathBase() {
|
||||
return attributePathBase;
|
||||
}
|
||||
|
||||
@Override
|
||||
public AttributeRole getAttributeRoleBase() {
|
||||
return attributeRoleBase;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Collection<IdentifiableTypeSource> getSubTypes() {
|
||||
return subclassEntitySources;
|
||||
}
|
||||
|
||||
private FilterSource[] buildFilterSources() {
|
||||
//todo for now, i think all EntityElement should support this.
|
||||
if ( JaxbClassElement.class.isInstance( entityElement() ) ) {
|
||||
JaxbClassElement jaxbClassElement = JaxbClassElement.class.cast( entityElement() );
|
||||
final int size = jaxbClassElement.getFilter().size();
|
||||
if ( size == 0 ) {
|
||||
return null;
|
||||
}
|
||||
|
||||
FilterSource[] results = new FilterSource[size];
|
||||
for ( int i = 0; i < size; i++ ) {
|
||||
JaxbFilterElement element = jaxbClassElement.getFilter().get( i );
|
||||
results[i] = new FilterSourceImpl( sourceMappingDocument(), element );
|
||||
}
|
||||
return results;
|
||||
}
|
||||
else {
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public FilterSource[] getFilterSources() {
|
||||
return filterSources;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String inferInLineViewName() {
|
||||
return entityName + '#' + (++inLineViewCount);
|
||||
}
|
||||
|
||||
protected void afterInstantiation() {
|
||||
this.attributeSources = buildAttributeSources();
|
||||
this.secondaryTableSources = buildSecondaryTables();
|
||||
}
|
||||
|
||||
protected List<AttributeSource> buildAttributeSources() {
|
||||
List<AttributeSource> attributeSources = new ArrayList<AttributeSource>();
|
||||
buildAttributeSources( attributeSources );
|
||||
return attributeSources;
|
||||
}
|
||||
|
||||
protected List<AttributeSource> buildAttributeSources(List<AttributeSource> attributeSources) {
|
||||
return buildAttributeSources( entityElement, attributeSources, null, NaturalIdMutability.NOT_NATURAL_ID );
|
||||
}
|
||||
|
||||
protected List<AttributeSource> buildAttributeSources(
|
||||
EntityElement element,
|
||||
List<AttributeSource> attributeSources,
|
||||
String logicTalbeName,
|
||||
NaturalIdMutability naturalIdMutability){
|
||||
processPropertyAttributes( attributeSources, element.getProperty(), logicTalbeName, naturalIdMutability );
|
||||
processComponentAttributes(
|
||||
attributeSources,
|
||||
element.getComponent(),
|
||||
logicTalbeName,
|
||||
naturalIdMutability
|
||||
);
|
||||
processDynamicComponentAttributes(
|
||||
attributeSources,
|
||||
element.getDynamicComponent(),
|
||||
logicTalbeName,
|
||||
naturalIdMutability
|
||||
);
|
||||
processManyToOneAttributes(
|
||||
attributeSources,
|
||||
element.getManyToOne(),
|
||||
logicTalbeName,
|
||||
naturalIdMutability
|
||||
);
|
||||
processOneToOneAttributes(
|
||||
attributeSources,
|
||||
element.getOneToOne(),
|
||||
logicTalbeName,
|
||||
naturalIdMutability
|
||||
);
|
||||
processAnyAttributes(
|
||||
attributeSources,
|
||||
element.getAny(),
|
||||
logicTalbeName,
|
||||
naturalIdMutability
|
||||
);
|
||||
processMapAttributes( attributeSources, element.getMap() );
|
||||
processListAttributes( attributeSources, element.getList() );
|
||||
processArrayAttributes( attributeSources, element.getArray() );
|
||||
processSetAttributes( attributeSources, element.getSet() );
|
||||
processIdBagAttributes( attributeSources, element.getIdbag() );
|
||||
processBagAttributes( attributeSources, element.getBag() );
|
||||
return attributeSources;
|
||||
}
|
||||
|
||||
protected void processPropertyAttributes(
|
||||
List<AttributeSource> results,
|
||||
List<JaxbPropertyElement> propertyElements,
|
||||
String logicalTableName,
|
||||
NaturalIdMutability naturalIdMutability) {
|
||||
for ( JaxbPropertyElement element : propertyElements ) {
|
||||
results.add(
|
||||
new PropertyAttributeSourceImpl(
|
||||
sourceMappingDocument(),
|
||||
this,
|
||||
element,
|
||||
logicalTableName,
|
||||
naturalIdMutability
|
||||
)
|
||||
);
|
||||
|
||||
// TODO: Not sure this is the right place to do this. Can index constraints be defined by anything other
|
||||
// than just a property? Split off into its own process method?
|
||||
for ( JaxbColumnElement column : element.getColumn() ) {
|
||||
// An index constraint can happen on the column element or the surrounding property element.
|
||||
if ( !StringHelper.isEmpty( column.getIndex() ) ) {
|
||||
addColumnToIndexConstraint( column.getIndex(), logicalTableName, column.getName() );
|
||||
}
|
||||
if ( !StringHelper.isEmpty( element.getIndex() ) ) {
|
||||
addColumnToIndexConstraint( element.getIndex(), logicalTableName, column.getName() );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void addColumnToIndexConstraint(String constraintName, String logicalTableName, String columnName) {
|
||||
if ( !constraintMap.containsKey( constraintName ) ) {
|
||||
constraintMap.put( constraintName, new IndexConstraintSourceImpl( constraintName, logicalTableName ) );
|
||||
}
|
||||
( (AbstractConstraintSource) constraintMap.get( constraintName ) ).addColumnName( columnName );
|
||||
}
|
||||
|
||||
protected void processComponentAttributes(List<AttributeSource> results,
|
||||
List<JaxbComponentElement> elements,
|
||||
String logicalTableName,
|
||||
NaturalIdMutability naturalIdMutability) {
|
||||
for ( JaxbComponentElement element : elements ) {
|
||||
results.add(
|
||||
new EmbeddedAttributeSourceImpl(
|
||||
sourceMappingDocument(),
|
||||
this,
|
||||
element,
|
||||
naturalIdMutability,
|
||||
logicalTableName
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
protected void processDynamicComponentAttributes(List<AttributeSource> results,
|
||||
List<JaxbDynamicComponentElement> elements,
|
||||
String logicalTableName,
|
||||
NaturalIdMutability naturalIdMutability) {
|
||||
// todo : implement
|
||||
}
|
||||
|
||||
protected void processManyToOneAttributes(List<AttributeSource> results,
|
||||
List<JaxbManyToOneElement> elements,
|
||||
String logicalTableName,
|
||||
NaturalIdMutability naturalIdMutability) {
|
||||
for ( JaxbManyToOneElement element : elements ) {
|
||||
results.add(
|
||||
new ManyToOneAttributeSourceImpl(
|
||||
sourceMappingDocument(),
|
||||
this,
|
||||
element,
|
||||
logicalTableName,
|
||||
naturalIdMutability
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
protected void processOneToOneAttributes(List<AttributeSource> results,
|
||||
List<JaxbOneToOneElement> elements,
|
||||
String logicalTableName,
|
||||
NaturalIdMutability naturalIdMutability) {
|
||||
for ( JaxbOneToOneElement element : elements ) {
|
||||
results.add(
|
||||
new OneToOneAttributeSourceImpl(
|
||||
sourceMappingDocument(),
|
||||
this,
|
||||
element,
|
||||
logicalTableName,
|
||||
naturalIdMutability
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
protected void processAnyAttributes(List<AttributeSource> results,
|
||||
List<JaxbAnyElement> elements,
|
||||
String logicalTableName,
|
||||
NaturalIdMutability naturalIdMutability) {
|
||||
// todo : implement
|
||||
}
|
||||
|
||||
protected void processMapAttributes(List<AttributeSource> results,
|
||||
List<JaxbMapElement> propertyElements){
|
||||
for ( JaxbMapElement element : propertyElements ) {
|
||||
results.add(
|
||||
new MapSourceImpl(
|
||||
sourceMappingDocument(),
|
||||
element, this
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
protected void processArrayAttributes(List<AttributeSource> results,
|
||||
List<JaxbArrayElement> propertyElements){
|
||||
for ( JaxbArrayElement element : propertyElements ) {
|
||||
results.add(
|
||||
new ArraySourceImpl(
|
||||
sourceMappingDocument(),
|
||||
element, this
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
protected void processListAttributes(List<AttributeSource> results,
|
||||
List<JaxbListElement> propertyElements){
|
||||
for ( JaxbListElement element : propertyElements ) {
|
||||
results.add(
|
||||
new ListSourceImpl(
|
||||
sourceMappingDocument(),
|
||||
element, this
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
protected void processSetAttributes(List<AttributeSource> results,
|
||||
List<JaxbSetElement> propertyElements){
|
||||
for ( JaxbSetElement element : propertyElements ) {
|
||||
results.add(
|
||||
new SetSourceImpl(
|
||||
sourceMappingDocument(),
|
||||
element,
|
||||
this
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
protected void processIdBagAttributes(
|
||||
List<AttributeSource> results,
|
||||
List<JaxbIdbagElement> elements){
|
||||
for ( JaxbIdbagElement element : elements ) {
|
||||
results.add(
|
||||
new IdBagSourceImpl(
|
||||
sourceMappingDocument(),
|
||||
element,
|
||||
this
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
protected void processBagAttributes(
|
||||
List<AttributeSource> results,
|
||||
List<JaxbBagElement> propertyElements) {
|
||||
for ( JaxbBagElement element : propertyElements ) {
|
||||
results.add(
|
||||
new BagSourceImpl(
|
||||
sourceMappingDocument(),
|
||||
element,
|
||||
this
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private Set<SecondaryTableSource> buildSecondaryTables() {
|
||||
if ( ! JoinElementSource.class.isInstance( entityElement ) ) {
|
||||
return Collections.emptySet();
|
||||
}
|
||||
|
||||
final Set<SecondaryTableSource> secondaryTableSources = new HashSet<SecondaryTableSource>();
|
||||
for ( JaxbJoinElement joinElement : ( (JoinElementSource) entityElement ).getJoin() ) {
|
||||
final SecondaryTableSourceImpl secondaryTableSource = new SecondaryTableSourceImpl(
|
||||
sourceMappingDocument(),
|
||||
joinElement,
|
||||
this
|
||||
);
|
||||
secondaryTableSources.add( secondaryTableSource );
|
||||
|
||||
final String logicalTableName = secondaryTableSource.getLogicalTableNameForContainedColumns();
|
||||
final NaturalIdMutability naturalIdMutability = NaturalIdMutability.NOT_NATURAL_ID;
|
||||
processAnyAttributes(
|
||||
attributeSources,
|
||||
joinElement.getAny(),
|
||||
logicalTableName,
|
||||
naturalIdMutability
|
||||
);
|
||||
processComponentAttributes(
|
||||
attributeSources,
|
||||
joinElement.getComponent(),
|
||||
logicalTableName,
|
||||
naturalIdMutability
|
||||
);
|
||||
processDynamicComponentAttributes(
|
||||
attributeSources,
|
||||
joinElement.getDynamicComponent(),
|
||||
logicalTableName,
|
||||
naturalIdMutability
|
||||
);
|
||||
processManyToOneAttributes(
|
||||
attributeSources,
|
||||
joinElement.getManyToOne(),
|
||||
logicalTableName,
|
||||
naturalIdMutability
|
||||
);
|
||||
processPropertyAttributes(
|
||||
attributeSources,
|
||||
joinElement.getProperty(),
|
||||
logicalTableName,
|
||||
naturalIdMutability
|
||||
);
|
||||
}
|
||||
return secondaryTableSources;
|
||||
}
|
||||
|
||||
protected EntityElement entityElement() {
|
||||
return entityElement;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Origin getOrigin() {
|
||||
return origin();
|
||||
}
|
||||
|
||||
@Override
|
||||
public LocalBindingContext getLocalBindingContext() {
|
||||
return bindingContext();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getEntityName() {
|
||||
return entityName;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getClassName() {
|
||||
return className;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getJpaEntityName() {
|
||||
return jpaEntityName;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isAbstract() {
|
||||
return entityElement().isAbstract();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isLazy() {
|
||||
if(entityElement.isLazy()==null){
|
||||
return getLocalBindingContext().getMappingDefaults().areAssociationsLazy();
|
||||
}
|
||||
return entityElement().isLazy();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getProxy() {
|
||||
return entityElement.getProxy();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getBatchSize() {
|
||||
return entityElement.getBatchSize();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isDynamicInsert() {
|
||||
return entityElement.isDynamicInsert();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isDynamicUpdate() {
|
||||
return entityElement.isDynamicUpdate();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isSelectBeforeUpdate() {
|
||||
return entityElement.isSelectBeforeUpdate();
|
||||
}
|
||||
|
||||
protected EntityMode determineEntityMode() {
|
||||
return StringHelper.isNotEmpty( getClassName() ) ? EntityMode.POJO : EntityMode.MAP;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getCustomTuplizerClassName() {
|
||||
if ( entityElement.getTuplizer() == null ) {
|
||||
return null;
|
||||
}
|
||||
final EntityMode entityMode = determineEntityMode();
|
||||
for ( JaxbTuplizerElement tuplizerElement : entityElement.getTuplizer() ) {
|
||||
if ( entityMode == EntityMode.parse( tuplizerElement.getEntityMode().value() ) ) {
|
||||
return tuplizerElement.getClazz();
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getCustomPersisterClassName() {
|
||||
return getLocalBindingContext().qualifyClassName( entityElement.getPersister() );
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getCustomLoaderName() {
|
||||
return entityElement.getLoader() != null ? entityElement.getLoader().getQueryRef() : null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public CustomSQL getCustomSqlInsert() {
|
||||
return Helper.buildCustomSql( entityElement.getSqlInsert() );
|
||||
}
|
||||
|
||||
@Override
|
||||
public CustomSQL getCustomSqlUpdate() {
|
||||
return Helper.buildCustomSql( entityElement.getSqlUpdate() );
|
||||
}
|
||||
|
||||
@Override
|
||||
public CustomSQL getCustomSqlDelete() {
|
||||
return Helper.buildCustomSql( entityElement.getSqlDelete() );
|
||||
}
|
||||
|
||||
@Override
|
||||
public String[] getSynchronizedTableNames() {
|
||||
if ( CollectionHelper.isEmpty( entityElement.getSynchronize() ) ) {
|
||||
return StringHelper.EMPTY_STRINGS;
|
||||
}
|
||||
else {
|
||||
final int size = entityElement.getSynchronize().size();
|
||||
final String[] synchronizedTableNames = new String[size];
|
||||
for ( int i = 0; i < size; i++ ) {
|
||||
synchronizedTableNames[i] = entityElement.getSynchronize().get( i ).getTable();
|
||||
}
|
||||
return synchronizedTableNames;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public java.util.Collection<? extends ToolingHintSource> getToolingHintSources() {
|
||||
return entityElement.getMeta();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<AttributeSource> attributeSources() {
|
||||
return attributeSources;
|
||||
}
|
||||
|
||||
private EntityHierarchySourceImpl entityHierarchy;
|
||||
|
||||
public void injectHierarchy(EntityHierarchySourceImpl entityHierarchy) {
|
||||
this.entityHierarchy = entityHierarchy;
|
||||
}
|
||||
|
||||
@Override
|
||||
public EntityHierarchySource getHierarchy() {
|
||||
return entityHierarchy;
|
||||
}
|
||||
|
||||
void add(SubclassEntitySource subclassEntitySource) {
|
||||
add( (SubclassEntitySourceImpl) subclassEntitySource );
|
||||
}
|
||||
|
||||
void add(SubclassEntitySourceImpl subclassEntitySource) {
|
||||
subclassEntitySource.injectHierarchy( entityHierarchy );
|
||||
entityHierarchy.processSubclass( subclassEntitySource );
|
||||
subclassEntitySources.add( subclassEntitySource );
|
||||
}
|
||||
|
||||
@Override
|
||||
public Iterable<ConstraintSource> getConstraints() {
|
||||
return constraintMap.values();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<SecondaryTableSource> getSecondaryTables() {
|
||||
return secondaryTableSources;
|
||||
}
|
||||
|
||||
@Override
|
||||
@SuppressWarnings( {"unchecked"})
|
||||
public List<JpaCallbackSource> getJpaCallbackClasses() {
|
||||
return Collections.EMPTY_LIST;
|
||||
}
|
||||
|
||||
@Override
|
||||
public TruthValue quoteIdentifiersLocalToEntity() {
|
||||
// HBM does not allow for this
|
||||
return TruthValue.UNKNOWN;
|
||||
}
|
||||
}
|
|
@ -1,75 +0,0 @@
|
|||
/*
|
||||
* Hibernate, Relational Persistence for Idiomatic Java
|
||||
*
|
||||
* Copyright (c) 2012, Red Hat Inc. or third-party contributors as
|
||||
* indicated by the @author tags or express copyright attribution
|
||||
* statements applied by the authors. All third-party contributions are
|
||||
* distributed under license by Red Hat Inc.
|
||||
*
|
||||
* This copyrighted material is made available to anyone wishing to use, modify,
|
||||
* copy, or redistribute it subject to the terms and conditions of the GNU
|
||||
* Lesser General Public License, as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
|
||||
* for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this distribution; if not, write to:
|
||||
* Free Software Foundation, Inc.
|
||||
* 51 Franklin Street, Fifth Floor
|
||||
* Boston, MA 02110-1301 USA
|
||||
*/
|
||||
package org.hibernate.metamodel.source.internal.hbm;
|
||||
|
||||
import org.hibernate.metamodel.reflite.spi.JavaTypeDescriptor;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbHibernateMapping;
|
||||
import org.hibernate.metamodel.source.spi.MappingException;
|
||||
import org.hibernate.xml.spi.BindResult;
|
||||
import org.hibernate.xml.spi.Origin;
|
||||
|
||||
/**
|
||||
* Base class for any and all source objects coming from {@code hbm.xml} parsing. Defines standard access
|
||||
* back to the {@link MappingDocument} object and the services it provides (namely access to
|
||||
* {@link HbmBindingContext}).
|
||||
*
|
||||
* @author Steve Ebersole
|
||||
*/
|
||||
public abstract class AbstractHbmSourceNode {
|
||||
private final MappingDocument sourceMappingDocument;
|
||||
|
||||
protected AbstractHbmSourceNode(MappingDocument sourceMappingDocument) {
|
||||
this.sourceMappingDocument = sourceMappingDocument;
|
||||
}
|
||||
|
||||
protected MappingDocument sourceMappingDocument() {
|
||||
return sourceMappingDocument;
|
||||
}
|
||||
|
||||
protected HbmBindingContext bindingContext() {
|
||||
return sourceMappingDocument().getMappingLocalBindingContext();
|
||||
}
|
||||
|
||||
protected Origin origin() {
|
||||
return sourceMappingDocument().getOrigin();
|
||||
}
|
||||
|
||||
protected BindResult<JaxbHibernateMapping> mappingRoot() {
|
||||
return sourceMappingDocument().getJaxbRoot();
|
||||
}
|
||||
|
||||
protected JavaTypeDescriptor typeDescriptor(String className) {
|
||||
return className == null ?
|
||||
null :
|
||||
bindingContext().typeDescriptor( className );
|
||||
}
|
||||
|
||||
protected MappingException makeMappingException(String message) {
|
||||
return bindingContext().makeMappingException( message );
|
||||
}
|
||||
|
||||
protected MappingException makeMappingException(String message, Exception cause) {
|
||||
return bindingContext().makeMappingException( message, cause );
|
||||
}
|
||||
}
|
|
@ -1,72 +0,0 @@
|
|||
/**
|
||||
* Hibernate, Relational Persistence for Idiomatic Java
|
||||
*
|
||||
* Copyright (c) 2013, 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.internal.hbm;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
import org.hibernate.metamodel.source.spi.AssociationSource;
|
||||
import org.hibernate.metamodel.source.spi.AttributeSource;
|
||||
import org.hibernate.metamodel.source.spi.MappedByAssociationSource;
|
||||
import org.hibernate.metamodel.source.spi.PluralAttributeSource;
|
||||
|
||||
/**
|
||||
+ * @author Gail Badner
|
||||
+ */
|
||||
public abstract class AbstractPluralAssociationElementSourceImpl
|
||||
extends AbstractHbmSourceNode implements AssociationSource {
|
||||
|
||||
private final PluralAttributeSource pluralAttributeSource;
|
||||
private final Set<MappedByAssociationSource> ownedAssociationSources = new HashSet<MappedByAssociationSource>( );
|
||||
|
||||
public AbstractPluralAssociationElementSourceImpl(
|
||||
MappingDocument mappingDocument,
|
||||
PluralAttributeSource pluralAttributeSource) {
|
||||
super( mappingDocument );
|
||||
this.pluralAttributeSource = pluralAttributeSource;
|
||||
}
|
||||
|
||||
@Override
|
||||
public AttributeSource getAttributeSource() {
|
||||
return pluralAttributeSource;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<MappedByAssociationSource> getOwnedAssociationSources() {
|
||||
return ownedAssociationSources;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addMappedByAssociationSource(MappedByAssociationSource attributeSource) {
|
||||
if ( attributeSource == null ) {
|
||||
throw new IllegalArgumentException( "attributeSource must be non-null." );
|
||||
}
|
||||
ownedAssociationSources.add( attributeSource );
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isMappedBy() {
|
||||
return false;
|
||||
}
|
||||
}
|
|
@ -1,438 +0,0 @@
|
|||
/*
|
||||
* Hibernate, Relational Persistence for Idiomatic Java
|
||||
*
|
||||
* Copyright (c) 2012, Red Hat Inc. or third-party contributors as
|
||||
* indicated by the @author tags or express copyright attribution
|
||||
* statements applied by the authors. All third-party contributions are
|
||||
* distributed under license by Red Hat Inc.
|
||||
*
|
||||
* This copyrighted material is made available to anyone wishing to use, modify,
|
||||
* copy, or redistribute it subject to the terms and conditions of the GNU
|
||||
* Lesser General Public License, as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
|
||||
* for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this distribution; if not, write to:
|
||||
* Free Software Foundation, Inc.
|
||||
* 51 Franklin Street, Fifth Floor
|
||||
* Boston, MA 02110-1301 USA
|
||||
*/
|
||||
package org.hibernate.metamodel.source.internal.hbm;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.Map;
|
||||
|
||||
import org.hibernate.AssertionFailure;
|
||||
import org.hibernate.cfg.NotYetImplementedException;
|
||||
import org.hibernate.engine.FetchStyle;
|
||||
import org.hibernate.engine.FetchTiming;
|
||||
import org.hibernate.metamodel.reflite.spi.JavaTypeDescriptor;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbFilterElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.PluralAttributeElement;
|
||||
import org.hibernate.metamodel.source.spi.AttributeSourceContainer;
|
||||
import org.hibernate.metamodel.source.spi.AttributeSourceResolutionContext;
|
||||
import org.hibernate.metamodel.source.spi.CollectionIdSource;
|
||||
import org.hibernate.metamodel.source.spi.FilterSource;
|
||||
import org.hibernate.metamodel.source.spi.HibernateTypeSource;
|
||||
import org.hibernate.metamodel.source.spi.MappingException;
|
||||
import org.hibernate.metamodel.source.spi.PluralAttributeElementSource;
|
||||
import org.hibernate.metamodel.source.spi.PluralAttributeKeySource;
|
||||
import org.hibernate.metamodel.source.spi.PluralAttributeSource;
|
||||
import org.hibernate.metamodel.source.spi.TableSpecificationSource;
|
||||
import org.hibernate.metamodel.source.spi.ToolingHintSource;
|
||||
import org.hibernate.metamodel.spi.AttributePath;
|
||||
import org.hibernate.metamodel.spi.AttributeRole;
|
||||
import org.hibernate.metamodel.spi.binding.Caching;
|
||||
import org.hibernate.metamodel.spi.binding.CustomSQL;
|
||||
|
||||
/**
|
||||
* @author Steve Ebersole
|
||||
* @author Brett Meyer
|
||||
*/
|
||||
public abstract class AbstractPluralAttributeSourceImpl
|
||||
extends AbstractHbmSourceNode
|
||||
implements PluralAttributeSource, Helper.InLineViewNameInferrer {
|
||||
private final PluralAttributeElement pluralAttributeElement;
|
||||
private final AttributeSourceContainer container;
|
||||
|
||||
private final AttributeRole attributeRole;
|
||||
private final AttributePath attributePath;
|
||||
|
||||
private final HibernateTypeSource typeInformation;
|
||||
|
||||
private final PluralAttributeKeySource keySource;
|
||||
private final PluralAttributeElementSource elementSource;
|
||||
private final Caching caching;
|
||||
private final FilterSource[] filterSources;
|
||||
|
||||
private JavaTypeDescriptor elementTypeDescriptor;
|
||||
|
||||
protected AbstractPluralAttributeSourceImpl(
|
||||
MappingDocument sourceMappingDocument,
|
||||
final PluralAttributeElement pluralAttributeElement,
|
||||
AttributeSourceContainer container) {
|
||||
super( sourceMappingDocument );
|
||||
this.pluralAttributeElement = pluralAttributeElement;
|
||||
this.container = container;
|
||||
|
||||
this.attributeRole = container.getAttributeRoleBase().append( pluralAttributeElement.getName() );
|
||||
this.attributePath = container.getAttributePathBase().append( pluralAttributeElement.getName() );
|
||||
|
||||
this.keySource = new PluralAttributeKeySourceImpl(
|
||||
sourceMappingDocument(),
|
||||
pluralAttributeElement.getKey(),
|
||||
container
|
||||
);
|
||||
this.elementSource = interpretElementType();
|
||||
|
||||
this.caching = Helper.createCaching( pluralAttributeElement.getCache() );
|
||||
|
||||
this.typeInformation = new HibernateTypeSourceImpl( pluralAttributeElement.getCollectionType() );
|
||||
this.filterSources = buildFilterSources();
|
||||
}
|
||||
|
||||
private FilterSource[] buildFilterSources() {
|
||||
final int size = pluralAttributeElement.getFilter().size();
|
||||
if ( size == 0 ) {
|
||||
return null;
|
||||
}
|
||||
|
||||
FilterSource[] results = new FilterSource[size];
|
||||
for ( int i = 0; i < size; i++ ) {
|
||||
JaxbFilterElement element = pluralAttributeElement.getFilter().get( i );
|
||||
results[i] = new FilterSourceImpl( sourceMappingDocument(), element );
|
||||
}
|
||||
return results;
|
||||
|
||||
}
|
||||
|
||||
private PluralAttributeElementSource interpretElementType() {
|
||||
if ( pluralAttributeElement.getElement() != null ) {
|
||||
// TODO: Is elementClassReference even needed in this context?
|
||||
// If so, getType is currently null.
|
||||
// elementClassReference = makeClassReference(pluralAttributeElement
|
||||
// .getElement().getType().getName());
|
||||
return new PluralAttributeElementSourceBasicImpl(
|
||||
sourceMappingDocument(),
|
||||
pluralAttributeElement.getElement()
|
||||
);
|
||||
}
|
||||
else if ( pluralAttributeElement.getCompositeElement() != null ) {
|
||||
elementTypeDescriptor = typeDescriptor(
|
||||
pluralAttributeElement
|
||||
.getCompositeElement().getClazz()
|
||||
);
|
||||
return new PluralAttributeElementSourceEmbeddedImpl(
|
||||
sourceMappingDocument(),
|
||||
this,
|
||||
pluralAttributeElement.getCompositeElement(),
|
||||
pluralAttributeElement.getCascade()
|
||||
);
|
||||
}
|
||||
else if ( pluralAttributeElement.getOneToMany() != null ) {
|
||||
elementTypeDescriptor = typeDescriptor(
|
||||
pluralAttributeElement
|
||||
.getOneToMany().getClazz()
|
||||
);
|
||||
return new PluralAttributeElementSourceOneToManyImpl(
|
||||
sourceMappingDocument(),
|
||||
this,
|
||||
pluralAttributeElement.getOneToMany(),
|
||||
pluralAttributeElement.getCascade()
|
||||
);
|
||||
}
|
||||
else if ( pluralAttributeElement.getManyToMany() != null ) {
|
||||
elementTypeDescriptor = typeDescriptor(
|
||||
pluralAttributeElement
|
||||
.getManyToMany().getClazz()
|
||||
);
|
||||
return new PluralAttributeElementSourceManyToManyImpl(
|
||||
sourceMappingDocument(),
|
||||
this,
|
||||
pluralAttributeElement.getManyToMany(),
|
||||
pluralAttributeElement.getCascade()
|
||||
);
|
||||
}
|
||||
else if ( pluralAttributeElement.getManyToAny() != null ) {
|
||||
throw new NotYetImplementedException( "Support for many-to-any not yet implemented" );
|
||||
// return Nature.MANY_TO_ANY;
|
||||
}
|
||||
else {
|
||||
throw new MappingException(
|
||||
"Unexpected collection element type : " + pluralAttributeElement.getName(),
|
||||
bindingContext().getOrigin()
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public AttributePath getAttributePath() {
|
||||
return attributePath;
|
||||
}
|
||||
|
||||
@Override
|
||||
public AttributeRole getAttributeRole() {
|
||||
return attributeRole;
|
||||
}
|
||||
|
||||
@Override
|
||||
public PluralAttributeElementSource resolvePluralAttributeElementSource(AttributeSourceResolutionContext context) {
|
||||
// elementSource is already resolved; nothing to do.
|
||||
return elementSource;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean usesJoinTable() {
|
||||
switch ( elementSource.getNature() ) {
|
||||
case BASIC:
|
||||
case AGGREGATE:
|
||||
case ONE_TO_MANY:
|
||||
return false;
|
||||
case MANY_TO_MANY:
|
||||
return true;
|
||||
case MANY_TO_ANY:
|
||||
throw new NotYetImplementedException(
|
||||
String.format( "%s is not implemented yet.", elementSource.getNature() )
|
||||
);
|
||||
default:
|
||||
throw new AssertionFailure(
|
||||
String.format(
|
||||
"Unexpected plural attribute element source nature: %s",
|
||||
elementSource.getNature()
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
public PluralAttributeElement getPluralAttributeElement() {
|
||||
return pluralAttributeElement;
|
||||
}
|
||||
|
||||
protected AttributeSourceContainer container() {
|
||||
return container;
|
||||
}
|
||||
|
||||
@Override
|
||||
public FilterSource[] getFilterSources() {
|
||||
return filterSources;
|
||||
}
|
||||
|
||||
@Override
|
||||
public PluralAttributeKeySource getKeySource() {
|
||||
return keySource;
|
||||
}
|
||||
|
||||
@Override
|
||||
public PluralAttributeElementSource getElementSource() {
|
||||
return elementSource;
|
||||
}
|
||||
|
||||
@Override
|
||||
public JavaTypeDescriptor getElementTypeDescriptor() {
|
||||
return elementTypeDescriptor;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isMutable() {
|
||||
return pluralAttributeElement.isMutable();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getBatchSize() {
|
||||
return pluralAttributeElement.getBatchSize();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getMappedBy() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String inferInLineViewName() {
|
||||
return getAttributeRole().getFullPath();
|
||||
}
|
||||
|
||||
@Override
|
||||
public CollectionIdSource getCollectionIdSource() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public TableSpecificationSource getCollectionTableSpecificationSource() {
|
||||
return pluralAttributeElement.getOneToMany() == null ?
|
||||
Helper.createTableSource( sourceMappingDocument(), pluralAttributeElement, this ) :
|
||||
null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getCollectionTableComment() {
|
||||
return pluralAttributeElement.getComment();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getCollectionTableCheck() {
|
||||
return pluralAttributeElement.getCheck();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Caching getCaching() {
|
||||
return caching;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getWhere() {
|
||||
return pluralAttributeElement.getWhere();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return pluralAttributeElement.getName();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isSingular() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public HibernateTypeSource getTypeInformation() {
|
||||
return typeInformation;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getPropertyAccessorName() {
|
||||
return pluralAttributeElement.getAccess();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isIncludedInOptimisticLocking() {
|
||||
return pluralAttributeElement.isOptimisticLock();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isInverse() {
|
||||
return pluralAttributeElement.isInverse();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getCustomPersisterClassName() {
|
||||
return pluralAttributeElement.getPersister();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getCustomLoaderName() {
|
||||
return pluralAttributeElement.getLoader() == null
|
||||
? null
|
||||
: pluralAttributeElement.getLoader().getQueryRef();
|
||||
}
|
||||
|
||||
@Override
|
||||
public CustomSQL getCustomSqlInsert() {
|
||||
return Helper.buildCustomSql( pluralAttributeElement.getSqlInsert() );
|
||||
}
|
||||
|
||||
@Override
|
||||
public CustomSQL getCustomSqlUpdate() {
|
||||
return Helper.buildCustomSql( pluralAttributeElement.getSqlUpdate() );
|
||||
}
|
||||
|
||||
@Override
|
||||
public CustomSQL getCustomSqlDelete() {
|
||||
return Helper.buildCustomSql( pluralAttributeElement.getSqlDelete() );
|
||||
}
|
||||
|
||||
@Override
|
||||
public CustomSQL getCustomSqlDeleteAll() {
|
||||
return Helper.buildCustomSql( pluralAttributeElement.getSqlDeleteAll() );
|
||||
}
|
||||
|
||||
@Override
|
||||
public Collection<? extends ToolingHintSource> getToolingHintSources() {
|
||||
return pluralAttributeElement.getMeta();
|
||||
}
|
||||
|
||||
@Override
|
||||
public FetchTiming getFetchTiming() {
|
||||
final String fetchSelection = pluralAttributeElement.getFetch() != null ?
|
||||
pluralAttributeElement.getFetch().value() :
|
||||
null;
|
||||
final String lazySelection = pluralAttributeElement.getLazy() != null
|
||||
? pluralAttributeElement.getLazy().value()
|
||||
: null;
|
||||
final String outerJoinSelection = pluralAttributeElement.getOuterJoin() != null
|
||||
? pluralAttributeElement.getOuterJoin().value()
|
||||
: null;
|
||||
|
||||
if ( lazySelection == null ) {
|
||||
if ( "join".equals( fetchSelection ) && "true".equals( outerJoinSelection ) ) {
|
||||
return FetchTiming.IMMEDIATE;
|
||||
}
|
||||
else if ( "false".equals( outerJoinSelection ) ) {
|
||||
return FetchTiming.DELAYED;
|
||||
}
|
||||
else {
|
||||
return bindingContext().getMappingDefaults().areAssociationsLazy()
|
||||
? FetchTiming.DELAYED
|
||||
: FetchTiming.IMMEDIATE;
|
||||
}
|
||||
}
|
||||
else if ( "extra".equals( lazySelection ) ) {
|
||||
return FetchTiming.EXTRA_LAZY;
|
||||
}
|
||||
else if ( "true".equals( lazySelection ) ) {
|
||||
return FetchTiming.DELAYED;
|
||||
}
|
||||
else if ( "false".equals( lazySelection ) ) {
|
||||
return FetchTiming.IMMEDIATE;
|
||||
}
|
||||
|
||||
throw new MappingException(
|
||||
String.format(
|
||||
"Unexpected lazy selection [%s] on '%s'",
|
||||
lazySelection,
|
||||
pluralAttributeElement.getName()
|
||||
),
|
||||
origin()
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public FetchStyle getFetchStyle() {
|
||||
final String fetchSelection = pluralAttributeElement.getFetch() != null ?
|
||||
pluralAttributeElement.getFetch().value() :
|
||||
null;
|
||||
final String outerJoinSelection = pluralAttributeElement.getOuterJoin() != null
|
||||
? pluralAttributeElement.getOuterJoin().value()
|
||||
: null;
|
||||
final int batchSize = getBatchSize();
|
||||
|
||||
if ( fetchSelection == null ) {
|
||||
if ( outerJoinSelection == null ) {
|
||||
return batchSize > 1 ? FetchStyle.BATCH : FetchStyle.SELECT;
|
||||
}
|
||||
else {
|
||||
if ( "auto".equals( outerJoinSelection ) ) {
|
||||
return bindingContext().getMappingDefaults().areAssociationsLazy()
|
||||
? FetchStyle.SELECT
|
||||
: FetchStyle.JOIN;
|
||||
}
|
||||
else {
|
||||
return "true".equals( outerJoinSelection ) ? FetchStyle.JOIN : FetchStyle.SELECT;
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
if ( "subselect".equals( fetchSelection ) ) {
|
||||
return FetchStyle.SUBSELECT;
|
||||
}
|
||||
else {
|
||||
return "join".equals( fetchSelection ) ? FetchStyle.JOIN : FetchStyle.SELECT;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,135 +0,0 @@
|
|||
/*
|
||||
* Hibernate, Relational Persistence for Idiomatic Java
|
||||
*
|
||||
* JBoss, Home of Professional Open Source
|
||||
* Copyright 2013 Red Hat Inc. and/or its affiliates and other contributors
|
||||
* as indicated by the @authors tag. All rights reserved.
|
||||
* See the copyright.txt in the distribution for a
|
||||
* full listing of individual contributors.
|
||||
*
|
||||
* 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, v. 2.1.
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT A
|
||||
* 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,
|
||||
* v.2.1 along with this distribution; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301, USA.
|
||||
*/
|
||||
package org.hibernate.metamodel.source.internal.hbm;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import org.hibernate.LockMode;
|
||||
import org.hibernate.engine.query.spi.sql.NativeSQLQueryReturn;
|
||||
import org.hibernate.internal.util.StringHelper;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbReturnPropertyElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.ReturnElement;
|
||||
import org.hibernate.metamodel.spi.InFlightMetadataCollector;
|
||||
import org.hibernate.metamodel.spi.LocalBindingContext;
|
||||
|
||||
/**
|
||||
* @author Strong Liu <stliu@hibernate.org>
|
||||
*/
|
||||
abstract class AbstractReturnBinder<T extends ReturnElement> {
|
||||
protected final InFlightMetadataCollector metadataCollector;
|
||||
protected final T element;
|
||||
protected final LocalBindingContext context;
|
||||
protected final String alias;
|
||||
protected final LockMode lockMode;
|
||||
protected List<JaxbReturnPropertyElement> returnPropertyElements;
|
||||
|
||||
AbstractReturnBinder(
|
||||
final T element,
|
||||
final int elementIndex,
|
||||
final LocalBindingContext context,
|
||||
final InFlightMetadataCollector metadataCollector) {
|
||||
this.context = context;
|
||||
this.metadataCollector = metadataCollector;
|
||||
this.element = element;
|
||||
this.alias = getAlias( element, elementIndex );
|
||||
this.lockMode = Helper.interpretLockMode( element.getLockMode(), context );
|
||||
this.returnPropertyElements = element.getReturnProperty();
|
||||
}
|
||||
|
||||
private static String getAlias(ReturnElement element, int elementCount) {
|
||||
return StringHelper.isEmpty( element.getAlias() ) ? "alias_" + elementCount : element.getAlias();
|
||||
}
|
||||
|
||||
abstract NativeSQLQueryReturn process();
|
||||
|
||||
protected void processReturnProperties(ReturnPropertiesCallback callback) {
|
||||
for ( JaxbReturnPropertyElement propertyElement : returnPropertyElements ) {
|
||||
callback.process( propertyElement );
|
||||
}
|
||||
}
|
||||
|
||||
static interface ReturnPropertiesCallback {
|
||||
void process(JaxbReturnPropertyElement propertyElement);
|
||||
}
|
||||
|
||||
static class ReturnPropertiesCallbackImpl implements ReturnPropertiesCallback {
|
||||
private final LocalBindingContext bindingContext;
|
||||
private final String alias;
|
||||
private final Map<String, String[]> propertyResults;
|
||||
|
||||
ReturnPropertiesCallbackImpl(
|
||||
final String alias, final Map<String, String[]> propertyResults,
|
||||
final LocalBindingContext bindingContext) {
|
||||
this.alias = alias;
|
||||
this.bindingContext = bindingContext;
|
||||
this.propertyResults = propertyResults;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void process(final JaxbReturnPropertyElement propertyElement) {
|
||||
final String name = propertyElement.getName();
|
||||
if ( StringHelper.isEmpty( name ) ) {
|
||||
throw bindingContext.makeMappingException( "Empty return property name on alias " + alias );
|
||||
}
|
||||
if ( name.contains( "." ) ) {
|
||||
throw bindingContext.makeMappingException(
|
||||
"dotted notation in <return-join> or <load_collection> not yet supported"
|
||||
);
|
||||
}
|
||||
if ( propertyResults.containsKey( name ) ) {
|
||||
throw bindingContext.makeMappingException(
|
||||
"duplicate return-property for property " + name + " on alias " + alias
|
||||
);
|
||||
}
|
||||
final List<String> returnColumnNames = getResultColumns( propertyElement, bindingContext );
|
||||
|
||||
if ( returnColumnNames.isEmpty() ) {
|
||||
throw bindingContext.makeMappingException(
|
||||
"return-property for alias " + alias + " must specify at least one column or return-column name"
|
||||
);
|
||||
}
|
||||
|
||||
propertyResults.put( name, returnColumnNames.toArray( new String[returnColumnNames.size()] ) );
|
||||
}
|
||||
|
||||
private static List<String> getResultColumns(
|
||||
final JaxbReturnPropertyElement propertyresult, final LocalBindingContext context) {
|
||||
List<String> allResultColumns = new ArrayList<String>();
|
||||
if ( propertyresult.getColumn() != null ) {
|
||||
String column = context.getMetadataCollector().getObjectNameNormalizer()
|
||||
.normalizeIdentifierQuoting( propertyresult.getColumn() );
|
||||
allResultColumns.add( column );
|
||||
}
|
||||
for ( JaxbReturnPropertyElement.JaxbReturnColumn returnColumn : propertyresult.getReturnColumn() ) {
|
||||
if ( returnColumn.getName() != null ) {
|
||||
String column = context.getMetadataCollector().getObjectNameNormalizer()
|
||||
.normalizeIdentifierQuoting( returnColumn.getName() );
|
||||
|
||||
allResultColumns.add( column );
|
||||
}
|
||||
}
|
||||
return allResultColumns;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -1,270 +0,0 @@
|
|||
/*
|
||||
* Hibernate, Relational Persistence for Idiomatic Java
|
||||
*
|
||||
* Copyright (c) 2012, Red Hat Inc. or third-party contributors as
|
||||
* indicated by the @author tags or express copyright attribution
|
||||
* statements applied by the authors. All third-party contributions are
|
||||
* distributed under license by Red Hat Inc.
|
||||
*
|
||||
* This copyrighted material is made available to anyone wishing to use, modify,
|
||||
* copy, or redistribute it subject to the terms and conditions of the GNU
|
||||
* Lesser General Public License, as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
|
||||
* for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this distribution; if not, write to:
|
||||
* Free Software Foundation, Inc.
|
||||
* 51 Franklin Street, Fifth Floor
|
||||
* Boston, MA 02110-1301 USA
|
||||
*/
|
||||
package org.hibernate.metamodel.source.internal.hbm;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
import org.hibernate.cfg.NamingStrategy;
|
||||
import org.hibernate.engine.FetchStyle;
|
||||
import org.hibernate.engine.FetchTiming;
|
||||
import org.hibernate.mapping.PropertyGeneration;
|
||||
import org.hibernate.metamodel.internal.binder.Binder;
|
||||
import org.hibernate.metamodel.source.spi.AttributeSource;
|
||||
import org.hibernate.metamodel.source.spi.AttributeSourceResolutionContext;
|
||||
import org.hibernate.metamodel.source.spi.MappedByAssociationSource;
|
||||
import org.hibernate.metamodel.source.spi.MappingException;
|
||||
import org.hibernate.metamodel.source.spi.ToOneAttributeSource;
|
||||
import org.hibernate.metamodel.spi.NaturalIdMutability;
|
||||
import org.hibernate.metamodel.spi.binding.AttributeBinding;
|
||||
import org.hibernate.metamodel.spi.binding.EmbeddedAttributeBinding;
|
||||
import org.hibernate.metamodel.spi.relational.TableSpecification;
|
||||
import org.hibernate.metamodel.spi.relational.Value;
|
||||
|
||||
/**
|
||||
* @author Gail Badner
|
||||
*/
|
||||
public abstract class AbstractToOneAttributeSourceImpl extends AbstractHbmSourceNode implements ToOneAttributeSource{
|
||||
private final NaturalIdMutability naturalIdMutability;
|
||||
private final String propertyRef;
|
||||
private final Set<MappedByAssociationSource> ownedAssociationSources = new HashSet<MappedByAssociationSource>( );
|
||||
|
||||
AbstractToOneAttributeSourceImpl(
|
||||
MappingDocument sourceMappingDocument,
|
||||
NaturalIdMutability naturalIdMutability,
|
||||
String propertyRef) {
|
||||
super( sourceMappingDocument );
|
||||
this.naturalIdMutability = naturalIdMutability;
|
||||
this.propertyRef = propertyRef;
|
||||
}
|
||||
|
||||
@Override
|
||||
public NaturalIdMutability getNaturalIdMutability() {
|
||||
return naturalIdMutability;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isSingular() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isVirtualAttribute() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public PropertyGeneration getGeneration() {
|
||||
return PropertyGeneration.NEVER;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isIgnoreNotFound() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isLazy() {
|
||||
return getFetchTiming() != FetchTiming.IMMEDIATE;
|
||||
}
|
||||
|
||||
protected abstract boolean requiresImmediateFetch();
|
||||
protected abstract String getFetchSelectionString();
|
||||
protected abstract String getLazySelectionString();
|
||||
protected abstract String getOuterJoinSelectionString();
|
||||
|
||||
@Override
|
||||
public boolean isUnWrapProxy() {
|
||||
final String lazySelection = getLazySelectionString();
|
||||
return lazySelection != null && lazySelection.equals( "no-proxy" );
|
||||
}
|
||||
|
||||
@Override
|
||||
public FetchTiming getFetchTiming() {
|
||||
final String lazySelection = getLazySelectionString();
|
||||
|
||||
if ( lazySelection == null ) {
|
||||
if ( requiresImmediateFetch() ) {
|
||||
return FetchTiming.IMMEDIATE;
|
||||
}
|
||||
else if ( "join".equals( getFetchSelectionString() ) || "true".equals( getOuterJoinSelectionString() ) ) {
|
||||
return FetchTiming.IMMEDIATE;
|
||||
}
|
||||
else if ( "false".equals( getOuterJoinSelectionString() ) ) {
|
||||
return FetchTiming.DELAYED;
|
||||
}
|
||||
else {
|
||||
return bindingContext().getMappingDefaults().areAssociationsLazy()
|
||||
? FetchTiming.DELAYED
|
||||
: FetchTiming.IMMEDIATE;
|
||||
}
|
||||
}
|
||||
else if ( "extra".equals( lazySelection ) ) {
|
||||
// TODO: don't think "extra" is valid here
|
||||
return FetchTiming.EXTRA_LAZY;
|
||||
}
|
||||
else if ( "true".equals( lazySelection ) || "proxy".equals( lazySelection ) || "no-proxy".equals( lazySelection ) ) {
|
||||
return FetchTiming.DELAYED;
|
||||
}
|
||||
else if ( "false".equals( lazySelection ) ) {
|
||||
return FetchTiming.IMMEDIATE;
|
||||
}
|
||||
|
||||
throw new MappingException(
|
||||
String.format(
|
||||
"Unexpected lazy selection [%s] on '%s'",
|
||||
lazySelection,
|
||||
getName()
|
||||
),
|
||||
origin()
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public FetchStyle getFetchStyle() {
|
||||
// todo : handle batch fetches?
|
||||
|
||||
if ( getFetchSelectionString() == null ) {
|
||||
if ( requiresImmediateFetch() ) {
|
||||
return FetchStyle.JOIN;
|
||||
}
|
||||
else if ( getOuterJoinSelectionString() == null ) {
|
||||
return FetchStyle.SELECT;
|
||||
}
|
||||
else {
|
||||
if ( "auto".equals( getOuterJoinSelectionString() ) ) {
|
||||
return bindingContext().getMappingDefaults().areAssociationsLazy()
|
||||
? FetchStyle.SELECT
|
||||
: FetchStyle.JOIN;
|
||||
}
|
||||
else {
|
||||
return "true".equals( getOuterJoinSelectionString() ) ? FetchStyle.JOIN : FetchStyle.SELECT;
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
return "join".equals( getFetchSelectionString() ) ? FetchStyle.JOIN : FetchStyle.SELECT;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
// TODO: change to return the default name for a single column
|
||||
public List<Binder.DefaultNamingStrategy> getDefaultNamingStrategies(
|
||||
final String entityName,
|
||||
final String tableName,
|
||||
final AttributeBinding referencedAttributeBinding) {
|
||||
if ( EmbeddedAttributeBinding.class.isInstance( referencedAttributeBinding ) ) {
|
||||
EmbeddedAttributeBinding embeddedAttributeBinding = EmbeddedAttributeBinding.class.cast(
|
||||
referencedAttributeBinding
|
||||
);
|
||||
List<Binder.DefaultNamingStrategy> result = new ArrayList<Binder.DefaultNamingStrategy>();
|
||||
for ( final AttributeBinding attributeBinding : embeddedAttributeBinding.getEmbeddableBinding().attributeBindings() ) {
|
||||
result.addAll( getDefaultNamingStrategies( entityName, tableName, attributeBinding ) );
|
||||
}
|
||||
return result;
|
||||
}
|
||||
else {
|
||||
List<Binder.DefaultNamingStrategy> result = new ArrayList<Binder.DefaultNamingStrategy>( 1 );
|
||||
result.add(
|
||||
new Binder.DefaultNamingStrategy() {
|
||||
@Override
|
||||
public String defaultName(NamingStrategy namingStrategy) {
|
||||
return namingStrategy.propertyToColumnName( getName() );
|
||||
}
|
||||
}
|
||||
);
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<MappedByAssociationSource> getOwnedAssociationSources() {
|
||||
return ownedAssociationSources;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addMappedByAssociationSource(MappedByAssociationSource attributeSource) {
|
||||
ownedAssociationSources.add( attributeSource );
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isMappedBy() {
|
||||
// only applies to annotations
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public AttributeSource getAttributeSource() {
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void resolveToOneAttributeSourceNature(AttributeSourceResolutionContext context) {
|
||||
// nothing to do
|
||||
}
|
||||
|
||||
@Override
|
||||
public void resolveToOneAttributeSourceNatureAsPartOfIdentifier() {
|
||||
// nothing to do
|
||||
}
|
||||
|
||||
@Override
|
||||
public JoinColumnResolutionDelegate getForeignKeyTargetColumnResolutionDelegate() {
|
||||
return propertyRef == null
|
||||
? null
|
||||
: new JoinColumnResolutionDelegateImpl( propertyRef );
|
||||
}
|
||||
|
||||
public static class JoinColumnResolutionDelegateImpl implements JoinColumnResolutionDelegate {
|
||||
private final String propertyRef;
|
||||
|
||||
public JoinColumnResolutionDelegateImpl(String propertyRef) {
|
||||
this.propertyRef = propertyRef;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getReferencedAttributeName() {
|
||||
return propertyRef;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<? extends Value> getJoinColumns(JoinColumnResolutionContext context) {
|
||||
return context.resolveRelationalValuesForAttribute( propertyRef );
|
||||
}
|
||||
|
||||
@Override
|
||||
public TableSpecification getReferencedTable(JoinColumnResolutionContext context) {
|
||||
return context.resolveTableForAttribute( propertyRef );
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean createForeignKeyConstraint() {
|
||||
// TODO: Can HBM do something like JPA's @ForeignKey(NO_CONSTRAINT)?
|
||||
return true;
|
||||
}
|
||||
}
|
|
@ -1,73 +0,0 @@
|
|||
/*
|
||||
* 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.internal.hbm;
|
||||
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbArrayElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbListIndexElement;
|
||||
import org.hibernate.metamodel.source.spi.AttributeSourceContainer;
|
||||
import org.hibernate.metamodel.source.spi.IndexedPluralAttributeSource;
|
||||
import org.hibernate.metamodel.source.spi.PluralAttributeIndexSource;
|
||||
import org.hibernate.metamodel.source.spi.PluralAttributeSequentialIndexSource;
|
||||
import org.hibernate.metamodel.spi.PluralAttributeNature;
|
||||
|
||||
/**
|
||||
* @author Brett Meyer
|
||||
*/
|
||||
public class ArraySourceImpl extends AbstractPluralAttributeSourceImpl implements IndexedPluralAttributeSource {
|
||||
|
||||
private final PluralAttributeSequentialIndexSource indexSource;
|
||||
|
||||
public ArraySourceImpl(
|
||||
MappingDocument sourceMappingDocument,
|
||||
JaxbArrayElement arrayElement,
|
||||
AttributeSourceContainer container) {
|
||||
super( sourceMappingDocument, arrayElement, container );
|
||||
JaxbListIndexElement listIndexElement = arrayElement.getListIndex();
|
||||
if ( listIndexElement == null ) {
|
||||
this.indexSource = new PluralAttributeSequentialIndexSourceImpl( sourceMappingDocument(), arrayElement.getIndex() );
|
||||
} else {
|
||||
this.indexSource = new PluralAttributeSequentialIndexSourceImpl( sourceMappingDocument(), listIndexElement );
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public PluralAttributeIndexSource getIndexSource() {
|
||||
return indexSource;
|
||||
}
|
||||
|
||||
@Override
|
||||
public JaxbArrayElement getPluralAttributeElement() {
|
||||
return ( JaxbArrayElement ) super.getPluralAttributeElement();
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*
|
||||
* @see org.hibernate.metamodel.source.spi.PluralAttributeSource#getNature()
|
||||
*/
|
||||
@Override
|
||||
public PluralAttributeNature getNature() {
|
||||
return PluralAttributeNature.ARRAY;
|
||||
}
|
||||
}
|
|
@ -1,62 +0,0 @@
|
|||
/*
|
||||
* 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.internal.hbm;
|
||||
|
||||
import org.hibernate.internal.util.StringHelper;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbBagElement;
|
||||
import org.hibernate.metamodel.source.spi.AttributeSourceContainer;
|
||||
import org.hibernate.metamodel.source.spi.Orderable;
|
||||
import org.hibernate.metamodel.spi.PluralAttributeNature;
|
||||
|
||||
/**
|
||||
* @author Steve Ebersole
|
||||
*/
|
||||
public class BagSourceImpl extends AbstractPluralAttributeSourceImpl implements Orderable {
|
||||
public BagSourceImpl(
|
||||
MappingDocument sourceMappingDocument,
|
||||
JaxbBagElement bagElement,
|
||||
AttributeSourceContainer container) {
|
||||
super( sourceMappingDocument, bagElement, container );
|
||||
}
|
||||
|
||||
@Override
|
||||
public PluralAttributeNature getNature() {
|
||||
return PluralAttributeNature.BAG;
|
||||
}
|
||||
|
||||
@Override
|
||||
public JaxbBagElement getPluralAttributeElement() {
|
||||
return (JaxbBagElement) super.getPluralAttributeElement();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isOrdered() {
|
||||
return StringHelper.isNotEmpty( getOrder() );
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getOrder() {
|
||||
return getPluralAttributeElement().getOrderBy();
|
||||
}
|
||||
}
|
|
@ -1,148 +0,0 @@
|
|||
/*
|
||||
* 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.internal.hbm;
|
||||
|
||||
import org.hibernate.TruthValue;
|
||||
import org.hibernate.metamodel.source.spi.ColumnSource;
|
||||
import org.hibernate.metamodel.source.spi.SizeSource;
|
||||
import org.hibernate.metamodel.spi.relational.JdbcDataType;
|
||||
|
||||
/**
|
||||
* Implementation of a {@link ColumnSource} when the column is declared as just the name via the column XML
|
||||
* attribute. For example, {@code <property name="socialSecurityNumber" column="ssn"/>}.
|
||||
*
|
||||
* @author Steve Ebersole
|
||||
*/
|
||||
class ColumnAttributeSourceImpl
|
||||
extends AbstractHbmSourceNode
|
||||
implements ColumnSource {
|
||||
private final String tableName;
|
||||
private final String columnName;
|
||||
private final SizeSource sizeSource;
|
||||
private TruthValue includedInInsert;
|
||||
private TruthValue includedInUpdate;
|
||||
private TruthValue nullable;
|
||||
|
||||
ColumnAttributeSourceImpl(
|
||||
MappingDocument mappingDocument,
|
||||
String tableName,
|
||||
String columnName,
|
||||
SizeSource sizeSource,
|
||||
TruthValue includedInInsert,
|
||||
TruthValue includedInUpdate) {
|
||||
this( mappingDocument, tableName, columnName, sizeSource, includedInInsert, includedInUpdate, TruthValue.UNKNOWN );
|
||||
}
|
||||
|
||||
ColumnAttributeSourceImpl(
|
||||
MappingDocument mappingDocument,
|
||||
String tableName,
|
||||
String columnName,
|
||||
SizeSource sizeSource,
|
||||
TruthValue includedInInsert,
|
||||
TruthValue includedInUpdate,
|
||||
TruthValue nullable) {
|
||||
super( mappingDocument );
|
||||
this.tableName = tableName;
|
||||
this.columnName = columnName;
|
||||
this.sizeSource = sizeSource;
|
||||
this.includedInInsert = includedInInsert;
|
||||
this.includedInUpdate = includedInUpdate;
|
||||
this.nullable = nullable;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Nature getNature() {
|
||||
return Nature.COLUMN;
|
||||
}
|
||||
|
||||
@Override
|
||||
public TruthValue isIncludedInInsert() {
|
||||
return includedInInsert;
|
||||
}
|
||||
|
||||
@Override
|
||||
public TruthValue isIncludedInUpdate() {
|
||||
return includedInUpdate;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getContainingTableName() {
|
||||
return tableName;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return columnName;
|
||||
}
|
||||
|
||||
@Override
|
||||
public TruthValue isNullable() {
|
||||
return nullable;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDefaultValue() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getSqlType() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public JdbcDataType getDatatype() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public SizeSource getSizeSource() {
|
||||
return sizeSource;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getReadFragment() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getWriteFragment() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isUnique() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getCheckCondition() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getComment() {
|
||||
return null;
|
||||
}
|
||||
}
|
|
@ -1,143 +0,0 @@
|
|||
/*
|
||||
* 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.internal.hbm;
|
||||
|
||||
import org.hibernate.TruthValue;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbColumnElement;
|
||||
import org.hibernate.metamodel.source.spi.ColumnSource;
|
||||
import org.hibernate.metamodel.source.spi.SizeSource;
|
||||
import org.hibernate.metamodel.spi.relational.JdbcDataType;
|
||||
|
||||
/**
|
||||
* @author Steve Ebersole
|
||||
*/
|
||||
class ColumnSourceImpl
|
||||
extends AbstractHbmSourceNode
|
||||
implements ColumnSource {
|
||||
private final String tableName;
|
||||
private final JaxbColumnElement columnElement;
|
||||
private final TruthValue includedInInsert;
|
||||
private final TruthValue includedInUpdate;
|
||||
private final TruthValue nullable;
|
||||
|
||||
ColumnSourceImpl(
|
||||
MappingDocument mappingDocument,
|
||||
String tableName,
|
||||
JaxbColumnElement columnElement,
|
||||
TruthValue isIncludedInInsert,
|
||||
TruthValue isIncludedInUpdate) {
|
||||
this( mappingDocument, tableName, columnElement, isIncludedInInsert, isIncludedInUpdate, TruthValue.UNKNOWN );
|
||||
}
|
||||
|
||||
ColumnSourceImpl(
|
||||
MappingDocument mappingDocument,
|
||||
String tableName,
|
||||
JaxbColumnElement columnElement,
|
||||
TruthValue isIncludedInInsert,
|
||||
TruthValue isIncludedInUpdate,
|
||||
TruthValue nullable) {
|
||||
super( mappingDocument );
|
||||
this.tableName = tableName;
|
||||
this.columnElement = columnElement;
|
||||
this.nullable = nullable;
|
||||
this.includedInInsert = isIncludedInInsert;
|
||||
this.includedInUpdate = isIncludedInUpdate;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Nature getNature() {
|
||||
return Nature.COLUMN;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return columnElement.getName();
|
||||
}
|
||||
|
||||
@Override
|
||||
public TruthValue isNullable() {
|
||||
return nullable;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDefaultValue() {
|
||||
return columnElement.getDefault();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getSqlType() {
|
||||
return columnElement.getSqlType();
|
||||
}
|
||||
|
||||
@Override
|
||||
public JdbcDataType getDatatype() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public SizeSource getSizeSource() {
|
||||
return new SizeSourceImpl( columnElement.getPrecision(), columnElement.getScale(), columnElement.getLength() );
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getReadFragment() {
|
||||
return columnElement.getRead();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getWriteFragment() {
|
||||
return columnElement.getWrite();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isUnique() {
|
||||
// TODO: should TruthValue be returned instead of boolean?
|
||||
return columnElement.isUnique() != null && columnElement.isUnique().booleanValue();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getCheckCondition() {
|
||||
return columnElement.getCheck();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getComment() {
|
||||
return columnElement.getComment();
|
||||
}
|
||||
|
||||
@Override
|
||||
public TruthValue isIncludedInInsert() {
|
||||
return includedInInsert;
|
||||
}
|
||||
|
||||
@Override
|
||||
public TruthValue isIncludedInUpdate() {
|
||||
return includedInUpdate;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getContainingTableName() {
|
||||
return tableName;
|
||||
}
|
||||
}
|
|
@ -1,95 +0,0 @@
|
|||
/*
|
||||
* Hibernate, Relational Persistence for Idiomatic Java
|
||||
*
|
||||
* Copyright (c) 2014, 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.internal.hbm;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbAnyElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbArrayElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbBagElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbComponentElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbDynamicComponentElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbKeyManyToOneElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbKeyPropertyElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbListElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbManyToOneElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbMapElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbNestedCompositeElementElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbOneToOneElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbPrimitiveArrayElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbPropertiesElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbPropertyElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbSetElement;
|
||||
|
||||
/**
|
||||
* Describes the JAXB source (HBM) for embeddable (composite) information. The
|
||||
* HBM XML schema unfortunately did not define these consistently between
|
||||
* {@code <component/>} and {@code <composite-id/>}, so this contract unifies
|
||||
* access to this information.
|
||||
*
|
||||
* @author Steve Ebersole
|
||||
*/
|
||||
public interface EmbeddableJaxbSource {
|
||||
public String getClazz();
|
||||
|
||||
public String findParent();
|
||||
public String findTuplizer();
|
||||
|
||||
// todo : ultimately would be nice to remove the distinction between:
|
||||
// * getKeyPropertyElementList() / getPropertyElementList()
|
||||
// * getKeyManyToOneElementList() / getManyToOneElementList()
|
||||
// the difference is really a matter of the "container", not the attribute
|
||||
|
||||
public List<JaxbKeyPropertyElement> getKeyPropertyElementList();
|
||||
|
||||
public List<JaxbKeyManyToOneElement> getKeyManyToOneElementList();
|
||||
|
||||
public List<JaxbPropertyElement> getPropertyElementList();
|
||||
|
||||
public List<JaxbManyToOneElement> getManyToOneElementList();
|
||||
|
||||
public List<JaxbOneToOneElement> getOneToOneElementList();
|
||||
|
||||
public List<JaxbComponentElement> getComponentElementList();
|
||||
|
||||
public List<JaxbNestedCompositeElementElement> getNestedCompositeElementList();
|
||||
|
||||
public List<JaxbDynamicComponentElement> getDynamicComponentElementList();
|
||||
|
||||
public List<JaxbPropertiesElement> getPropertiesElementList();
|
||||
|
||||
public List<JaxbAnyElement> getAnyElementList();
|
||||
|
||||
public List<JaxbMapElement> getMapElementList();
|
||||
|
||||
public List<JaxbSetElement> getSetElementList();
|
||||
|
||||
public List<JaxbListElement> getListElementList();
|
||||
|
||||
public List<JaxbBagElement> getBagElementList();
|
||||
|
||||
public List<JaxbArrayElement> getArrayElementList();
|
||||
|
||||
public List<JaxbPrimitiveArrayElement> getPrimitiveArrayElementList();
|
||||
}
|
|
@ -1,308 +0,0 @@
|
|||
/*
|
||||
* Hibernate, Relational Persistence for Idiomatic Java
|
||||
*
|
||||
* Copyright (c) 2014, 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.internal.hbm;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import org.hibernate.cfg.NotYetImplementedException;
|
||||
import org.hibernate.metamodel.reflite.spi.JavaTypeDescriptor;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbAnyElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbArrayElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbBagElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbComponentElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbDynamicComponentElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbKeyManyToOneElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbKeyPropertyElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbListElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbManyToManyElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbManyToOneElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbMapElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbNestedCompositeElementElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbOneToManyElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbOneToOneElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbPrimitiveArrayElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbPropertyElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbSetElement;
|
||||
import org.hibernate.metamodel.source.spi.AttributeSource;
|
||||
import org.hibernate.metamodel.source.spi.EmbeddableSource;
|
||||
import org.hibernate.metamodel.source.spi.SingularAttributeSource;
|
||||
import org.hibernate.metamodel.spi.AttributePath;
|
||||
import org.hibernate.metamodel.spi.AttributeRole;
|
||||
import org.hibernate.metamodel.spi.LocalBindingContext;
|
||||
import org.hibernate.metamodel.spi.NaturalIdMutability;
|
||||
|
||||
/**
|
||||
* @author Steve Ebersole
|
||||
*/
|
||||
public class EmbeddableSourceImpl extends AbstractHbmSourceNode implements EmbeddableSource {
|
||||
private final EmbeddableJaxbSource embeddableSource;
|
||||
private final JavaTypeDescriptor typeDescriptor;
|
||||
|
||||
private final AttributeRole attributeRoleBase;
|
||||
private final AttributePath attributePathBase;
|
||||
|
||||
private final String logicalTableName;
|
||||
private final NaturalIdMutability naturalIdMutability;
|
||||
|
||||
private final List<AttributeSource> attributeSources;
|
||||
|
||||
public EmbeddableSourceImpl(
|
||||
MappingDocument mappingDocument,
|
||||
AttributeRole attributeRoleBase,
|
||||
AttributePath attributePathBase,
|
||||
EmbeddableJaxbSource embeddableJaxbSource,
|
||||
String logicalTableName,
|
||||
NaturalIdMutability naturalIdMutability) {
|
||||
super( mappingDocument );
|
||||
this.attributeRoleBase = attributeRoleBase;
|
||||
this.attributePathBase = attributePathBase;
|
||||
this.embeddableSource = embeddableJaxbSource;
|
||||
this.logicalTableName = logicalTableName;
|
||||
this.naturalIdMutability = naturalIdMutability;
|
||||
|
||||
this.typeDescriptor = typeDescriptor( embeddableJaxbSource.getClazz() );
|
||||
|
||||
this.attributeSources = buildAttributeSources( embeddableJaxbSource, this );
|
||||
}
|
||||
|
||||
@Override
|
||||
public JavaTypeDescriptor getTypeDescriptor() {
|
||||
return typeDescriptor;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getParentReferenceAttributeName() {
|
||||
return embeddableSource.findParent();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getExplicitTuplizerClassName() {
|
||||
return embeddableSource.findTuplizer();
|
||||
}
|
||||
|
||||
@Override
|
||||
public AttributePath getAttributePathBase() {
|
||||
return attributePathBase;
|
||||
}
|
||||
|
||||
@Override
|
||||
public AttributeRole getAttributeRoleBase() {
|
||||
return attributeRoleBase;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<AttributeSource> attributeSources() {
|
||||
return attributeSources;
|
||||
}
|
||||
|
||||
@Override
|
||||
public LocalBindingContext getLocalBindingContext() {
|
||||
return bindingContext();
|
||||
}
|
||||
|
||||
|
||||
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
// Attribute building
|
||||
|
||||
protected static List<AttributeSource> buildAttributeSources(
|
||||
EmbeddableJaxbSource container,
|
||||
EmbeddableSourceImpl embeddableSource) {
|
||||
final List<AttributeSource> attributeSources = new ArrayList<AttributeSource>();
|
||||
|
||||
for ( JaxbPropertyElement element : container.getPropertyElementList() ) {
|
||||
attributeSources.add( embeddableSource.buildAttributeSource( element ) );
|
||||
}
|
||||
|
||||
for ( JaxbManyToOneElement element : container.getManyToOneElementList() ) {
|
||||
attributeSources.add( embeddableSource.buildAttributeSource( element ) );
|
||||
}
|
||||
|
||||
for ( JaxbOneToOneElement element: container.getOneToOneElementList() ) {
|
||||
attributeSources.add( embeddableSource.buildAttributeSource( element ) );
|
||||
}
|
||||
|
||||
for ( JaxbComponentElement element: container.getComponentElementList() ) {
|
||||
attributeSources.add( embeddableSource.buildAttributeSource( element ) );
|
||||
}
|
||||
|
||||
for ( JaxbNestedCompositeElementElement element: container.getNestedCompositeElementList() ) {
|
||||
attributeSources.add( embeddableSource.buildAttributeSource( element ) );
|
||||
}
|
||||
|
||||
for ( JaxbDynamicComponentElement element: container.getDynamicComponentElementList() ) {
|
||||
attributeSources.add( embeddableSource.buildAttributeSource(element) );
|
||||
}
|
||||
|
||||
for ( JaxbAnyElement element: container.getAnyElementList() ) {
|
||||
attributeSources.add( embeddableSource.buildAttributeSource( element ) );
|
||||
}
|
||||
|
||||
for ( JaxbMapElement element: container.getMapElementList() ) {
|
||||
attributeSources.add( embeddableSource.buildAttributeSource( element ) );
|
||||
}
|
||||
|
||||
for ( JaxbSetElement element: container.getSetElementList() ) {
|
||||
attributeSources.add( embeddableSource.buildAttributeSource( element ) );
|
||||
}
|
||||
for ( JaxbListElement element: container.getListElementList() ) {
|
||||
attributeSources.add( embeddableSource.buildAttributeSource( element ) );
|
||||
}
|
||||
|
||||
for ( JaxbBagElement element: container.getBagElementList() ) {
|
||||
attributeSources.add( embeddableSource.buildAttributeSource( element ) );
|
||||
}
|
||||
|
||||
for ( JaxbArrayElement element: container.getArrayElementList() ) {
|
||||
attributeSources.add( embeddableSource.buildAttributeSource( element ) );
|
||||
}
|
||||
|
||||
for ( JaxbPrimitiveArrayElement element: container.getPrimitiveArrayElementList() ) {
|
||||
attributeSources.add( embeddableSource.buildAttributeSource( element ) );
|
||||
}
|
||||
|
||||
for ( JaxbKeyPropertyElement element : container.getKeyPropertyElementList() ) {
|
||||
attributeSources.add( embeddableSource.buildAttributeSource( element ) );
|
||||
}
|
||||
|
||||
for ( JaxbKeyManyToOneElement element : container.getKeyManyToOneElementList() ) {
|
||||
attributeSources.add( embeddableSource.buildAttributeSource( element ) );
|
||||
}
|
||||
|
||||
return attributeSources;
|
||||
}
|
||||
|
||||
private AttributeSource buildAttributeSource(JaxbKeyPropertyElement element) {
|
||||
return new IdentifierKeyAttributeSourceImpl( sourceMappingDocument(), this, element );
|
||||
}
|
||||
|
||||
private AttributeSource buildAttributeSource(JaxbKeyManyToOneElement element) {
|
||||
return new IdentifierKeyManyToOneSourceImpl( sourceMappingDocument(), this, element );
|
||||
}
|
||||
|
||||
protected SingularAttributeSource buildAttributeSource(JaxbPropertyElement attributeElement) {
|
||||
return new PropertyAttributeSourceImpl(
|
||||
sourceMappingDocument(),
|
||||
this,
|
||||
attributeElement,
|
||||
logicalTableName,
|
||||
naturalIdMutability
|
||||
);
|
||||
}
|
||||
|
||||
protected AttributeSource buildAttributeSource(JaxbComponentElement attributeElement) {
|
||||
return new EmbeddedAttributeSourceImpl(
|
||||
sourceMappingDocument(),
|
||||
this,
|
||||
attributeElement,
|
||||
naturalIdMutability,
|
||||
logicalTableName
|
||||
);
|
||||
}
|
||||
|
||||
private AttributeSource buildAttributeSource(JaxbNestedCompositeElementElement element) {
|
||||
// todo : implement
|
||||
throw new NotYetImplementedException();
|
||||
}
|
||||
|
||||
protected AttributeSource buildAttributeSource(JaxbDynamicComponentElement attributeElement) {
|
||||
// todo : implement
|
||||
throw new NotYetImplementedException();
|
||||
}
|
||||
|
||||
protected AttributeSource buildAttributeSource(JaxbManyToOneElement attributeElement) {
|
||||
return new ManyToOneAttributeSourceImpl(
|
||||
sourceMappingDocument(),
|
||||
this,
|
||||
attributeElement,
|
||||
logicalTableName,
|
||||
naturalIdMutability
|
||||
);
|
||||
}
|
||||
|
||||
protected AttributeSource buildAttributeSource(JaxbOneToOneElement attributeElement) {
|
||||
return new OneToOneAttributeSourceImpl(
|
||||
sourceMappingDocument(),
|
||||
this,
|
||||
attributeElement,
|
||||
logicalTableName,
|
||||
naturalIdMutability
|
||||
);
|
||||
}
|
||||
|
||||
protected AttributeSource buildAttributeSource(JaxbAnyElement attributeElement) {
|
||||
// todo : implement
|
||||
throw new NotYetImplementedException();
|
||||
}
|
||||
|
||||
protected AttributeSource buildAttributeSource(JaxbOneToManyElement attributeElement) {
|
||||
// todo : implement
|
||||
throw new NotYetImplementedException();
|
||||
}
|
||||
|
||||
protected AttributeSource buildAttributeSource(JaxbManyToManyElement attributeElement) {
|
||||
// todo : implement
|
||||
throw new NotYetImplementedException();
|
||||
}
|
||||
|
||||
protected AttributeSource buildAttributeSource(JaxbMapElement attributeElement) {
|
||||
return new MapSourceImpl(
|
||||
sourceMappingDocument(),
|
||||
attributeElement,
|
||||
this
|
||||
);
|
||||
}
|
||||
protected AttributeSource buildAttributeSource(JaxbSetElement attributeElement) {
|
||||
return new SetSourceImpl(
|
||||
sourceMappingDocument(),
|
||||
attributeElement,
|
||||
this
|
||||
);
|
||||
}
|
||||
protected AttributeSource buildAttributeSource(JaxbListElement attributeElement) {
|
||||
return new ListSourceImpl(
|
||||
sourceMappingDocument(),
|
||||
attributeElement,
|
||||
this
|
||||
);
|
||||
}
|
||||
protected AttributeSource buildAttributeSource(JaxbBagElement attributeElement) {
|
||||
return new BagSourceImpl(
|
||||
sourceMappingDocument(),
|
||||
attributeElement,
|
||||
this
|
||||
);
|
||||
}
|
||||
protected AttributeSource buildAttributeSource(JaxbArrayElement attributeElement) {
|
||||
return new ArraySourceImpl(
|
||||
sourceMappingDocument(),
|
||||
attributeElement,
|
||||
this
|
||||
);
|
||||
}
|
||||
protected AttributeSource buildAttributeSource(JaxbPrimitiveArrayElement attributeElement) {
|
||||
// todo : implement
|
||||
throw new NotYetImplementedException();
|
||||
}
|
||||
}
|
|
@ -1,211 +0,0 @@
|
|||
/*
|
||||
* Hibernate, Relational Persistence for Idiomatic Java
|
||||
*
|
||||
* Copyright (c) 2012, Red Hat Inc. or third-party contributors as
|
||||
* indicated by the @author tags or express copyright attribution
|
||||
* statements applied by the authors. All third-party contributions are
|
||||
* distributed under license by Red Hat Inc.
|
||||
*
|
||||
* This copyrighted material is made available to anyone wishing to use, modify,
|
||||
* copy, or redistribute it subject to the terms and conditions of the GNU
|
||||
* Lesser General Public License, as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
|
||||
* for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this distribution; if not, write to:
|
||||
* Free Software Foundation, Inc.
|
||||
* 51 Franklin Street, Fifth Floor
|
||||
* Boston, MA 02110-1301 USA
|
||||
*/
|
||||
package org.hibernate.metamodel.source.internal.hbm;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.hibernate.EntityMode;
|
||||
import org.hibernate.internal.util.StringHelper;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbAnyElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbArrayElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbBagElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbComponentElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbDynamicComponentElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbListElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbManyToOneElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbMapElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbOneToOneElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbPrimitiveArrayElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbPropertiesElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbPropertyElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbSetElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbTuplizerElement;
|
||||
import org.hibernate.metamodel.source.spi.AttributeSourceContainer;
|
||||
import org.hibernate.metamodel.spi.AttributePath;
|
||||
import org.hibernate.metamodel.spi.AttributeRole;
|
||||
import org.hibernate.metamodel.spi.NaturalIdMutability;
|
||||
|
||||
/**
|
||||
* The source information for a singular attribute whose type is composite
|
||||
* (embedded in JPA terms).
|
||||
*
|
||||
* @author Steve Ebersole
|
||||
*/
|
||||
class EmbeddedAttributeSourceImpl extends AbstractEmbeddedAttributeSourceImpl {
|
||||
public EmbeddedAttributeSourceImpl(
|
||||
MappingDocument sourceMappingDocument,
|
||||
AttributeSourceContainer parentContainer,
|
||||
JaxbComponentElement jaxbComponentElement,
|
||||
NaturalIdMutability naturalIdMutability,
|
||||
String logicalTableName) {
|
||||
super(
|
||||
sourceMappingDocument,
|
||||
parentContainer,
|
||||
parentContainer.getAttributeRoleBase().append( jaxbComponentElement.getName() ),
|
||||
parentContainer.getAttributePathBase().append( jaxbComponentElement.getName() ),
|
||||
jaxbComponentElement,
|
||||
new EmbeddableJaxbSourceImpl( jaxbComponentElement ),
|
||||
naturalIdMutability,
|
||||
logicalTableName
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected JaxbComponentElement jaxbComponentSourceElement() {
|
||||
return (JaxbComponentElement) super.jaxbComponentSourceElement();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isLazy() {
|
||||
return jaxbComponentSourceElement().isLazy();
|
||||
}
|
||||
|
||||
@Override
|
||||
public AttributePath getAttributePath() {
|
||||
return getEmbeddableSource().getAttributePathBase();
|
||||
}
|
||||
|
||||
@Override
|
||||
public AttributeRole getAttributeRole() {
|
||||
return getEmbeddableSource().getAttributeRoleBase();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isIncludedInOptimisticLocking() {
|
||||
return jaxbComponentSourceElement().isOptimisticLock();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean areValuesIncludedInInsertByDefault() {
|
||||
return jaxbComponentSourceElement().isInsert();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean areValuesIncludedInUpdateByDefault() {
|
||||
return jaxbComponentSourceElement().isUpdate();
|
||||
}
|
||||
|
||||
public static class EmbeddableJaxbSourceImpl extends AbstractEmbeddableJaxbSource {
|
||||
private final JaxbComponentElement jaxbComponentElement;
|
||||
|
||||
public EmbeddableJaxbSourceImpl(JaxbComponentElement jaxbComponentElement) {
|
||||
this.jaxbComponentElement = jaxbComponentElement;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getClazz() {
|
||||
return jaxbComponentElement.getClazz();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String findParent() {
|
||||
return jaxbComponentElement.getParent() == null
|
||||
? null
|
||||
: jaxbComponentElement.getParent().getName();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String findTuplizer() {
|
||||
if ( jaxbComponentElement.getTuplizer() == null ) {
|
||||
return null;
|
||||
}
|
||||
|
||||
final EntityMode entityMode = StringHelper.isEmpty( jaxbComponentElement.getClazz() )
|
||||
? EntityMode.MAP
|
||||
: EntityMode.POJO;
|
||||
|
||||
for ( JaxbTuplizerElement tuplizerElement : jaxbComponentElement.getTuplizer() ) {
|
||||
if ( entityMode == EntityMode.parse( tuplizerElement.getEntityMode().value() ) ) {
|
||||
return tuplizerElement.getClazz();
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<JaxbPropertyElement> getPropertyElementList() {
|
||||
return jaxbComponentElement.getProperty();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<JaxbManyToOneElement> getManyToOneElementList() {
|
||||
return jaxbComponentElement.getManyToOne();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<JaxbOneToOneElement> getOneToOneElementList() {
|
||||
return jaxbComponentElement.getOneToOne();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<JaxbComponentElement> getComponentElementList() {
|
||||
return jaxbComponentElement.getComponent();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<JaxbDynamicComponentElement> getDynamicComponentElementList() {
|
||||
return jaxbComponentElement.getDynamicComponent();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<JaxbPropertiesElement> getPropertiesElementList() {
|
||||
return jaxbComponentElement.getProperties();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<JaxbAnyElement> getAnyElementList() {
|
||||
return jaxbComponentElement.getAny();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<JaxbMapElement> getMapElementList() {
|
||||
return jaxbComponentElement.getMap();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<JaxbSetElement> getSetElementList() {
|
||||
return jaxbComponentElement.getSet();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<JaxbListElement> getListElementList() {
|
||||
return jaxbComponentElement.getList();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<JaxbBagElement> getBagElementList() {
|
||||
return jaxbComponentElement.getBag();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<JaxbArrayElement> getArrayElementList() {
|
||||
return jaxbComponentElement.getArray();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<JaxbPrimitiveArrayElement> getPrimitiveArrayElementList() {
|
||||
return jaxbComponentElement.getPrimitiveArray();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,734 +0,0 @@
|
|||
/*
|
||||
* 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.internal.hbm;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
import org.hibernate.EntityMode;
|
||||
import org.hibernate.TruthValue;
|
||||
import org.hibernate.engine.OptimisticLockStyle;
|
||||
import org.hibernate.id.EntityIdentifierNature;
|
||||
import org.hibernate.internal.util.StringHelper;
|
||||
import org.hibernate.metamodel.reflite.spi.JavaTypeDescriptor;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbClassElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbCompositeIdElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbDiscriminatorElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbKeyManyToOneElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbKeyPropertyElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbMultiTenancyElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbPolymorphismAttribute;
|
||||
import org.hibernate.metamodel.source.spi.AggregatedCompositeIdentifierSource;
|
||||
import org.hibernate.metamodel.source.spi.AttributeSource;
|
||||
import org.hibernate.metamodel.source.spi.AttributeSourceContainer;
|
||||
import org.hibernate.metamodel.source.spi.DiscriminatorSource;
|
||||
import org.hibernate.metamodel.source.spi.EmbeddableSource;
|
||||
import org.hibernate.metamodel.source.spi.EmbeddedAttributeSource;
|
||||
import org.hibernate.metamodel.source.spi.EntityHierarchySource;
|
||||
import org.hibernate.metamodel.source.spi.EntitySource;
|
||||
import org.hibernate.metamodel.source.spi.IdentifierSource;
|
||||
import org.hibernate.metamodel.source.spi.MappingException;
|
||||
import org.hibernate.metamodel.source.spi.MapsIdSource;
|
||||
import org.hibernate.metamodel.source.spi.MultiTenancySource;
|
||||
import org.hibernate.metamodel.source.spi.NonAggregatedCompositeIdentifierSource;
|
||||
import org.hibernate.metamodel.source.spi.RelationalValueSource;
|
||||
import org.hibernate.metamodel.source.spi.SimpleIdentifierSource;
|
||||
import org.hibernate.metamodel.source.spi.SingularAttributeSource;
|
||||
import org.hibernate.metamodel.source.spi.SizeSource;
|
||||
import org.hibernate.metamodel.source.spi.ToolingHintSource;
|
||||
import org.hibernate.metamodel.source.spi.VersionAttributeSource;
|
||||
import org.hibernate.metamodel.spi.AttributePath;
|
||||
import org.hibernate.metamodel.spi.AttributeRole;
|
||||
import org.hibernate.metamodel.spi.LocalBindingContext;
|
||||
import org.hibernate.metamodel.spi.NaturalIdMutability;
|
||||
import org.hibernate.metamodel.spi.binding.Caching;
|
||||
import org.hibernate.metamodel.spi.binding.IdentifierGeneratorDefinition;
|
||||
import org.hibernate.metamodel.spi.binding.InheritanceType;
|
||||
|
||||
import org.jboss.logging.Logger;
|
||||
|
||||
/**
|
||||
* @author Steve Ebersole
|
||||
*/
|
||||
public class EntityHierarchySourceImpl implements EntityHierarchySource {
|
||||
private static final Logger log = Logger.getLogger( EntityHierarchySourceImpl.class );
|
||||
|
||||
private final RootEntitySourceImpl rootEntitySource;
|
||||
private InheritanceType hierarchyInheritanceType = InheritanceType.NO_INHERITANCE;
|
||||
private final Caching caching;
|
||||
private final Caching naturalIdCaching;
|
||||
|
||||
public EntityHierarchySourceImpl(RootEntitySourceImpl rootEntitySource) {
|
||||
this.rootEntitySource = rootEntitySource;
|
||||
this.rootEntitySource.injectHierarchy( this );
|
||||
|
||||
this.caching = Helper.createCaching( entityElement().getCache() );
|
||||
this.naturalIdCaching = Helper.createNaturalIdCaching(
|
||||
rootEntitySource.entityElement().getNaturalIdCache()
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public InheritanceType getHierarchyInheritanceType() {
|
||||
return hierarchyInheritanceType;
|
||||
}
|
||||
|
||||
@Override
|
||||
public EntitySource getRoot() {
|
||||
return rootEntitySource;
|
||||
}
|
||||
|
||||
public void processSubclass(SubclassEntitySourceImpl subclassEntitySource) {
|
||||
final InheritanceType inheritanceType = Helper.interpretInheritanceType( subclassEntitySource.entityElement() );
|
||||
if ( hierarchyInheritanceType == InheritanceType.NO_INHERITANCE ) {
|
||||
hierarchyInheritanceType = inheritanceType;
|
||||
}
|
||||
else if ( hierarchyInheritanceType != inheritanceType ) {
|
||||
throw new MappingException( "Mixed inheritance strategies not supported", subclassEntitySource.getOrigin() );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
protected JaxbClassElement entityElement() {
|
||||
return rootEntitySource.entityElement();
|
||||
}
|
||||
|
||||
@Override
|
||||
public IdentifierSource getIdentifierSource() {
|
||||
if ( entityElement().getId() == null && entityElement().getCompositeId() == null ) {
|
||||
throw rootEntitySource.getLocalBindingContext().makeMappingException(
|
||||
String.format( "Entity [%s] did not define an identifier", rootEntitySource.getEntityName() )
|
||||
);
|
||||
}
|
||||
|
||||
if ( entityElement().getId() != null ) {
|
||||
return new SimpleIdentifierSourceImpl();
|
||||
}
|
||||
else {
|
||||
// if we get here, we should have a composite identifier. Just need
|
||||
// to determine if it is aggregated, or non-aggregated...
|
||||
if ( StringHelper.isEmpty( entityElement().getCompositeId().getName() ) ) {
|
||||
if ( entityElement().getCompositeId().isMapped() &&
|
||||
StringHelper.isEmpty( entityElement().getCompositeId().getClazz() ) ) {
|
||||
throw makeMappingException( "mapped composite identifier must name component class to use." );
|
||||
}
|
||||
return new NonAggregatedCompositeIdentifierSourceImpl();
|
||||
}
|
||||
else {
|
||||
if ( entityElement().getCompositeId().isMapped() ) {
|
||||
throw makeMappingException("cannot combine mapped=\"true\" with specified name");
|
||||
}
|
||||
return new AggregatedCompositeIdentifierSourceImpl();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected MappingException makeMappingException(String message) {
|
||||
return rootEntitySource.bindingContext().makeMappingException( message );
|
||||
}
|
||||
|
||||
protected MappingException makeMappingException(String message, Exception cause) {
|
||||
return rootEntitySource.bindingContext().makeMappingException( message, cause );
|
||||
}
|
||||
|
||||
@Override
|
||||
public VersionAttributeSource getVersionAttributeSource() {
|
||||
if ( entityElement().getVersion() != null ) {
|
||||
return new VersionAttributeSourceImpl(
|
||||
rootEntitySource.sourceMappingDocument(),
|
||||
rootEntitySource,
|
||||
entityElement().getVersion()
|
||||
);
|
||||
}
|
||||
else if ( entityElement().getTimestamp() != null ) {
|
||||
return new TimestampAttributeSourceImpl(
|
||||
rootEntitySource.sourceMappingDocument(),
|
||||
rootEntitySource,
|
||||
entityElement().getTimestamp()
|
||||
);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public EntityMode getEntityMode() {
|
||||
return rootEntitySource.determineEntityMode();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isMutable() {
|
||||
return entityElement().isMutable();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isExplicitPolymorphism() {
|
||||
return JaxbPolymorphismAttribute.EXPLICIT == entityElement().getPolymorphism();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getWhere() {
|
||||
return entityElement().getWhere();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getRowId() {
|
||||
return entityElement().getRowid();
|
||||
}
|
||||
|
||||
@Override
|
||||
public OptimisticLockStyle getOptimisticLockStyle() {
|
||||
final String optimisticLockModeString = Helper.getValue( entityElement().getOptimisticLock().value(), "version" );
|
||||
try {
|
||||
return OptimisticLockStyle.valueOf( optimisticLockModeString.toUpperCase() );
|
||||
}
|
||||
catch ( Exception e ) {
|
||||
throw new MappingException(
|
||||
"Unknown optimistic-lock value : " + optimisticLockModeString,
|
||||
rootEntitySource.sourceMappingDocument().getOrigin()
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Caching getCaching() {
|
||||
return caching;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Caching getNaturalIdCaching() {
|
||||
return naturalIdCaching;
|
||||
}
|
||||
|
||||
@Override
|
||||
public DiscriminatorSource getDiscriminatorSource() {
|
||||
final JaxbDiscriminatorElement discriminatorElement = entityElement().getDiscriminator();
|
||||
if ( discriminatorElement == null ) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return new DiscriminatorSource() {
|
||||
@Override
|
||||
public RelationalValueSource getDiscriminatorRelationalValueSource() {
|
||||
SizeSource sizeSource = Helper.createSizeSourceIfMapped( discriminatorElement.getLength(), null, null );
|
||||
if ( StringHelper.isNotEmpty( discriminatorElement.getColumnAttribute() ) || sizeSource != null ) {
|
||||
return new ColumnAttributeSourceImpl(
|
||||
rootEntitySource.sourceMappingDocument(),
|
||||
null, // root table
|
||||
discriminatorElement.getColumnAttribute(),
|
||||
sizeSource,
|
||||
discriminatorElement.isInsert() ? TruthValue.TRUE : TruthValue.FALSE,
|
||||
discriminatorElement.isInsert() ? TruthValue.TRUE : TruthValue.FALSE,
|
||||
discriminatorElement.isNotNull() ? TruthValue.FALSE : TruthValue.TRUE
|
||||
);
|
||||
}
|
||||
else if ( StringHelper.isNotEmpty( discriminatorElement.getFormulaAttribute() ) ) {
|
||||
return new FormulaImpl(
|
||||
rootEntitySource.sourceMappingDocument(),
|
||||
null,
|
||||
discriminatorElement.getFormulaAttribute()
|
||||
);
|
||||
}
|
||||
else if ( discriminatorElement.getColumn() != null ) {
|
||||
return new ColumnSourceImpl(
|
||||
rootEntitySource.sourceMappingDocument(),
|
||||
null, // root table
|
||||
discriminatorElement.getColumn(),
|
||||
discriminatorElement.isInsert() ? TruthValue.TRUE : TruthValue.FALSE,
|
||||
discriminatorElement.isInsert() ? TruthValue.TRUE : TruthValue.FALSE
|
||||
);
|
||||
}
|
||||
else if ( StringHelper.isNotEmpty( discriminatorElement.getFormula() ) ) {
|
||||
return new FormulaImpl(
|
||||
rootEntitySource.sourceMappingDocument(),
|
||||
null,
|
||||
discriminatorElement.getFormula()
|
||||
);
|
||||
}
|
||||
else {
|
||||
log.debug( "No source for discriminator column/formula found" );
|
||||
return new ColumnAttributeSourceImpl(
|
||||
rootEntitySource.sourceMappingDocument(),
|
||||
null, // root table
|
||||
"class", // the default discriminator column name per-legacy hbm binding
|
||||
sizeSource,
|
||||
discriminatorElement.isInsert() ? TruthValue.TRUE : TruthValue.FALSE,
|
||||
discriminatorElement.isInsert() ? TruthValue.TRUE : TruthValue.FALSE,
|
||||
discriminatorElement.isNotNull() ? TruthValue.FALSE : TruthValue.TRUE
|
||||
);
|
||||
// throw makeMappingException( "could not determine source of discriminator mapping" );
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getExplicitHibernateTypeName() {
|
||||
return discriminatorElement.getType();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isForced() {
|
||||
return discriminatorElement.isForce();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isInserted() {
|
||||
return discriminatorElement.isInsert();
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@Override
|
||||
public MultiTenancySource getMultiTenancySource() {
|
||||
final JaxbMultiTenancyElement jaxbMultiTenancy = entityElement().getMultiTenancy();
|
||||
if ( jaxbMultiTenancy == null ) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return new MultiTenancySource() {
|
||||
@Override
|
||||
public RelationalValueSource getRelationalValueSource() {
|
||||
|
||||
if ( StringHelper.isNotEmpty( jaxbMultiTenancy.getColumnAttribute() ) ) {
|
||||
return new ColumnAttributeSourceImpl(
|
||||
rootEntitySource.sourceMappingDocument(),
|
||||
null, // root table
|
||||
jaxbMultiTenancy.getColumnAttribute(),
|
||||
null,
|
||||
TruthValue.TRUE,
|
||||
TruthValue.FALSE
|
||||
);
|
||||
}
|
||||
else if ( StringHelper.isNotEmpty( jaxbMultiTenancy.getFormulaAttribute() ) ) {
|
||||
return new FormulaImpl(
|
||||
rootEntitySource.sourceMappingDocument(),
|
||||
null,
|
||||
jaxbMultiTenancy.getFormulaAttribute()
|
||||
);
|
||||
}
|
||||
else if ( jaxbMultiTenancy.getColumn() != null ) {
|
||||
return new ColumnSourceImpl(
|
||||
rootEntitySource.sourceMappingDocument(),
|
||||
null, // root table
|
||||
jaxbMultiTenancy.getColumn(),
|
||||
TruthValue.TRUE,
|
||||
TruthValue.FALSE
|
||||
);
|
||||
}
|
||||
else if ( StringHelper.isNotEmpty( jaxbMultiTenancy.getFormula() ) ) {
|
||||
return new FormulaImpl(
|
||||
rootEntitySource.sourceMappingDocument(),
|
||||
null,
|
||||
jaxbMultiTenancy.getFormula()
|
||||
);
|
||||
}
|
||||
else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isShared() {
|
||||
return jaxbMultiTenancy.isShared();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean bindAsParameter() {
|
||||
return jaxbMultiTenancy.isBindAsParam();
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
private class SimpleIdentifierSourceImpl implements SimpleIdentifierSource {
|
||||
@Override
|
||||
public SingularAttributeSource getIdentifierAttributeSource() {
|
||||
return new SingularIdentifierAttributeSourceImpl( sourceMappingDocument(), rootEntitySource, entityElement().getId() );
|
||||
}
|
||||
|
||||
@Override
|
||||
public IdentifierGeneratorDefinition getIdentifierGeneratorDescriptor() {
|
||||
if ( entityElement().getId().getGenerator() != null ) {
|
||||
final String generatorName = entityElement().getId().getGenerator().getClazz();
|
||||
IdentifierGeneratorDefinition identifierGeneratorDefinition = sourceMappingDocument().getMappingLocalBindingContext()
|
||||
.getMetadataCollector()
|
||||
.getIdGenerator( generatorName );
|
||||
if ( identifierGeneratorDefinition == null ) {
|
||||
identifierGeneratorDefinition = new IdentifierGeneratorDefinition(
|
||||
getEntityName() + generatorName,
|
||||
generatorName,
|
||||
Helper.extractParameters( entityElement().getId().getGenerator().getParam() )
|
||||
);
|
||||
}
|
||||
return identifierGeneratorDefinition;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public EntityIdentifierNature getNature() {
|
||||
return EntityIdentifierNature.SIMPLE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getUnsavedValue() {
|
||||
return entityElement().getId().getUnsavedValue();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Collection<? extends ToolingHintSource> getToolingHintSources() {
|
||||
return entityElement().getId().getMeta();
|
||||
}
|
||||
}
|
||||
|
||||
private class AggregatedCompositeIdentifierSourceImpl implements AggregatedCompositeIdentifierSource {
|
||||
private final CompositeIdentifierEmbeddedAttributeSourceImpl componentAttributeSource
|
||||
= new CompositeIdentifierEmbeddedAttributeSourceImpl();
|
||||
|
||||
@Override
|
||||
public EmbeddedAttributeSource getIdentifierAttributeSource() {
|
||||
return componentAttributeSource;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<MapsIdSource> getMapsIdSources() {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
@Override
|
||||
public IdentifierGeneratorDefinition getIndividualAttributeIdGenerator(String identifierAttributeName) {
|
||||
// for now, return null. this is that stupid specj bs
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IdentifierGeneratorDefinition getIdentifierGeneratorDescriptor() {
|
||||
if ( entityElement().getCompositeId().getGenerator() != null ) {
|
||||
final String generatorName = entityElement().getCompositeId().getGenerator().getClazz();
|
||||
IdentifierGeneratorDefinition identifierGeneratorDefinition = sourceMappingDocument().getMappingLocalBindingContext()
|
||||
.getMetadataCollector()
|
||||
.getIdGenerator( generatorName );
|
||||
if ( identifierGeneratorDefinition == null ) {
|
||||
identifierGeneratorDefinition = new IdentifierGeneratorDefinition(
|
||||
getEntityName() + generatorName,
|
||||
generatorName,
|
||||
Helper.extractParameters( entityElement().getCompositeId().getGenerator().getParam() )
|
||||
);
|
||||
}
|
||||
return identifierGeneratorDefinition;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public EntityIdentifierNature getNature() {
|
||||
return EntityIdentifierNature.AGGREGATED_COMPOSITE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getUnsavedValue() {
|
||||
return entityElement().getCompositeId().getUnsavedValue().value();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Collection<? extends ToolingHintSource> getToolingHintSources() {
|
||||
return entityElement().getId().getMeta();
|
||||
}
|
||||
}
|
||||
|
||||
private class CompositeIdentifierEmbeddedAttributeSourceImpl extends AbstractEmbeddedAttributeSourceImpl {
|
||||
private final List<JaxbKeyPropertyElement> keyPropertyElementList;
|
||||
private final List<JaxbKeyManyToOneElement> keyManyToOneElementList;
|
||||
|
||||
protected CompositeIdentifierEmbeddedAttributeSourceImpl() {
|
||||
super(
|
||||
EntityHierarchySourceImpl.this.sourceMappingDocument(),
|
||||
rootEntitySource,
|
||||
rootEntitySource.getAttributeRoleBase().append( "id" ),
|
||||
rootEntitySource.getAttributePathBase().append( "id" ),
|
||||
entityElement().getCompositeId(),
|
||||
new EmbeddableJaxbSourceImpl( entityElement().getCompositeId() ),
|
||||
NaturalIdMutability.NOT_NATURAL_ID,
|
||||
null
|
||||
);
|
||||
|
||||
this.keyPropertyElementList = new ArrayList<JaxbKeyPropertyElement>();
|
||||
this.keyManyToOneElementList = new ArrayList<JaxbKeyManyToOneElement>();
|
||||
|
||||
final JaxbCompositeIdElement compositeIdElement = entityElement().getCompositeId();
|
||||
for ( final Object obj : compositeIdElement.getKeyPropertyOrKeyManyToOne() ) {
|
||||
if ( JaxbKeyPropertyElement.class.isInstance( obj ) ) {
|
||||
keyPropertyElementList.add( JaxbKeyPropertyElement.class.cast( obj ) );
|
||||
}
|
||||
else if ( JaxbKeyManyToOneElement.class.isInstance( obj ) ) {
|
||||
keyManyToOneElementList.add( JaxbKeyManyToOneElement.class.cast( obj ) );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isLazy() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public AttributePath getAttributePath() {
|
||||
return getEmbeddableSource().getAttributePathBase();
|
||||
}
|
||||
|
||||
@Override
|
||||
public AttributeRole getAttributeRole() {
|
||||
return getEmbeddableSource().getAttributeRoleBase();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isIncludedInOptimisticLocking() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean areValuesIncludedInInsertByDefault() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean areValuesIncludedInUpdateByDefault() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean areValuesNullableByDefault() {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
private class NonAggregatedCompositeIdentifierSourceImpl implements NonAggregatedCompositeIdentifierSource {
|
||||
private final List<SingularAttributeSource> attributeSources;
|
||||
private final EmbeddableSource idClassSource;
|
||||
|
||||
private NonAggregatedCompositeIdentifierSourceImpl() {
|
||||
this.attributeSources = new ArrayList<SingularAttributeSource>();
|
||||
collectCompositeIdAttributes( attributeSources, rootEntitySource );
|
||||
|
||||
// NOTE : the HBM support for IdClass is very limited. Essentially
|
||||
// we assume that all identifier attributes occur in the IdClass
|
||||
// using the same name and type.
|
||||
this.idClassSource = interpretIdClass();
|
||||
}
|
||||
|
||||
private EmbeddableSource interpretIdClass() {
|
||||
final JaxbCompositeIdElement compositeId = entityElement().getCompositeId();
|
||||
// if <composite-id/> is null here we have much bigger problems :)
|
||||
|
||||
final String className = compositeId.getClazz();
|
||||
if ( StringHelper.isEmpty( className ) ) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return new IdClassSource( rootEntitySource.getLocalBindingContext().typeDescriptor( className ) );
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<SingularAttributeSource> getAttributeSourcesMakingUpIdentifier() {
|
||||
return attributeSources;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public EmbeddableSource getIdClassSource() {
|
||||
return idClassSource;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IdentifierGeneratorDefinition getIndividualAttributeIdGenerator(String identifierAttributeName) {
|
||||
// for now, return null. this is that stupid specj bs
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IdentifierGeneratorDefinition getIdentifierGeneratorDescriptor() {
|
||||
if ( entityElement().getCompositeId().getGenerator() != null ) {
|
||||
final String generatorName = entityElement().getCompositeId().getGenerator().getClazz();
|
||||
IdentifierGeneratorDefinition identifierGeneratorDefinition = sourceMappingDocument().getMappingLocalBindingContext()
|
||||
.getMetadataCollector()
|
||||
.getIdGenerator( generatorName );
|
||||
if ( identifierGeneratorDefinition == null ) {
|
||||
identifierGeneratorDefinition = new IdentifierGeneratorDefinition(
|
||||
getEntityName() + generatorName,
|
||||
generatorName,
|
||||
Helper.extractParameters( entityElement().getCompositeId().getGenerator().getParam() )
|
||||
);
|
||||
}
|
||||
return identifierGeneratorDefinition;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public EntityIdentifierNature getNature() {
|
||||
return EntityIdentifierNature.NON_AGGREGATED_COMPOSITE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getUnsavedValue() {
|
||||
return entityElement().getCompositeId().getUnsavedValue().value();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Collection<? extends ToolingHintSource> getToolingHintSources() {
|
||||
return entityElement().getCompositeId().getMeta();
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
private void collectCompositeIdAttributes(
|
||||
List attributeSources,
|
||||
AttributeSourceContainer attributeSourceContainer) {
|
||||
final JaxbCompositeIdElement compositeId = entityElement().getCompositeId();
|
||||
final List list = compositeId.getKeyPropertyOrKeyManyToOne();
|
||||
for ( final Object obj : list ) {
|
||||
if ( JaxbKeyPropertyElement.class.isInstance( obj ) ) {
|
||||
JaxbKeyPropertyElement key = JaxbKeyPropertyElement.class.cast( obj );
|
||||
attributeSources.add(
|
||||
new IdentifierKeyAttributeSourceImpl(
|
||||
sourceMappingDocument(),
|
||||
attributeSourceContainer,
|
||||
key
|
||||
)
|
||||
);
|
||||
}
|
||||
if ( JaxbKeyManyToOneElement.class.isInstance( obj ) ) {
|
||||
JaxbKeyManyToOneElement key = JaxbKeyManyToOneElement.class.cast( obj );
|
||||
attributeSources.add(
|
||||
new IdentifierKeyManyToOneSourceImpl(
|
||||
sourceMappingDocument(),
|
||||
attributeSourceContainer,
|
||||
key
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private class IdClassSource implements EmbeddableSource {
|
||||
private final JavaTypeDescriptor idClassDescriptor;
|
||||
private final List<AttributeSource> attributeSources;
|
||||
|
||||
private IdClassSource(JavaTypeDescriptor idClassDescriptor) {
|
||||
this.idClassDescriptor = idClassDescriptor;
|
||||
this.attributeSources = new ArrayList<AttributeSource>();
|
||||
collectCompositeIdAttributes( attributeSources, this );
|
||||
}
|
||||
@Override
|
||||
public JavaTypeDescriptor getTypeDescriptor() {
|
||||
return idClassDescriptor;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getParentReferenceAttributeName() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getExplicitTuplizerClassName() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public AttributePath getAttributePathBase() {
|
||||
return rootEntitySource.getAttributePathBase().append( "<IdClass>" );
|
||||
}
|
||||
|
||||
@Override
|
||||
public AttributeRole getAttributeRoleBase() {
|
||||
return rootEntitySource.getAttributeRoleBase().append( "<IdClass>" );
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<AttributeSource> attributeSources() {
|
||||
return attributeSources;
|
||||
}
|
||||
|
||||
@Override
|
||||
public LocalBindingContext getLocalBindingContext() {
|
||||
return rootEntitySource.getLocalBindingContext();
|
||||
}
|
||||
}
|
||||
|
||||
public static class EmbeddableJaxbSourceImpl extends AbstractEmbeddableJaxbSource {
|
||||
private final JaxbCompositeIdElement compositeIdElement;
|
||||
|
||||
private final List<JaxbKeyPropertyElement> keyPropertyElementList;
|
||||
private final List<JaxbKeyManyToOneElement> keyManyToOneElementList;
|
||||
|
||||
public EmbeddableJaxbSourceImpl(JaxbCompositeIdElement compositeIdElement) {
|
||||
this.compositeIdElement = compositeIdElement;
|
||||
|
||||
this.keyPropertyElementList = new ArrayList<JaxbKeyPropertyElement>();
|
||||
this.keyManyToOneElementList = new ArrayList<JaxbKeyManyToOneElement>();
|
||||
|
||||
for ( final Object obj : compositeIdElement.getKeyPropertyOrKeyManyToOne() ) {
|
||||
if ( JaxbKeyPropertyElement.class.isInstance( obj ) ) {
|
||||
keyPropertyElementList.add( JaxbKeyPropertyElement.class.cast( obj ) );
|
||||
}
|
||||
else if ( JaxbKeyManyToOneElement.class.isInstance( obj ) ) {
|
||||
keyManyToOneElementList.add( JaxbKeyManyToOneElement.class.cast( obj ) );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getClazz() {
|
||||
return compositeIdElement.getClazz();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String findParent() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String findTuplizer() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<JaxbKeyPropertyElement> getKeyPropertyElementList() {
|
||||
return keyPropertyElementList;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<JaxbKeyManyToOneElement> getKeyManyToOneElementList() {
|
||||
return keyManyToOneElementList;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private String getEntityName() {
|
||||
return rootEntitySource.getEntityName();
|
||||
}
|
||||
|
||||
private MappingDocument sourceMappingDocument() {
|
||||
return rootEntitySource.sourceMappingDocument();
|
||||
}
|
||||
}
|
|
@ -1,94 +0,0 @@
|
|||
/*
|
||||
* Hibernate, Relational Persistence for Idiomatic Java
|
||||
*
|
||||
* Copyright (c) 2012, Red Hat Inc. or third-party contributors as
|
||||
* indicated by the @author tags or express copyright attribution
|
||||
* statements applied by the authors. All third-party contributions are
|
||||
* distributed under license by Red Hat Inc.
|
||||
*
|
||||
* This copyrighted material is made available to anyone wishing to use, modify,
|
||||
* copy, or redistribute it subject to the terms and conditions of the GNU
|
||||
* Lesser General Public License, as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
|
||||
* for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this distribution; if not, write to:
|
||||
* Free Software Foundation, Inc.
|
||||
* 51 Franklin Street, Fifth Floor
|
||||
* Boston, MA 02110-1301 USA
|
||||
*/
|
||||
package org.hibernate.metamodel.source.internal.hbm;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbFetchProfileElement;
|
||||
import org.hibernate.metamodel.source.spi.FetchProfileSource;
|
||||
|
||||
/**
|
||||
* @author Steve Ebersole
|
||||
*/
|
||||
public class FetchProfileSourceImpl
|
||||
extends AbstractHbmSourceNode
|
||||
implements FetchProfileSource {
|
||||
|
||||
private final String name;
|
||||
private final List<AssociationOverrideSource> associationOverrideSources;
|
||||
|
||||
public FetchProfileSourceImpl(
|
||||
MappingDocument mappingDocument,
|
||||
JaxbFetchProfileElement fetchProfileElement) {
|
||||
super( mappingDocument );
|
||||
this.name = fetchProfileElement.getName();
|
||||
this.associationOverrideSources = buildAssociationOverrideSources( fetchProfileElement );
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Iterable<AssociationOverrideSource> getAssociationOverrides() {
|
||||
return associationOverrideSources;
|
||||
}
|
||||
|
||||
private static List<AssociationOverrideSource> buildAssociationOverrideSources(JaxbFetchProfileElement fetchProfileElement) {
|
||||
final List<AssociationOverrideSource> associationOverrideSources = new ArrayList<AssociationOverrideSource>();
|
||||
for ( JaxbFetchProfileElement.JaxbFetch fetch : fetchProfileElement.getFetch() ) {
|
||||
associationOverrideSources.add( new AssociationOverrideSourceImpl( fetch ) );
|
||||
}
|
||||
return associationOverrideSources;
|
||||
}
|
||||
|
||||
private static class AssociationOverrideSourceImpl implements AssociationOverrideSource {
|
||||
private final String entityName;
|
||||
private final String attributeName;
|
||||
private final String fetchMode;
|
||||
|
||||
private AssociationOverrideSourceImpl(JaxbFetchProfileElement.JaxbFetch fetchElement) {
|
||||
this.entityName = fetchElement.getEntity();
|
||||
this.attributeName = fetchElement.getAssociation();
|
||||
this.fetchMode = fetchElement.getStyle().value();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getEntityName() {
|
||||
return entityName;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getAttributeName() {
|
||||
return attributeName;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getFetchModeName() {
|
||||
return fetchMode;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,97 +0,0 @@
|
|||
/*
|
||||
* Hibernate, Relational Persistence for Idiomatic Java
|
||||
*
|
||||
* Copyright (c) 2012, Red Hat Inc. or third-party contributors as
|
||||
* indicated by the @author tags or express copyright attribution
|
||||
* statements applied by the authors. All third-party contributions are
|
||||
* distributed under license by Red Hat Inc.
|
||||
*
|
||||
* This copyrighted material is made available to anyone wishing to use, modify,
|
||||
* copy, or redistribute it subject to the terms and conditions of the GNU
|
||||
* Lesser General Public License, as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
|
||||
* for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this distribution; if not, write to:
|
||||
* Free Software Foundation, Inc.
|
||||
* 51 Franklin Street, Fifth Floor
|
||||
* Boston, MA 02110-1301 USA
|
||||
*/
|
||||
package org.hibernate.metamodel.source.internal.hbm;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import javax.xml.bind.JAXBElement;
|
||||
|
||||
import org.hibernate.internal.util.StringHelper;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbFilterDefElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbFilterParamElement;
|
||||
import org.hibernate.metamodel.source.spi.FilterDefinitionSource;
|
||||
import org.hibernate.metamodel.source.spi.FilterParameterSource;
|
||||
|
||||
/**
|
||||
* @author Steve Ebersole
|
||||
*/
|
||||
public class FilterDefinitionSourceImpl
|
||||
extends AbstractHbmSourceNode
|
||||
implements FilterDefinitionSource {
|
||||
private final String name;
|
||||
private final String condition;
|
||||
private List<FilterParameterSource> parameterSources;
|
||||
|
||||
public FilterDefinitionSourceImpl(
|
||||
MappingDocument mappingDocument,
|
||||
JaxbFilterDefElement filterDefElement) {
|
||||
super( mappingDocument );
|
||||
this.name = filterDefElement.getName();
|
||||
|
||||
String conditionAttribute = filterDefElement.getCondition();
|
||||
String conditionContent = null;
|
||||
|
||||
final List<FilterParameterSource> parameterSources = new ArrayList<FilterParameterSource>();
|
||||
for ( Object content : filterDefElement.getContent() ) {
|
||||
if ( String.class.isInstance( content ) ){
|
||||
final String str = content.toString();
|
||||
if ( !StringHelper.isEmptyOrWhiteSpace( str ) ) {
|
||||
conditionContent = str.trim();
|
||||
}
|
||||
}
|
||||
else if ( JAXBElement.class.isInstance( content ) ) {
|
||||
JAXBElement jaxbElement = JAXBElement.class.cast( content );
|
||||
if ( jaxbElement.getDeclaredType() == JaxbFilterParamElement.class ) {
|
||||
parameterSources.add(
|
||||
(JaxbFilterParamElement) jaxbElement.getValue()
|
||||
);
|
||||
}
|
||||
}
|
||||
else {
|
||||
parameterSources.add(
|
||||
( JaxbFilterParamElement)content
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
this.condition = Helper.coalesce( conditionContent, conditionAttribute );
|
||||
this.parameterSources = parameterSources;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getCondition() {
|
||||
return condition;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Iterable<FilterParameterSource> getParameterSources() {
|
||||
return parameterSources;
|
||||
}
|
||||
|
||||
}
|
|
@ -1,110 +0,0 @@
|
|||
/*
|
||||
* Hibernate, Relational Persistence for Idiomatic Java
|
||||
*
|
||||
* Copyright (c) 2012, Red Hat Inc. or third-party contributors as
|
||||
* indicated by the @author tags or express copyright attribution
|
||||
* statements applied by the authors. All third-party contributions are
|
||||
* distributed under license by Red Hat Inc.
|
||||
*
|
||||
* This copyrighted material is made available to anyone wishing to use, modify,
|
||||
* copy, or redistribute it subject to the terms and conditions of the GNU
|
||||
* Lesser General Public License, as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
|
||||
* for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this distribution; if not, write to:
|
||||
* Free Software Foundation, Inc.
|
||||
* 51 Franklin Street, Fifth Floor
|
||||
* Boston, MA 02110-1301 USA
|
||||
*/
|
||||
package org.hibernate.metamodel.source.internal.hbm;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import org.hibernate.internal.util.StringHelper;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbFilterAliasMappingType;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbFilterElement;
|
||||
import org.hibernate.metamodel.source.spi.FilterSource;
|
||||
|
||||
/**
|
||||
* @author Steve Ebersole
|
||||
*/
|
||||
public class FilterSourceImpl
|
||||
extends AbstractHbmSourceNode
|
||||
implements FilterSource {
|
||||
private final String name;
|
||||
private final String condition;
|
||||
private final boolean autoAliasInjection;
|
||||
private final Map<String, String> aliasTableMap = new HashMap<String, String>();
|
||||
private final Map<String, String> aliasEntityMap = new HashMap<String, String>();
|
||||
|
||||
public FilterSourceImpl(
|
||||
MappingDocument mappingDocument,
|
||||
JaxbFilterElement filterElement) {
|
||||
super( mappingDocument );
|
||||
this.name = filterElement.getName();
|
||||
|
||||
String explicitAutoAliasInjectionSetting = filterElement.getAutoAliasInjection();
|
||||
|
||||
String conditionAttribute = filterElement.getCondition();
|
||||
String conditionContent = null;
|
||||
|
||||
for ( Serializable content : filterElement.getContent() ) {
|
||||
if ( String.class.isInstance( content ) ) {
|
||||
final String str = content.toString();
|
||||
if ( !StringHelper.isEmptyOrWhiteSpace( str ) ) {
|
||||
conditionContent = str.trim();
|
||||
}
|
||||
}
|
||||
else {
|
||||
final JaxbFilterAliasMappingType aliasMapping = JaxbFilterAliasMappingType.class.cast( content );
|
||||
if ( StringHelper.isNotEmpty( aliasMapping.getTable() ) ) {
|
||||
aliasTableMap.put( aliasMapping.getAlias(), aliasMapping.getTable() );
|
||||
}
|
||||
else if ( StringHelper.isNotEmpty( aliasMapping.getEntity() ) ) {
|
||||
aliasEntityMap.put( aliasMapping.getAlias(), aliasMapping.getTable() );
|
||||
}
|
||||
else {
|
||||
throw mappingDocument.getMappingLocalBindingContext()
|
||||
.makeMappingException( "filter alias must define either table or entity attribute" );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
this.condition = Helper.coalesce( conditionContent, conditionAttribute );
|
||||
this.autoAliasInjection = StringHelper.isNotEmpty( explicitAutoAliasInjectionSetting )
|
||||
? Boolean.valueOf( explicitAutoAliasInjectionSetting )
|
||||
: true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getCondition() {
|
||||
return condition;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean shouldAutoInjectAliases() {
|
||||
return autoAliasInjection;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Map<String, String> getAliasToTableMap() {
|
||||
return aliasTableMap;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Map<String, String> getAliasToEntityMap() {
|
||||
return aliasEntityMap;
|
||||
}
|
||||
}
|
|
@ -1,57 +0,0 @@
|
|||
/*
|
||||
* 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.internal.hbm;
|
||||
|
||||
import org.hibernate.metamodel.source.spi.DerivedValueSource;
|
||||
|
||||
/**
|
||||
* @author Steve Ebersole
|
||||
*/
|
||||
class FormulaImpl
|
||||
extends AbstractHbmSourceNode
|
||||
implements DerivedValueSource {
|
||||
private String tableName;
|
||||
private final String expression;
|
||||
|
||||
FormulaImpl(MappingDocument mappingDocument, String tableName, String expression) {
|
||||
super( mappingDocument );
|
||||
this.tableName = tableName;
|
||||
this.expression = expression;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Nature getNature() {
|
||||
return Nature.DERIVED;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getExpression() {
|
||||
return expression;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getContainingTableName() {
|
||||
return tableName;
|
||||
}
|
||||
}
|
|
@ -1,47 +0,0 @@
|
|||
/*
|
||||
* 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.internal.hbm;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.EntityElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbFetchProfileElement;
|
||||
import org.hibernate.metamodel.source.spi.MetaAttributeContext;
|
||||
import org.hibernate.metamodel.spi.LocalBindingContext;
|
||||
|
||||
/**
|
||||
* Defines features specific to the {@code hbm.xml} variety of a {@link org.hibernate.metamodel.spi.BindingContext}
|
||||
*
|
||||
* @author Steve Ebersole
|
||||
*/
|
||||
public interface HbmBindingContext extends LocalBindingContext {
|
||||
public boolean isAutoImport();
|
||||
|
||||
public MetaAttributeContext getMetaAttributeContext();
|
||||
|
||||
public String determineEntityName(EntityElement entityElement);
|
||||
|
||||
public void processFetchProfiles(List<JaxbFetchProfileElement> fetchProfiles, String containingEntityName);
|
||||
|
||||
}
|
|
@ -1,117 +0,0 @@
|
|||
/*
|
||||
* Hibernate, Relational Persistence for Idiomatic Java
|
||||
*
|
||||
* Copyright (c) 2012, Red Hat Inc. or third-party contributors as
|
||||
* indicated by the @author tags or express copyright attribution
|
||||
* statements applied by the authors. All third-party contributions are
|
||||
* distributed under license by Red Hat Inc.
|
||||
*
|
||||
* This copyrighted material is made available to anyone wishing to use, modify,
|
||||
* copy, or redistribute it subject to the terms and conditions of the GNU
|
||||
* Lesser General Public License, as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
|
||||
* for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this distribution; if not, write to:
|
||||
* Free Software Foundation, Inc.
|
||||
* 51 Franklin Street, Fifth Floor
|
||||
* Boston, MA 02110-1301 USA
|
||||
*/
|
||||
package org.hibernate.metamodel.source.internal.hbm;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
import org.hibernate.internal.util.collections.CollectionHelper;
|
||||
import org.hibernate.metamodel.MetadataSources;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbHibernateMapping;
|
||||
import org.hibernate.metamodel.source.spi.EntityHierarchySource;
|
||||
import org.hibernate.metamodel.source.spi.FilterDefinitionSource;
|
||||
import org.hibernate.metamodel.source.spi.IdentifierGeneratorSource;
|
||||
import org.hibernate.metamodel.source.spi.TypeDescriptorSource;
|
||||
import org.hibernate.metamodel.spi.BindingContext;
|
||||
import org.hibernate.metamodel.spi.MetadataSourceProcessor;
|
||||
import org.hibernate.xml.spi.BindResult;
|
||||
|
||||
import static java.util.Collections.emptyList;
|
||||
|
||||
/**
|
||||
* The {@link org.hibernate.metamodel.spi.MetadataSourceProcessor} implementation responsible for processing {@code hbm.xml} sources.
|
||||
*
|
||||
* @author Steve Ebersole
|
||||
*/
|
||||
public class HbmMetadataSourceProcessorImpl implements MetadataSourceProcessor {
|
||||
private final List<HibernateMappingProcessor> processors = new ArrayList<HibernateMappingProcessor>();
|
||||
private final List<EntityHierarchySource> entityHierarchies;
|
||||
|
||||
public HbmMetadataSourceProcessorImpl(BindingContext bindingContext, MetadataSources metadataSources) {
|
||||
this( bindingContext, metadataSources.getBindResultList() );
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public HbmMetadataSourceProcessorImpl(BindingContext bindingContext, List<BindResult> bindResults) {
|
||||
final HierarchyBuilder hierarchyBuilder = new HierarchyBuilder( bindingContext );
|
||||
|
||||
for ( BindResult bindResult : bindResults ) {
|
||||
if ( ! JaxbHibernateMapping.class.isInstance( bindResult.getRoot() ) ) {
|
||||
continue;
|
||||
}
|
||||
|
||||
final MappingDocument mappingDocument = new MappingDocument( bindResult, bindingContext );
|
||||
processors.add( new HibernateMappingProcessor( mappingDocument ) );
|
||||
|
||||
hierarchyBuilder.processMappingDocument( mappingDocument );
|
||||
}
|
||||
|
||||
this.entityHierarchies = hierarchyBuilder.groupEntityHierarchies();
|
||||
}
|
||||
|
||||
// todo : still need to deal with auxiliary database objects
|
||||
|
||||
@Override
|
||||
public Iterable<TypeDescriptorSource> extractTypeDefinitionSources() {
|
||||
if( CollectionHelper.isEmpty( processors )){
|
||||
return emptyList();
|
||||
}
|
||||
final List<TypeDescriptorSource> typeDescriptorSources = new ArrayList<TypeDescriptorSource>();
|
||||
for ( HibernateMappingProcessor processor : processors ) {
|
||||
processor.collectTypeDescriptorSources( typeDescriptorSources );
|
||||
}
|
||||
return typeDescriptorSources;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Iterable<FilterDefinitionSource> extractFilterDefinitionSources() {
|
||||
if( CollectionHelper.isEmpty( processors )){
|
||||
return emptyList();
|
||||
}
|
||||
final List<FilterDefinitionSource> filterDefinitionSources = new ArrayList<FilterDefinitionSource>();
|
||||
for ( HibernateMappingProcessor processor : processors ) {
|
||||
processor.collectFilterDefSources( filterDefinitionSources );
|
||||
}
|
||||
return filterDefinitionSources;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Iterable<IdentifierGeneratorSource> extractGlobalIdentifierGeneratorSources() {
|
||||
return emptyList();
|
||||
}
|
||||
|
||||
@Override
|
||||
@SuppressWarnings( {"unchecked", "RedundantCast"})
|
||||
public Collection<EntityHierarchySource> extractEntityHierarchies() {
|
||||
return entityHierarchies;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void processMappingDependentMetadata() {
|
||||
for ( HibernateMappingProcessor processor : processors ) {
|
||||
processor.processMappingDependentMetadata();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,479 +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.internal.hbm;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import org.hibernate.LockMode;
|
||||
import org.hibernate.TruthValue;
|
||||
import org.hibernate.cache.spi.access.AccessType;
|
||||
import org.hibernate.engine.spi.CascadeStyle;
|
||||
import org.hibernate.engine.spi.CascadeStyles;
|
||||
import org.hibernate.engine.spi.ExecuteUpdateResultCheckStyle;
|
||||
import org.hibernate.internal.util.StringHelper;
|
||||
import org.hibernate.internal.util.collections.CollectionHelper;
|
||||
import org.hibernate.metamodel.reflite.spi.JavaTypeDescriptor;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.EntityElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbCacheElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbColumnElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbJoinedSubclassElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbLockModeAttribute;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbNaturalIdCacheElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbParamElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbSqlDmlElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbSubclassElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbUnionSubclassElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.TableInformationSource;
|
||||
import org.hibernate.metamodel.source.spi.HibernateTypeSource;
|
||||
import org.hibernate.metamodel.source.spi.MetaAttributeContext;
|
||||
import org.hibernate.metamodel.source.spi.RelationalValueSource;
|
||||
import org.hibernate.metamodel.source.spi.SizeSource;
|
||||
import org.hibernate.metamodel.source.spi.TableSpecificationSource;
|
||||
import org.hibernate.metamodel.source.spi.ToolingHintSource;
|
||||
import org.hibernate.metamodel.spi.LocalBindingContext;
|
||||
import org.hibernate.metamodel.spi.binding.Caching;
|
||||
import org.hibernate.metamodel.spi.binding.CustomSQL;
|
||||
import org.hibernate.metamodel.spi.binding.InheritanceType;
|
||||
import org.hibernate.metamodel.spi.binding.MetaAttribute;
|
||||
|
||||
/**
|
||||
* @author Steve Ebersole
|
||||
* @author Gail Badner
|
||||
*/
|
||||
public class Helper {
|
||||
public static LockMode interpretLockMode(JaxbLockModeAttribute lockModeAttribute, LocalBindingContext context){
|
||||
if ( lockModeAttribute == null ) {
|
||||
return LockMode.READ;
|
||||
}
|
||||
switch ( lockModeAttribute ) {
|
||||
case NONE:
|
||||
return LockMode.NONE;
|
||||
case UPGRADE:
|
||||
return LockMode.UPGRADE;
|
||||
case UPGRADE_NOWAIT:
|
||||
return LockMode.UPGRADE_NOWAIT;
|
||||
case READ:
|
||||
return LockMode.READ;
|
||||
case WRITE:
|
||||
return LockMode.WRITE;
|
||||
case FORCE:
|
||||
return LockMode.FORCE;
|
||||
case OPTIMISTIC:
|
||||
return LockMode.OPTIMISTIC;
|
||||
case OPTIMISTIC_FORCE_INCREMENT:
|
||||
return LockMode.OPTIMISTIC_FORCE_INCREMENT;
|
||||
case PESSIMISTIC_READ:
|
||||
return LockMode.PESSIMISTIC_READ;
|
||||
case PESSIMISTIC_WRITE:
|
||||
return LockMode.PESSIMISTIC_WRITE;
|
||||
case PESSIMISTIC_FORCE_INCREMENT:
|
||||
return LockMode.PESSIMISTIC_FORCE_INCREMENT;
|
||||
default:
|
||||
throw context.makeMappingException( "unknown lock mode: "+lockModeAttribute );
|
||||
}
|
||||
}
|
||||
|
||||
public static InheritanceType interpretInheritanceType(EntityElement entityElement) {
|
||||
if ( JaxbSubclassElement.class.isInstance( entityElement ) ) {
|
||||
return InheritanceType.SINGLE_TABLE;
|
||||
}
|
||||
else if ( JaxbJoinedSubclassElement.class.isInstance( entityElement ) ) {
|
||||
return InheritanceType.JOINED;
|
||||
}
|
||||
else if ( JaxbUnionSubclassElement.class.isInstance( entityElement ) ) {
|
||||
return InheritanceType.TABLE_PER_CLASS;
|
||||
}
|
||||
else {
|
||||
return InheritanceType.NO_INHERITANCE;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Given a user-specified description of how to perform custom SQL, build the {@link CustomSQL} representation.
|
||||
*
|
||||
* @param customSqlElement User-specified description of how to perform custom SQL
|
||||
*
|
||||
* @return The {@link CustomSQL} representation
|
||||
*/
|
||||
public static CustomSQL buildCustomSql(JaxbSqlDmlElement customSqlElement) {
|
||||
if ( customSqlElement == null ) {
|
||||
return null;
|
||||
}
|
||||
final ExecuteUpdateResultCheckStyle checkStyle = customSqlElement.getCheck() == null
|
||||
? customSqlElement.isCallable()
|
||||
? ExecuteUpdateResultCheckStyle.NONE
|
||||
: ExecuteUpdateResultCheckStyle.COUNT
|
||||
: ExecuteUpdateResultCheckStyle.fromExternalName( customSqlElement.getCheck().value() );
|
||||
return new CustomSQL( customSqlElement.getValue(), customSqlElement.isCallable(), checkStyle );
|
||||
}
|
||||
|
||||
/**
|
||||
* Given the user-specified entity mapping, determine the appropriate entity name
|
||||
*
|
||||
* @param entityElement The user-specified entity mapping
|
||||
* @param unqualifiedClassPackage The package to use for unqualified class names
|
||||
*
|
||||
* @return The appropriate entity name
|
||||
*/
|
||||
public static String determineEntityName(EntityElement entityElement, String unqualifiedClassPackage) {
|
||||
return entityElement.getEntityName() != null
|
||||
? entityElement.getEntityName()
|
||||
: qualifyIfNeeded( entityElement.getName(), unqualifiedClassPackage );
|
||||
}
|
||||
|
||||
public static Caching createCaching(JaxbCacheElement cacheElement) {
|
||||
if ( cacheElement == null ) {
|
||||
// I'd really rather this be UNKNOWN, but the annotation version resolves this to TRUE/FALSE
|
||||
return new Caching( TruthValue.FALSE );
|
||||
}
|
||||
|
||||
final AccessType accessType = AccessType.fromExternalName( cacheElement.getUsage().value() );
|
||||
final boolean cacheLazyProps = cacheElement.getInclude() == null
|
||||
|| !"non-lazy".equals( cacheElement.getInclude().value() );
|
||||
|
||||
return new Caching(
|
||||
cacheElement.getRegion(),
|
||||
accessType,
|
||||
cacheLazyProps,
|
||||
TruthValue.TRUE
|
||||
);
|
||||
}
|
||||
|
||||
public static Caching createNaturalIdCaching(JaxbNaturalIdCacheElement cacheElement) {
|
||||
if ( cacheElement == null ) {
|
||||
return new Caching( TruthValue.UNKNOWN );
|
||||
}
|
||||
|
||||
return new Caching(
|
||||
StringHelper.nullIfEmpty( cacheElement.getRegion() ),
|
||||
null,
|
||||
false,
|
||||
TruthValue.TRUE
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Qualify a (supposed class) name with the unqualified-class package name if it is not already qualified
|
||||
*
|
||||
* @param name The name
|
||||
* @param unqualifiedClassPackage The unqualified-class package name
|
||||
*
|
||||
* @return {@code null} if the incoming name was {@code null}; or the qualified name.
|
||||
*/
|
||||
public static String qualifyIfNeeded(String name, String unqualifiedClassPackage) {
|
||||
if ( name == null ) {
|
||||
return null;
|
||||
}
|
||||
if ( name.indexOf( '.' ) < 0 && unqualifiedClassPackage != null ) {
|
||||
return unqualifiedClassPackage + '.' + name;
|
||||
}
|
||||
return name;
|
||||
}
|
||||
|
||||
public static String getPropertyAccessorName(String access, boolean isEmbedded, String defaultAccess) {
|
||||
return getValue( access, isEmbedded ? "embedded" : defaultAccess );
|
||||
}
|
||||
|
||||
public static MetaAttributeContext extractMetaAttributeContext(
|
||||
List<? extends ToolingHintSource> metaAttributeSourceList,
|
||||
boolean onlyInheritable,
|
||||
MetaAttributeContext parentContext) {
|
||||
final MetaAttributeContext subContext = new MetaAttributeContext( parentContext );
|
||||
|
||||
for ( ToolingHintSource meta : metaAttributeSourceList ) {
|
||||
if ( onlyInheritable & !meta.isInheritable() ) {
|
||||
continue;
|
||||
}
|
||||
|
||||
final String name = meta.getName();
|
||||
final MetaAttribute inheritedMetaAttribute = parentContext.getMetaAttribute( name );
|
||||
MetaAttribute metaAttribute = subContext.getLocalMetaAttribute( name );
|
||||
if ( metaAttribute == null || metaAttribute == inheritedMetaAttribute ) {
|
||||
metaAttribute = new MetaAttribute( name );
|
||||
subContext.add( metaAttribute );
|
||||
}
|
||||
metaAttribute.addValue( meta.getValue() );
|
||||
}
|
||||
|
||||
return subContext;
|
||||
}
|
||||
|
||||
public static <T> T getValue(T value, T defaultValue){
|
||||
return value == null ? defaultValue : value;
|
||||
}
|
||||
|
||||
public static Set<CascadeStyle> interpretCascadeStyles(String cascades, LocalBindingContext bindingContext) {
|
||||
final Set<CascadeStyle> cascadeStyles = new HashSet<CascadeStyle>();
|
||||
if ( StringHelper.isEmpty( cascades ) ) {
|
||||
cascades = bindingContext.getMappingDefaults().getCascadeStyle();
|
||||
}
|
||||
for ( String cascade : StringHelper.split( " ,", cascades ) ) {
|
||||
cascadeStyles.add( CascadeStyles.getCascadeStyle( cascade ) );
|
||||
}
|
||||
return cascadeStyles;
|
||||
}
|
||||
|
||||
public static Map<String, String> extractParameters(List<JaxbParamElement> xmlParamElements) {
|
||||
if ( xmlParamElements == null || xmlParamElements.isEmpty() ) {
|
||||
return Collections.emptyMap();
|
||||
}
|
||||
final HashMap<String,String> params = new HashMap<String, String>();
|
||||
for ( JaxbParamElement paramElement : xmlParamElements ) {
|
||||
params.put( paramElement.getName(), paramElement.getValue() );
|
||||
}
|
||||
return params;
|
||||
}
|
||||
|
||||
public static SizeSource createSizeSourceIfMapped(Integer length, Integer precision, Integer scale) {
|
||||
if ( length != null || precision != null || scale != null ) {
|
||||
return new SizeSourceImpl( precision, scale, length );
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Operates like SQL coalesce expression, except empty strings are treated as null. Return the first non-empty value
|
||||
*
|
||||
* @param values The list of values.
|
||||
* @param <T> Generic type of values to coalesce
|
||||
*
|
||||
* @return The first non-empty value, or null if all values were empty
|
||||
*/
|
||||
public static <T> T coalesce(T... values) {
|
||||
if ( values == null ) {
|
||||
return null;
|
||||
}
|
||||
for ( T value : values ) {
|
||||
if ( value != null ) {
|
||||
if ( String.class.isInstance( value ) ) {
|
||||
if ( StringHelper.isNotEmpty( (String) value ) ) {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
else {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public static interface InLineViewNameInferrer {
|
||||
public String inferInLineViewName();
|
||||
}
|
||||
|
||||
public static TableSpecificationSource createTableSource(
|
||||
MappingDocument mappingDocument,
|
||||
TableInformationSource jaxbTableSource,
|
||||
InLineViewNameInferrer inLineViewNameInferrer) {
|
||||
if ( jaxbTableSource.getSubselectAttribute() == null && jaxbTableSource.getSubselect() == null ) {
|
||||
return new TableSourceImpl(
|
||||
mappingDocument,
|
||||
jaxbTableSource.getSchema(),
|
||||
jaxbTableSource.getCatalog(),
|
||||
jaxbTableSource.getTable()
|
||||
);
|
||||
}
|
||||
else {
|
||||
return new InLineViewSourceImpl(
|
||||
mappingDocument,
|
||||
jaxbTableSource.getSchema(),
|
||||
jaxbTableSource.getCatalog(),
|
||||
jaxbTableSource.getSubselectAttribute() != null
|
||||
? jaxbTableSource.getSubselectAttribute()
|
||||
: jaxbTableSource.getSubselect(),
|
||||
jaxbTableSource.getTable() == null
|
||||
? inLineViewNameInferrer.inferInLineViewName()
|
||||
: jaxbTableSource.getTable()
|
||||
);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* For things that define one or more "value sources" there is a lot of variance in terms of how they
|
||||
* look in the XML. As an example, consider {@code <property/>} which might have:<ul>
|
||||
* <li>a {@code column} XML attribute</li>
|
||||
* <li>a {@code formula} XML attribute</li>
|
||||
* <li>one or more nested {@code <column/>} XML elements</li>
|
||||
* <li>a {@code <formula/>} XML element</li>
|
||||
* </ul>
|
||||
* as opposed to {@code <timestamp/>} which can only have:<ul>
|
||||
* <li>a {@code column} XML attribute</li>
|
||||
* </ul>
|
||||
* <p/>
|
||||
* This class adapts those variances to a unified contract which is intended to be used in conjunction with
|
||||
* {@link #buildValueSources}.
|
||||
*/
|
||||
public static class ValueSourcesAdapter {
|
||||
public String getContainingTableName() {
|
||||
return null;
|
||||
}
|
||||
|
||||
public boolean isIncludedInInsertByDefault() {
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean isIncludedInUpdateByDefault() {
|
||||
return false;
|
||||
}
|
||||
|
||||
public String getColumnAttribute() {
|
||||
return null;
|
||||
}
|
||||
|
||||
public String getFormulaAttribute() {
|
||||
return null;
|
||||
}
|
||||
|
||||
public SizeSource getSizeSource() {
|
||||
return null;
|
||||
}
|
||||
|
||||
public List<JaxbColumnElement> getColumn(){
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
public List<String> getFormula(){
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
public boolean isForceNotNull() {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
private static void checkColumnOrFormulaElements(MappingDocument mappingDocument, ValueSourcesAdapter valueSourcesAdapter) {
|
||||
if ( CollectionHelper.isNotEmpty( valueSourcesAdapter.getColumn() ) || CollectionHelper.isNotEmpty(
|
||||
valueSourcesAdapter.getFormula()
|
||||
) ) {
|
||||
throw mappingDocument.getMappingLocalBindingContext().makeMappingException(
|
||||
"column/formula/size attribute may not be used together with <column>/<formula> subelement"
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Given a {@link ValueSourcesAdapter}, build the corresponding list of {@link RelationalValueSource}
|
||||
*
|
||||
* @param mappingDocument the mapping document
|
||||
* @param valueSourcesAdapter the adapter describing the value sources.
|
||||
*
|
||||
* @return The corresponding list.
|
||||
*/
|
||||
public static List<RelationalValueSource> buildValueSources(
|
||||
MappingDocument mappingDocument,
|
||||
ValueSourcesAdapter valueSourcesAdapter) {
|
||||
List<RelationalValueSource> result = new ArrayList<RelationalValueSource>();
|
||||
|
||||
if ( StringHelper.isNotEmpty( valueSourcesAdapter.getColumnAttribute() ) ) {
|
||||
// we have the XML defining a column attribute.
|
||||
// it is therefore illegal for there to also be any nested formula or column elements
|
||||
checkColumnOrFormulaElements(mappingDocument, valueSourcesAdapter);
|
||||
// it is also illegal for there to also be a formula attribute
|
||||
if ( StringHelper.isNotEmpty( valueSourcesAdapter.getFormulaAttribute() ) ) {
|
||||
throw mappingDocument.getMappingLocalBindingContext().makeMappingException(
|
||||
"column and formula attributes may not be used together"
|
||||
);
|
||||
}
|
||||
|
||||
result.add(
|
||||
new ColumnAttributeSourceImpl(
|
||||
mappingDocument,
|
||||
valueSourcesAdapter.getContainingTableName(),
|
||||
valueSourcesAdapter.getColumnAttribute(),
|
||||
valueSourcesAdapter.getSizeSource(),
|
||||
valueSourcesAdapter.isIncludedInInsertByDefault() ? TruthValue.TRUE : TruthValue.FALSE,
|
||||
valueSourcesAdapter.isIncludedInUpdateByDefault() ? TruthValue.TRUE : TruthValue.FALSE,
|
||||
valueSourcesAdapter.isForceNotNull() ? TruthValue.FALSE : TruthValue.UNKNOWN
|
||||
)
|
||||
);
|
||||
}
|
||||
else if ( StringHelper.isNotEmpty( valueSourcesAdapter.getFormulaAttribute() ) ) {
|
||||
// we have the XML defining a formula attribute (and not a column attribute)
|
||||
// it is therefore illegal for there to also be any nested formula or column elements
|
||||
checkColumnOrFormulaElements( mappingDocument, valueSourcesAdapter );
|
||||
// column/formula attribute combo checked already
|
||||
|
||||
result.add(
|
||||
new FormulaImpl(
|
||||
mappingDocument,
|
||||
valueSourcesAdapter.getContainingTableName(),
|
||||
valueSourcesAdapter.getFormulaAttribute()
|
||||
)
|
||||
);
|
||||
}
|
||||
else if ( valueSourcesAdapter.getSizeSource() != null ) {
|
||||
// we have XML defining a length, precision, and/or scale attribute with neither
|
||||
// a column nor formula attribute; assume this is a column.
|
||||
// it is therefore illegal for there to also be any nested formula or column elements
|
||||
checkColumnOrFormulaElements(mappingDocument, valueSourcesAdapter);
|
||||
result.add(
|
||||
new ColumnAttributeSourceImpl(
|
||||
mappingDocument,
|
||||
valueSourcesAdapter.getContainingTableName(),
|
||||
valueSourcesAdapter.getColumnAttribute(),
|
||||
valueSourcesAdapter.getSizeSource(),
|
||||
valueSourcesAdapter.isIncludedInInsertByDefault() ? TruthValue.TRUE : TruthValue.FALSE,
|
||||
valueSourcesAdapter.isIncludedInUpdateByDefault() ? TruthValue.TRUE : TruthValue.FALSE,
|
||||
valueSourcesAdapter.isForceNotNull() ? TruthValue.FALSE : TruthValue.UNKNOWN
|
||||
)
|
||||
);
|
||||
|
||||
}
|
||||
// we have the XML defining nested formula or column elements (and not column attribute nor formula attribute)
|
||||
if ( CollectionHelper.isNotEmpty( valueSourcesAdapter.getColumn() ) ) {
|
||||
for ( JaxbColumnElement column : valueSourcesAdapter.getColumn() ) {
|
||||
result.add(
|
||||
new ColumnSourceImpl(
|
||||
mappingDocument,
|
||||
valueSourcesAdapter.getContainingTableName(),
|
||||
column,
|
||||
valueSourcesAdapter.isIncludedInInsertByDefault() ? TruthValue.TRUE : TruthValue.FALSE,
|
||||
valueSourcesAdapter.isIncludedInUpdateByDefault() ? TruthValue.TRUE : TruthValue.FALSE,
|
||||
valueSourcesAdapter.isForceNotNull() ? TruthValue.FALSE : TruthValue.TRUE
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
if ( CollectionHelper.isNotEmpty( valueSourcesAdapter.getFormula() ) ) {
|
||||
for ( String formula : valueSourcesAdapter.getFormula() ) {
|
||||
result.add(
|
||||
new FormulaImpl(
|
||||
mappingDocument,
|
||||
valueSourcesAdapter.getContainingTableName(),
|
||||
formula
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
|
@ -1,322 +0,0 @@
|
|||
/*
|
||||
* Hibernate, Relational Persistence for Idiomatic Java
|
||||
*
|
||||
* Copyright (c) 2012, Red Hat Inc. or third-party contributors as
|
||||
* indicated by the @author tags or express copyright attribution
|
||||
* statements applied by the authors. All third-party contributions are
|
||||
* distributed under license by Red Hat Inc.
|
||||
*
|
||||
* This copyrighted material is made available to anyone wishing to use, modify,
|
||||
* copy, or redistribute it subject to the terms and conditions of the GNU
|
||||
* Lesser General Public License, as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
|
||||
* for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this distribution; if not, write to:
|
||||
* Free Software Foundation, Inc.
|
||||
* 51 Franklin Street, Fifth Floor
|
||||
* Boston, MA 02110-1301 USA
|
||||
*/
|
||||
package org.hibernate.metamodel.source.internal.hbm;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
import org.hibernate.boot.registry.classloading.spi.ClassLoaderService;
|
||||
import org.hibernate.boot.registry.classloading.spi.ClassLoadingException;
|
||||
import org.hibernate.internal.util.StringHelper;
|
||||
import org.hibernate.internal.util.collections.CollectionHelper;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.EntityElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbClassElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbDatabaseObjectElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbDialectScopeElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbFetchProfileElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbFilterDefElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbHibernateMapping;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbIdentifierGeneratorElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbImportElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbJoinedSubclassElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbQueryElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbResultsetElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbSqlQueryElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbSubclassElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbTypedefElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbUnionSubclassElement;
|
||||
import org.hibernate.metamodel.source.spi.FilterDefinitionSource;
|
||||
import org.hibernate.metamodel.source.spi.TypeDescriptorSource;
|
||||
import org.hibernate.metamodel.spi.InFlightMetadataCollector;
|
||||
import org.hibernate.metamodel.spi.binding.FetchProfile;
|
||||
import org.hibernate.metamodel.spi.relational.AuxiliaryDatabaseObject;
|
||||
import org.hibernate.metamodel.spi.relational.BasicAuxiliaryDatabaseObjectImpl;
|
||||
|
||||
/**
|
||||
* Responsible for processing a {@code <hibernate-mapping/>} element. Allows processing to be coordinated across
|
||||
* all hbm files in an ordered fashion. The order is essentially the same as defined in
|
||||
* {@link org.hibernate.metamodel.spi.MetadataSourceProcessor}
|
||||
*
|
||||
* @author Steve Ebersole
|
||||
* @author Strong Liu
|
||||
*/
|
||||
public class HibernateMappingProcessor {
|
||||
private final MappingDocument mappingDocument;
|
||||
|
||||
private final ClassLoaderService classLoaderService;
|
||||
|
||||
public HibernateMappingProcessor(MappingDocument mappingDocument) {
|
||||
this.mappingDocument = mappingDocument;
|
||||
this.classLoaderService = bindingContext().getBuildingOptions().getServiceRegistry().getService( ClassLoaderService.class );
|
||||
processDatabaseObjectDefinitions();
|
||||
processIdentifierGenerators();
|
||||
}
|
||||
|
||||
private InFlightMetadataCollector metadataCollector() {
|
||||
return bindingContext().getMetadataCollector();
|
||||
}
|
||||
|
||||
private JaxbHibernateMapping mappingRoot() {
|
||||
return mappingDocument.getMappingRoot();
|
||||
}
|
||||
|
||||
private HbmBindingContext bindingContext() {
|
||||
return mappingDocument.getMappingLocalBindingContext();
|
||||
}
|
||||
|
||||
private <T> Class<T> classForName(String name) {
|
||||
return classLoaderService.classForName( bindingContext().qualifyClassName( name ) );
|
||||
}
|
||||
|
||||
private void processDatabaseObjectDefinitions() {
|
||||
if ( mappingRoot().getDatabaseObject() == null ) {
|
||||
return;
|
||||
}
|
||||
|
||||
for ( JaxbDatabaseObjectElement databaseObjectElement : mappingRoot().getDatabaseObject() ) {
|
||||
final AuxiliaryDatabaseObject auxiliaryDatabaseObject;
|
||||
if ( databaseObjectElement.getDefinition() != null ) {
|
||||
final String className = databaseObjectElement.getDefinition().getClazz();
|
||||
try {
|
||||
auxiliaryDatabaseObject = (AuxiliaryDatabaseObject) classForName( className ).newInstance();
|
||||
}
|
||||
catch ( ClassLoadingException e ) {
|
||||
throw e;
|
||||
}
|
||||
catch ( Exception e ) {
|
||||
throw bindingContext().makeMappingException( "could not instantiate custom database object class [" + className + "]" );
|
||||
}
|
||||
}
|
||||
else {
|
||||
Set<String> dialectScopes = new HashSet<String>();
|
||||
if ( databaseObjectElement.getDialectScope() != null ) {
|
||||
for ( JaxbDialectScopeElement dialectScope : databaseObjectElement.getDialectScope() ) {
|
||||
dialectScopes.add( dialectScope.getName() );
|
||||
}
|
||||
}
|
||||
auxiliaryDatabaseObject = new BasicAuxiliaryDatabaseObjectImpl(
|
||||
metadataCollector().getDatabase().getDefaultSchema(),
|
||||
databaseObjectElement.getCreate(),
|
||||
databaseObjectElement.getDrop(),
|
||||
dialectScopes
|
||||
);
|
||||
}
|
||||
metadataCollector().getDatabase().addAuxiliaryDatabaseObject( auxiliaryDatabaseObject );
|
||||
}
|
||||
}
|
||||
|
||||
public void collectTypeDescriptorSources(List<TypeDescriptorSource> typeDescriptorSources) {
|
||||
if ( mappingRoot().getTypedef() == null ) {
|
||||
return;
|
||||
}
|
||||
|
||||
for ( JaxbTypedefElement typeDefElement : mappingRoot().getTypedef() ) {
|
||||
typeDescriptorSources.add( new TypeDescriptorSourceImpl( typeDefElement ) );
|
||||
}
|
||||
}
|
||||
|
||||
public void collectFilterDefSources(List<FilterDefinitionSource> filterDefinitionSources) {
|
||||
if ( mappingRoot().getFilterDef() == null ) {
|
||||
return;
|
||||
}
|
||||
|
||||
for ( JaxbFilterDefElement filterDefElement : mappingRoot().getFilterDef() ) {
|
||||
filterDefinitionSources.add( new FilterDefinitionSourceImpl( mappingDocument, filterDefElement ) );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private void processIdentifierGenerators() {
|
||||
if ( mappingRoot().getIdentifierGenerator() == null ) {
|
||||
return;
|
||||
}
|
||||
|
||||
for ( JaxbIdentifierGeneratorElement identifierGeneratorElement : mappingRoot().getIdentifierGenerator() ) {
|
||||
metadataCollector().registerIdentifierGenerator(
|
||||
identifierGeneratorElement.getName(),
|
||||
identifierGeneratorElement.getClazz()
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
public void processMappingDependentMetadata() {
|
||||
processFetchProfiles();
|
||||
processImports();
|
||||
processResultSetMappings();
|
||||
processNamedQueries();
|
||||
}
|
||||
|
||||
private void processFetchProfiles() {
|
||||
processFetchProfiles( mappingRoot().getFetchProfile(), null );
|
||||
for ( JaxbClassElement classElement : mappingRoot().getClazz() ) {
|
||||
processFetchProfile( classElement );
|
||||
|
||||
// processing fetch profiles defined in the <joined-subclass>
|
||||
processFetchProfilesInJoinedSubclass( classElement.getJoinedSubclass() );
|
||||
// <union-subclass>
|
||||
processFetchProfilesInUnionSubclass( classElement.getUnionSubclass() );
|
||||
// <subclass>
|
||||
processFetchProfilesInSubclass( classElement.getSubclass() );
|
||||
}
|
||||
}
|
||||
|
||||
private void processFetchProfilesInSubclass(List<JaxbSubclassElement> subclass) {
|
||||
for ( JaxbSubclassElement subclassElement : subclass ) {
|
||||
processFetchProfile( subclassElement );
|
||||
processFetchProfilesInSubclass( subclassElement.getSubclass() );
|
||||
}
|
||||
}
|
||||
|
||||
private void processFetchProfile(final EntityElement entityElement){
|
||||
processFetchProfiles(
|
||||
entityElement.getFetchProfile(),
|
||||
bindingContext().qualifyClassName( entityElement.getName() )
|
||||
);
|
||||
}
|
||||
|
||||
private void processFetchProfilesInUnionSubclass(List<JaxbUnionSubclassElement> unionSubclass) {
|
||||
for ( JaxbUnionSubclassElement subclassElement : unionSubclass ) {
|
||||
processFetchProfile( subclassElement );
|
||||
processFetchProfilesInUnionSubclass( subclassElement.getUnionSubclass() );
|
||||
}
|
||||
}
|
||||
|
||||
private void processFetchProfilesInJoinedSubclass(List<JaxbJoinedSubclassElement> joinedSubclassElements) {
|
||||
for ( JaxbJoinedSubclassElement subclassElement : joinedSubclassElements ) {
|
||||
processFetchProfile( subclassElement );
|
||||
processFetchProfilesInJoinedSubclass( subclassElement.getJoinedSubclass() );
|
||||
}
|
||||
}
|
||||
|
||||
public void processFetchProfiles(List<JaxbFetchProfileElement> fetchProfiles, String containingEntityName) {
|
||||
for ( JaxbFetchProfileElement fetchProfile : fetchProfiles ) {
|
||||
String profileName = fetchProfile.getName();
|
||||
Set<FetchProfile.Fetch> fetches = new HashSet<FetchProfile.Fetch>();
|
||||
for ( JaxbFetchProfileElement.JaxbFetch fetch : fetchProfile.getFetch() ) {
|
||||
String entityName = fetch.getEntity() == null ? containingEntityName : fetch.getEntity();
|
||||
if ( entityName == null ) {
|
||||
throw bindingContext().makeMappingException( "could not determine entity for fetch-profile fetch [" + profileName + "]:[" +
|
||||
fetch.getAssociation() + "]" );
|
||||
}
|
||||
fetches.add( new FetchProfile.Fetch( entityName, fetch.getAssociation(), fetch.getStyle().value() ) );
|
||||
}
|
||||
metadataCollector().addFetchProfile( new FetchProfile( profileName, fetches ) );
|
||||
}
|
||||
}
|
||||
|
||||
private void processImports() {
|
||||
JaxbHibernateMapping root = mappingRoot();
|
||||
for ( JaxbImportElement importValue : root.getImport() ) {
|
||||
String className = bindingContext().qualifyClassName( importValue.getClazz() );
|
||||
String rename = importValue.getRename();
|
||||
rename = ( rename == null ) ? StringHelper.unqualify( className ) : rename;
|
||||
metadataCollector().addImport( rename, className );
|
||||
}
|
||||
if ( root.isAutoImport() ) {
|
||||
processEntityElementsImport( root.getClazz() );
|
||||
processEntityElementsImport( root.getJoinedSubclass() );
|
||||
processEntityElementsImport( root.getUnionSubclass() );
|
||||
processEntityElementsImport( root.getSubclass() );
|
||||
}
|
||||
}
|
||||
|
||||
private void processEntityElementsImport(List<? extends EntityElement> entityElements) {
|
||||
for ( final EntityElement element : entityElements ) {
|
||||
processEntityElementImport( element );
|
||||
}
|
||||
}
|
||||
|
||||
private void processEntityElementImport(EntityElement entityElement) {
|
||||
final String qualifiedName = bindingContext().determineEntityName( entityElement );
|
||||
final String importName = entityElement.getEntityName() == null
|
||||
? entityElement.getName()
|
||||
: entityElement.getEntityName();
|
||||
metadataCollector().addImport( importName, qualifiedName );
|
||||
metadataCollector().addImport( StringHelper.unqualify( importName ), qualifiedName );
|
||||
|
||||
if ( JaxbClassElement.class.isInstance( entityElement ) ) {
|
||||
processEntityElementsImport( ( (JaxbClassElement) entityElement ).getSubclass() );
|
||||
processEntityElementsImport( ( (JaxbClassElement) entityElement ).getJoinedSubclass() );
|
||||
processEntityElementsImport( ( (JaxbClassElement) entityElement ).getUnionSubclass() );
|
||||
}
|
||||
else if ( JaxbSubclassElement.class.isInstance( entityElement ) ) {
|
||||
processEntityElementsImport( ( (JaxbSubclassElement) entityElement ).getSubclass() );
|
||||
}
|
||||
else if ( JaxbJoinedSubclassElement.class.isInstance( entityElement ) ) {
|
||||
processEntityElementsImport( ( (JaxbJoinedSubclassElement) entityElement ).getJoinedSubclass() );
|
||||
}
|
||||
else if ( JaxbUnionSubclassElement.class.isInstance( entityElement ) ) {
|
||||
processEntityElementsImport( ( (JaxbUnionSubclassElement) entityElement ).getUnionSubclass() );
|
||||
}
|
||||
}
|
||||
|
||||
private void processResultSetMappings() {
|
||||
List<JaxbResultsetElement> resultsetElements = new ArrayList<JaxbResultsetElement>();
|
||||
|
||||
addAllIfNotEmpty( resultsetElements, mappingRoot().getResultset() );
|
||||
findResultSets( resultsetElements, mappingRoot().getClazz() );
|
||||
findResultSets( resultsetElements, mappingRoot().getJoinedSubclass() );
|
||||
findResultSets( resultsetElements, mappingRoot().getUnionSubclass() );
|
||||
findResultSets( resultsetElements, mappingRoot().getSubclass() );
|
||||
if ( resultsetElements.isEmpty() ) {
|
||||
return;
|
||||
}
|
||||
for ( final JaxbResultsetElement element : resultsetElements ) {
|
||||
metadataCollector().addResultSetMapping(
|
||||
ResultSetMappingBinder.buildResultSetMappingDefinitions(
|
||||
element, bindingContext(), metadataCollector()
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private static void findResultSets(List<JaxbResultsetElement> resultsetElements, List<? extends EntityElement> entityElements) {
|
||||
for ( final EntityElement element : entityElements ) {
|
||||
addAllIfNotEmpty( resultsetElements, element.getResultset() );
|
||||
}
|
||||
}
|
||||
|
||||
private static void addAllIfNotEmpty(List target, List values) {
|
||||
if ( CollectionHelper.isNotEmpty( values ) ) {
|
||||
target.addAll( values );
|
||||
}
|
||||
}
|
||||
|
||||
private void processNamedQueries() {
|
||||
for ( final JaxbQueryElement element : mappingRoot().getQuery() ) {
|
||||
NamedQueryBindingHelper.bindNamedQuery( element, metadataCollector() );
|
||||
}
|
||||
for ( final JaxbSqlQueryElement element : mappingRoot().getSqlQuery() ) {
|
||||
NamedQueryBindingHelper.bindNamedSQLQuery(
|
||||
element,
|
||||
bindingContext(),
|
||||
metadataCollector()
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -1,226 +0,0 @@
|
|||
/*
|
||||
* 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.internal.hbm;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import org.hibernate.internal.CoreLogging;
|
||||
import org.hibernate.internal.CoreMessageLogger;
|
||||
import org.hibernate.internal.util.StringHelper;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.EntityElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbClassElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbHibernateMapping;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbJoinedSubclassElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbQueryElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbSqlQueryElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbSubclassElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbUnionSubclassElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.SubEntityElement;
|
||||
import org.hibernate.metamodel.source.spi.EntityHierarchySource;
|
||||
import org.hibernate.metamodel.source.spi.EntitySource;
|
||||
import org.hibernate.metamodel.source.spi.SubclassEntitySource;
|
||||
import org.hibernate.metamodel.spi.BindingContext;
|
||||
|
||||
/**
|
||||
* @author Steve Ebersole
|
||||
*/
|
||||
public class HierarchyBuilder {
|
||||
private static final CoreMessageLogger LOG = CoreLogging.messageLogger( HierarchyBuilder.class );
|
||||
|
||||
private final BindingContext bindingContext;
|
||||
|
||||
private final List<EntityHierarchySource> entityHierarchies = new ArrayList<EntityHierarchySource>();
|
||||
|
||||
// process state
|
||||
private final Map<String,AbstractEntitySourceImpl> subEntityContainerMap = new HashMap<String, AbstractEntitySourceImpl>();
|
||||
private final List<ExtendsQueueEntry> extendsQueue = new ArrayList<ExtendsQueueEntry>();
|
||||
|
||||
// mapping file specific state
|
||||
private MappingDocument currentMappingDocument;
|
||||
|
||||
public HierarchyBuilder(BindingContext bindingContext) {
|
||||
this.bindingContext = bindingContext;
|
||||
}
|
||||
|
||||
public void processMappingDocument(MappingDocument mappingDocument) {
|
||||
this.currentMappingDocument = mappingDocument;
|
||||
try {
|
||||
LOG.tracef( "Processing mapping document: %s ", mappingDocument.getOrigin() );
|
||||
processCurrentMappingDocument();
|
||||
}
|
||||
finally {
|
||||
this.currentMappingDocument = null;
|
||||
}
|
||||
}
|
||||
|
||||
private void processCurrentMappingDocument() {
|
||||
final JaxbHibernateMapping root = currentMappingDocument.getMappingRoot();
|
||||
for ( final JaxbClassElement jaxbClass : root.getClazz() ) {
|
||||
// we can immediately handle <class/> elements in terms of creating the hierarchy entry
|
||||
final RootEntitySourceImpl rootEntitySource = new RootEntitySourceImpl(
|
||||
currentMappingDocument,
|
||||
jaxbClass
|
||||
);
|
||||
final EntityHierarchySourceImpl hierarchy = new EntityHierarchySourceImpl( rootEntitySource );
|
||||
entityHierarchies.add( hierarchy );
|
||||
subEntityContainerMap.put( rootEntitySource.getEntityName(), rootEntitySource );
|
||||
processSubElements( jaxbClass, rootEntitySource );
|
||||
}
|
||||
List<SubEntityElement> subEntityElements = new ArrayList<SubEntityElement>( root.getJoinedSubclass() );
|
||||
subEntityElements.addAll( root.getUnionSubclass() );
|
||||
subEntityElements.addAll( root.getSubclass() );
|
||||
|
||||
for ( final SubEntityElement element : subEntityElements ) {
|
||||
processSubclassElement( element );
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void processSubclassElement(SubEntityElement element) {
|
||||
// we have to see if this things super-type has been found yet, and if not add it to the
|
||||
// extends queue
|
||||
final String entityItExtends = currentMappingDocument.getMappingLocalBindingContext()
|
||||
.qualifyClassName( element.getExtends() );
|
||||
final AbstractEntitySourceImpl container = subEntityContainerMap.get( entityItExtends );
|
||||
final SubclassEntitySourceImpl subClassEntitySource = createSubClassEntitySource( element, (EntitySource) container );
|
||||
final String entityName = subClassEntitySource.getEntityName();
|
||||
subEntityContainerMap.put( entityName, subClassEntitySource );
|
||||
processSubElements( element, subClassEntitySource );
|
||||
if ( container != null ) {
|
||||
// we already have this entity's super, attach it and continue
|
||||
container.add( subClassEntitySource );
|
||||
}
|
||||
else {
|
||||
// we do not yet have the super and have to wait, so add it fto the extends queue
|
||||
extendsQueue.add( new ExtendsQueueEntry( subClassEntitySource, entityItExtends ) );
|
||||
}
|
||||
}
|
||||
|
||||
public List<EntityHierarchySource> groupEntityHierarchies() {
|
||||
while ( ! extendsQueue.isEmpty() ) {
|
||||
// set up a pass over the queue
|
||||
int numberOfMappingsProcessed = 0;
|
||||
Iterator<ExtendsQueueEntry> iterator = extendsQueue.iterator();
|
||||
while ( iterator.hasNext() ) {
|
||||
final ExtendsQueueEntry entry = iterator.next();
|
||||
final AbstractEntitySourceImpl container = subEntityContainerMap.get( entry.entityItExtends );
|
||||
if ( container != null ) {
|
||||
// we now have this entity's super, attach it and remove entry from extends queue
|
||||
container.add( entry.subClassEntitySource );
|
||||
iterator.remove();
|
||||
numberOfMappingsProcessed++;
|
||||
}
|
||||
}
|
||||
|
||||
if ( numberOfMappingsProcessed == 0 ) {
|
||||
|
||||
// todo : we could log the waiting dependencies...
|
||||
throw currentMappingDocument.getMappingLocalBindingContext().makeMappingException( "Unable to process extends dependencies in hbm files" );
|
||||
}
|
||||
}
|
||||
|
||||
return entityHierarchies;
|
||||
}
|
||||
|
||||
private void processSubElements(EntityElement entityElement, AbstractEntitySourceImpl container) {
|
||||
if ( JaxbClassElement.class.isInstance( entityElement ) ) {
|
||||
final JaxbClassElement jaxbClass = (JaxbClassElement) entityElement;
|
||||
processElements( jaxbClass.getJoinedSubclass(), container );
|
||||
processElements( jaxbClass.getSubclass(), container );
|
||||
processElements( jaxbClass.getUnionSubclass(), container );
|
||||
}
|
||||
else if ( JaxbSubclassElement.class.isInstance( entityElement ) ) {
|
||||
final JaxbSubclassElement jaxbSubclass = (JaxbSubclassElement) entityElement;
|
||||
processElements( jaxbSubclass.getSubclass(), container );
|
||||
}
|
||||
else if ( JaxbJoinedSubclassElement.class.isInstance( entityElement ) ) {
|
||||
final JaxbJoinedSubclassElement jaxbJoinedSubclass = (JaxbJoinedSubclassElement) entityElement;
|
||||
processElements( jaxbJoinedSubclass.getJoinedSubclass(), container );
|
||||
}
|
||||
else if ( JaxbUnionSubclassElement.class.isInstance( entityElement ) ) {
|
||||
final JaxbUnionSubclassElement jaxbUnionSubclass = (JaxbUnionSubclassElement) entityElement;
|
||||
processElements( jaxbUnionSubclass.getUnionSubclass(), container );
|
||||
}
|
||||
processNamedQueries( entityElement );
|
||||
}
|
||||
|
||||
private void processElements(List<? extends SubEntityElement> subElements, AbstractEntitySourceImpl container) {
|
||||
for ( final SubEntityElement subElement : subElements ) {
|
||||
final SubclassEntitySourceImpl subclassEntitySource = createSubClassEntitySource( subElement, ( EntitySource ) container );
|
||||
container.add( subclassEntitySource );
|
||||
final String subEntityName = subclassEntitySource.getEntityName();
|
||||
subEntityContainerMap.put( subEntityName, subclassEntitySource );
|
||||
|
||||
// Re-run the sub element to handle, as an example, subclasses
|
||||
// within a subclass.
|
||||
processSubElements(subElement, subclassEntitySource);
|
||||
}
|
||||
}
|
||||
|
||||
private SubclassEntitySourceImpl createSubClassEntitySource(SubEntityElement subEntityElement, EntitySource entitySource) {
|
||||
if ( JaxbJoinedSubclassElement.class.isInstance( subEntityElement ) ) {
|
||||
return new JoinedSubclassEntitySourceImpl(
|
||||
currentMappingDocument,
|
||||
JaxbJoinedSubclassElement.class.cast( subEntityElement ),
|
||||
entitySource
|
||||
);
|
||||
}
|
||||
else {
|
||||
return new SubclassEntitySourceImpl( currentMappingDocument, subEntityElement, entitySource );
|
||||
}
|
||||
}
|
||||
|
||||
private void processNamedQueries( EntityElement entityElement ) {
|
||||
// For backward compatibility, store named queries prefixed with
|
||||
// the class name.
|
||||
String queryNamePrefix = entityElement.getEntityName();
|
||||
queryNamePrefix = StringHelper.isNotEmpty( queryNamePrefix ) ? queryNamePrefix : currentMappingDocument.getMappingLocalBindingContext().qualifyClassName( entityElement.getName() );
|
||||
for ( final JaxbQueryElement element : entityElement.getQuery() ) {
|
||||
element.setName( queryNamePrefix + "." + element.getName() );
|
||||
NamedQueryBindingHelper.bindNamedQuery( element, bindingContext.getMetadataCollector() );
|
||||
}
|
||||
for ( final JaxbSqlQueryElement element : entityElement.getSqlQuery() ) {
|
||||
element.setName( queryNamePrefix + "." + element.getName() );
|
||||
NamedQueryBindingHelper.bindNamedSQLQuery(
|
||||
element,
|
||||
currentMappingDocument.getMappingLocalBindingContext(),
|
||||
bindingContext.getMetadataCollector()
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
private static class ExtendsQueueEntry {
|
||||
private final SubclassEntitySource subClassEntitySource;
|
||||
private final String entityItExtends;
|
||||
|
||||
private ExtendsQueueEntry(SubclassEntitySource subClassEntitySource, String entityItExtends) {
|
||||
this.subClassEntitySource = subClassEntitySource;
|
||||
this.entityItExtends = entityItExtends;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,156 +0,0 @@
|
|||
/*
|
||||
* Hibernate, Relational Persistence for Idiomatic Java
|
||||
*
|
||||
* Copyright (c) 2014, 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.internal.hbm;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.hibernate.internal.util.StringHelper;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbBagElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbColumnElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbIdbagElement;
|
||||
import org.hibernate.metamodel.source.spi.CollectionIdSource;
|
||||
import org.hibernate.metamodel.source.spi.ColumnSource;
|
||||
import org.hibernate.metamodel.source.spi.Orderable;
|
||||
import org.hibernate.metamodel.source.spi.RelationalValueSource;
|
||||
import org.hibernate.metamodel.source.spi.SizeSource;
|
||||
import org.hibernate.metamodel.spi.PluralAttributeNature;
|
||||
|
||||
/**
|
||||
* @author Steve Ebersole
|
||||
*/
|
||||
public class IdBagSourceImpl extends AbstractPluralAttributeSourceImpl implements Orderable {
|
||||
public final CollectionIdSource collectionIdSource;
|
||||
|
||||
public IdBagSourceImpl(
|
||||
MappingDocument mappingDocument,
|
||||
final JaxbIdbagElement element,
|
||||
AbstractEntitySourceImpl abstractEntitySource) {
|
||||
super( mappingDocument, element, abstractEntitySource );
|
||||
|
||||
final List<RelationalValueSource> relationalValueSources = Helper.buildValueSources(
|
||||
sourceMappingDocument(),
|
||||
new Helper.ValueSourcesAdapter() {
|
||||
@Override
|
||||
public String getColumnAttribute() {
|
||||
return element.getCollectionId().getColumnAttribute();
|
||||
}
|
||||
|
||||
@Override
|
||||
public SizeSource getSizeSource() {
|
||||
return Helper.createSizeSourceIfMapped(
|
||||
element.getCollectionId().getLength(),
|
||||
null,
|
||||
null
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<JaxbColumnElement> getColumn() {
|
||||
return element.getCollectionId().getColumn();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isIncludedInInsertByDefault() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isForceNotNull() {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
ColumnSource collectionIdColumnSource = null;
|
||||
if ( relationalValueSources != null && relationalValueSources.isEmpty() ) {
|
||||
if ( relationalValueSources.size() > 1 ) {
|
||||
throw makeMappingException( "Expecting just a single column for collection id (idbag)" );
|
||||
}
|
||||
|
||||
final RelationalValueSource relationalValueSource = relationalValueSources.get( 0 );
|
||||
if ( !ColumnSource.class.isInstance( relationalValueSource ) ) {
|
||||
throw makeMappingException( "Expecting column for collection id (idbag), but found formula" );
|
||||
}
|
||||
|
||||
collectionIdColumnSource = (ColumnSource) relationalValueSource;
|
||||
}
|
||||
|
||||
final HibernateTypeSourceImpl typeSource = new HibernateTypeSourceImpl( element.getCollectionId().getType() );
|
||||
this.collectionIdSource = new CollectionIdSourceImpl(
|
||||
collectionIdColumnSource,
|
||||
typeSource,
|
||||
element.getCollectionId().getGenerator().getClazz()
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public PluralAttributeNature getNature() {
|
||||
return PluralAttributeNature.ID_BAG;
|
||||
}
|
||||
|
||||
@Override
|
||||
public JaxbBagElement getPluralAttributeElement() {
|
||||
return (JaxbBagElement) super.getPluralAttributeElement();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isOrdered() {
|
||||
return StringHelper.isNotEmpty( getOrder() );
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getOrder() {
|
||||
return getPluralAttributeElement().getOrderBy();
|
||||
}
|
||||
|
||||
private static class CollectionIdSourceImpl implements CollectionIdSource {
|
||||
private final ColumnSource columnSource;
|
||||
private final HibernateTypeSourceImpl typeSource;
|
||||
private final String generator;
|
||||
|
||||
public CollectionIdSourceImpl(
|
||||
ColumnSource columnSource,
|
||||
HibernateTypeSourceImpl typeSource,
|
||||
String generator) {
|
||||
this.columnSource = columnSource;
|
||||
this.typeSource = typeSource;
|
||||
this.generator = generator;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ColumnSource getColumnSource() {
|
||||
return columnSource;
|
||||
}
|
||||
|
||||
@Override
|
||||
public HibernateTypeSourceImpl getTypeInformation() {
|
||||
return typeSource;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getGeneratorName() {
|
||||
return generator;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,45 +0,0 @@
|
|||
/*
|
||||
* Hibernate, Relational Persistence for Idiomatic Java
|
||||
*
|
||||
* Copyright (c) 2012, Red Hat Inc. or third-party contributors as
|
||||
* indicated by the @author tags or express copyright attribution
|
||||
* statements applied by the authors. All third-party contributions are
|
||||
* distributed under license by Red Hat Inc.
|
||||
*
|
||||
* This copyrighted material is made available to anyone wishing to use, modify,
|
||||
* copy, or redistribute it subject to the terms and conditions of the GNU
|
||||
* Lesser General Public License, as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
|
||||
* for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this distribution; if not, write to:
|
||||
* Free Software Foundation, Inc.
|
||||
* 51 Franklin Street, Fifth Floor
|
||||
* Boston, MA 02110-1301 USA
|
||||
*/
|
||||
package org.hibernate.metamodel.source.internal.hbm;
|
||||
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbKeyPropertyElement;
|
||||
import org.hibernate.metamodel.source.spi.AttributeSourceContainer;
|
||||
import org.hibernate.metamodel.spi.NaturalIdMutability;
|
||||
|
||||
/**
|
||||
* @author Gail Badner
|
||||
*/
|
||||
public class IdentifierKeyAttributeSourceImpl extends KeyAttributeSourceImpl {
|
||||
public IdentifierKeyAttributeSourceImpl(
|
||||
MappingDocument mappingDocument,
|
||||
AttributeSourceContainer container,
|
||||
JaxbKeyPropertyElement keyPropertyElement) {
|
||||
super( mappingDocument, keyPropertyElement, container, NaturalIdMutability.NOT_NATURAL_ID );
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean areValuesIncludedInUpdateByDefault() {
|
||||
return false;
|
||||
}
|
||||
}
|
|
@ -1,46 +0,0 @@
|
|||
/*
|
||||
* Hibernate, Relational Persistence for Idiomatic Java
|
||||
*
|
||||
* Copyright (c) 2013, 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.internal.hbm;
|
||||
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbKeyManyToOneElement;
|
||||
import org.hibernate.metamodel.source.spi.AttributeSourceContainer;
|
||||
import org.hibernate.metamodel.spi.NaturalIdMutability;
|
||||
|
||||
/**
|
||||
* @author Gail Badner
|
||||
*/
|
||||
public class IdentifierKeyManyToOneSourceImpl extends KeyManyToOneSourceImpl {
|
||||
|
||||
public IdentifierKeyManyToOneSourceImpl(
|
||||
MappingDocument mappingDocument,
|
||||
AttributeSourceContainer container,
|
||||
JaxbKeyManyToOneElement keyManyToOneElement) {
|
||||
super( mappingDocument, container, keyManyToOneElement, NaturalIdMutability.NOT_NATURAL_ID );
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean areValuesIncludedInUpdateByDefault() {
|
||||
return true;
|
||||
}
|
||||
}
|
|
@ -1,70 +0,0 @@
|
|||
/*
|
||||
* Hibernate, Relational Persistence for Idiomatic Java
|
||||
*
|
||||
* Copyright (c) 2012, Red Hat Inc. or third-party contributors as
|
||||
* indicated by the @author tags or express copyright attribution
|
||||
* statements applied by the authors. All third-party contributions are
|
||||
* distributed under license by Red Hat Inc.
|
||||
*
|
||||
* This copyrighted material is made available to anyone wishing to use, modify,
|
||||
* copy, or redistribute it subject to the terms and conditions of the GNU
|
||||
* Lesser General Public License, as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
|
||||
* for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this distribution; if not, write to:
|
||||
* Free Software Foundation, Inc.
|
||||
* 51 Franklin Street, Fifth Floor
|
||||
* Boston, MA 02110-1301 USA
|
||||
*/
|
||||
package org.hibernate.metamodel.source.internal.hbm;
|
||||
|
||||
import org.hibernate.metamodel.source.spi.InLineViewSource;
|
||||
|
||||
/**
|
||||
* @author Steve Ebersole
|
||||
*/
|
||||
public class InLineViewSourceImpl
|
||||
extends AbstractHbmSourceNode
|
||||
implements InLineViewSource {
|
||||
private final String schemaName;
|
||||
private final String catalogName;
|
||||
private final String selectStatement;
|
||||
private final String logicalName;
|
||||
|
||||
public InLineViewSourceImpl(
|
||||
MappingDocument mappingDocument,
|
||||
String schemaName,
|
||||
String catalogName,
|
||||
String selectStatement, String logicalName) {
|
||||
super( mappingDocument );
|
||||
this.schemaName = schemaName;
|
||||
this.catalogName = catalogName;
|
||||
this.selectStatement = selectStatement;
|
||||
this.logicalName = logicalName;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getExplicitSchemaName() {
|
||||
return schemaName;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getExplicitCatalogName() {
|
||||
return catalogName;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getSelectStatement() {
|
||||
return selectStatement;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getLogicalName() {
|
||||
return logicalName;
|
||||
}
|
||||
}
|
|
@ -1,56 +0,0 @@
|
|||
/*
|
||||
* 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.internal.hbm;
|
||||
|
||||
import org.hibernate.metamodel.source.spi.IndexConstraintSource;
|
||||
|
||||
/**
|
||||
* @author Brett Meyer
|
||||
*/
|
||||
class IndexConstraintSourceImpl extends AbstractConstraintSource implements IndexConstraintSource {
|
||||
|
||||
public IndexConstraintSourceImpl( String name, String tableName ) {
|
||||
super( name, tableName );
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
sb.append( "IndexConstraintSourceImpl" );
|
||||
sb.append( "{name='" ).append( name ).append( '\'' );
|
||||
sb.append( ", tableName='" ).append( tableName ).append( '\'' );
|
||||
sb.append( ", columnNames=" ).append( columnNames );
|
||||
sb.append( ", orderings=" ).append( orderings );
|
||||
sb.append( '}' );
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isUnique() {
|
||||
// TODO: Is it possible to have a unique index in HBM?
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1,129 +0,0 @@
|
|||
/*
|
||||
* Hibernate, Relational Persistence for Idiomatic Java
|
||||
*
|
||||
* Copyright (c) 2013, 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.internal.hbm;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbColumnElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbJoinedSubclassElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbKeyElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbOnDeleteAttribute;
|
||||
import org.hibernate.metamodel.source.spi.ColumnSource;
|
||||
import org.hibernate.metamodel.source.spi.EntitySource;
|
||||
import org.hibernate.metamodel.source.spi.JoinedSubclassEntitySource;
|
||||
import org.hibernate.metamodel.source.spi.RelationalValueSource;
|
||||
import org.hibernate.metamodel.spi.relational.TableSpecification;
|
||||
import org.hibernate.metamodel.spi.relational.Value;
|
||||
|
||||
/**
|
||||
* @author Strong Liu <stliu@hibernate.org>
|
||||
*/
|
||||
public class JoinedSubclassEntitySourceImpl extends SubclassEntitySourceImpl implements JoinedSubclassEntitySource {
|
||||
private final JaxbKeyElement key;
|
||||
private final List<ColumnSource> primaryKeyJoinColumnSources;
|
||||
|
||||
public JoinedSubclassEntitySourceImpl(MappingDocument sourceMappingDocument, JaxbJoinedSubclassElement entityElement, EntitySource container) {
|
||||
super( sourceMappingDocument, entityElement, container );
|
||||
this.key = entityElement.getKey();
|
||||
List<RelationalValueSource> valueSources = Helper.buildValueSources(
|
||||
sourceMappingDocument(),
|
||||
new Helper.ValueSourcesAdapter() {
|
||||
@Override
|
||||
public boolean isIncludedInInsertByDefault() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isIncludedInUpdateByDefault() {
|
||||
return Helper.getValue( key.isUpdate(), true );
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getColumnAttribute() {
|
||||
return key.getColumnAttribute();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<JaxbColumnElement> getColumn() {
|
||||
return key.getColumn();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isForceNotNull() {
|
||||
return Helper.getValue( key.isNotNull(), false );
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
);
|
||||
this.primaryKeyJoinColumnSources = new ArrayList<ColumnSource>( valueSources.size() );
|
||||
for ( final RelationalValueSource valueSource : valueSources ) {
|
||||
primaryKeyJoinColumnSources.add( ColumnSource.class.cast( valueSource ) ) ;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isCascadeDeleteEnabled() {
|
||||
return key.getOnDelete() == JaxbOnDeleteAttribute.CASCADE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getExplicitForeignKeyName() {
|
||||
return key.getForeignKey();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean createForeignKeyConstraint() {
|
||||
// TODO: Can HBM do something like JPA's @ForeignKey(NO_CONSTRAINT)?
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public JoinColumnResolutionDelegate getForeignKeyTargetColumnResolutionDelegate() {
|
||||
return key.getPropertyRef() == null
|
||||
? null
|
||||
: new JoinColumnResolutionDelegate() {
|
||||
@Override
|
||||
public List<? extends Value> getJoinColumns(JoinColumnResolutionContext context) {
|
||||
return context.resolveRelationalValuesForAttribute( key.getPropertyRef() );
|
||||
}
|
||||
|
||||
@Override
|
||||
public TableSpecification getReferencedTable(JoinColumnResolutionContext context) {
|
||||
return context.resolveTableForAttribute( key.getPropertyRef() );
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getReferencedAttributeName() {
|
||||
return key.getPropertyRef();
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<ColumnSource> getPrimaryKeyColumnSources() {
|
||||
return primaryKeyJoinColumnSources;
|
||||
}
|
||||
}
|
|
@ -1,205 +0,0 @@
|
|||
/*
|
||||
* Hibernate, Relational Persistence for Idiomatic Java
|
||||
*
|
||||
* Copyright (c) 2012, Red Hat Inc. or third-party contributors as
|
||||
* indicated by the @author tags or express copyright attribution
|
||||
* statements applied by the authors. All third-party contributions are
|
||||
* distributed under license by Red Hat Inc.
|
||||
*
|
||||
* This copyrighted material is made available to anyone wishing to use, modify,
|
||||
* copy, or redistribute it subject to the terms and conditions of the GNU
|
||||
* Lesser General Public License, as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
|
||||
* for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this distribution; if not, write to:
|
||||
* Free Software Foundation, Inc.
|
||||
* 51 Franklin Street, Fifth Floor
|
||||
* Boston, MA 02110-1301 USA
|
||||
*/
|
||||
package org.hibernate.metamodel.source.internal.hbm;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import org.hibernate.mapping.PropertyGeneration;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbColumnElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbKeyPropertyElement;
|
||||
import org.hibernate.metamodel.source.spi.AttributeSourceContainer;
|
||||
import org.hibernate.metamodel.source.spi.RelationalValueSource;
|
||||
import org.hibernate.metamodel.source.spi.SingularAttributeSource;
|
||||
import org.hibernate.metamodel.source.spi.SizeSource;
|
||||
import org.hibernate.metamodel.source.spi.ToolingHintSource;
|
||||
import org.hibernate.metamodel.spi.AttributePath;
|
||||
import org.hibernate.metamodel.spi.AttributeRole;
|
||||
import org.hibernate.metamodel.spi.NaturalIdMutability;
|
||||
import org.hibernate.metamodel.spi.SingularAttributeNature;
|
||||
|
||||
/**
|
||||
* Implementation for {@code <key-property/>} mappings
|
||||
*
|
||||
* @author Gail Badner
|
||||
*/
|
||||
class KeyAttributeSourceImpl
|
||||
extends AbstractHbmSourceNode
|
||||
implements SingularAttributeSource {
|
||||
private final JaxbKeyPropertyElement keyPropertyElement;
|
||||
private final NaturalIdMutability naturalIdMutability;
|
||||
private final HibernateTypeSourceImpl typeSource;
|
||||
private final List<RelationalValueSource> valueSources;
|
||||
|
||||
private final AttributePath attributePath;
|
||||
private final AttributeRole attributeRole;
|
||||
|
||||
public KeyAttributeSourceImpl(
|
||||
MappingDocument mappingDocument,
|
||||
final JaxbKeyPropertyElement keyPropertyElement,
|
||||
AttributeSourceContainer container, final NaturalIdMutability naturalIdMutability) {
|
||||
super( mappingDocument );
|
||||
this.keyPropertyElement = keyPropertyElement;
|
||||
this.naturalIdMutability = naturalIdMutability;
|
||||
|
||||
final String name = keyPropertyElement.getTypeAttribute() != null
|
||||
? keyPropertyElement.getTypeAttribute()
|
||||
: keyPropertyElement.getType() != null
|
||||
? keyPropertyElement.getType().getName()
|
||||
: null;
|
||||
final Map<String, String> parameters = ( keyPropertyElement.getType() != null )
|
||||
? Helper.extractParameters( keyPropertyElement.getType().getParam() )
|
||||
: null;
|
||||
this.typeSource = new HibernateTypeSourceImpl( name, parameters );
|
||||
|
||||
this.valueSources = Helper.buildValueSources(
|
||||
sourceMappingDocument(),
|
||||
new Helper.ValueSourcesAdapter() {
|
||||
@Override
|
||||
public String getColumnAttribute() {
|
||||
return keyPropertyElement.getColumnAttribute();
|
||||
}
|
||||
|
||||
@Override
|
||||
public SizeSource getSizeSource() {
|
||||
return Helper.createSizeSourceIfMapped(
|
||||
keyPropertyElement.getLength(),
|
||||
null,
|
||||
null
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public List<JaxbColumnElement> getColumn() {
|
||||
return keyPropertyElement.getColumn();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isIncludedInInsertByDefault() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isForceNotNull() {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
this.attributePath = container.getAttributePathBase().append( getName() );
|
||||
this.attributeRole = container.getAttributeRoleBase().append( getName() );
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return keyPropertyElement.getName();
|
||||
}
|
||||
|
||||
@Override
|
||||
public AttributePath getAttributePath() {
|
||||
return attributePath;
|
||||
}
|
||||
|
||||
@Override
|
||||
public AttributeRole getAttributeRole() {
|
||||
return attributeRole;
|
||||
}
|
||||
|
||||
@Override
|
||||
public HibernateTypeSourceImpl getTypeInformation() {
|
||||
return typeSource;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getPropertyAccessorName() {
|
||||
return keyPropertyElement.getAccess();
|
||||
}
|
||||
|
||||
@Override
|
||||
public PropertyGeneration getGeneration() {
|
||||
return PropertyGeneration.NEVER;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isLazy() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public NaturalIdMutability getNaturalIdMutability() {
|
||||
return naturalIdMutability;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isIncludedInOptimisticLocking() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public SingularAttributeNature getSingularAttributeNature() {
|
||||
return SingularAttributeNature.BASIC;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isVirtualAttribute() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean areValuesIncludedInInsertByDefault() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean areValuesIncludedInUpdateByDefault() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean areValuesNullableByDefault() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getContainingTableName() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<RelationalValueSource> relationalValueSources() {
|
||||
return valueSources;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isSingular() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Collection<? extends ToolingHintSource> getToolingHintSources() {
|
||||
return keyPropertyElement.getMeta();
|
||||
}
|
||||
}
|
|
@ -1,250 +0,0 @@
|
|||
/*
|
||||
* Hibernate, Relational Persistence for Idiomatic Java
|
||||
*
|
||||
* Copyright (c) 2013, 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.internal.hbm;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
import org.hibernate.engine.spi.CascadeStyle;
|
||||
import org.hibernate.engine.spi.CascadeStyles;
|
||||
import org.hibernate.internal.util.StringHelper;
|
||||
import org.hibernate.metamodel.reflite.spi.JavaTypeDescriptor;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbColumnElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbKeyManyToOneElement;
|
||||
import org.hibernate.metamodel.source.spi.AttributeSourceContainer;
|
||||
import org.hibernate.metamodel.source.spi.RelationalValueSource;
|
||||
import org.hibernate.metamodel.source.spi.SingularAttributeSource;
|
||||
import org.hibernate.metamodel.source.spi.ToolingHintSource;
|
||||
import org.hibernate.metamodel.spi.AttributePath;
|
||||
import org.hibernate.metamodel.spi.AttributeRole;
|
||||
import org.hibernate.metamodel.spi.NaturalIdMutability;
|
||||
import org.hibernate.metamodel.spi.SingularAttributeNature;
|
||||
import org.hibernate.type.ForeignKeyDirection;
|
||||
|
||||
/**
|
||||
* Implementation for {@code <key-many-to-one/>} mappings
|
||||
*
|
||||
* @author Gail Badner
|
||||
*/
|
||||
class KeyManyToOneSourceImpl
|
||||
extends AbstractToOneAttributeSourceImpl
|
||||
implements SingularAttributeSource {
|
||||
private final JaxbKeyManyToOneElement keyManyToOneElement;
|
||||
private final HibernateTypeSourceImpl typeSource;
|
||||
private final List<RelationalValueSource> valueSources;
|
||||
|
||||
private final AttributePath attributePath;
|
||||
private final AttributeRole attributeRole;
|
||||
|
||||
public KeyManyToOneSourceImpl(
|
||||
MappingDocument mappingDocument,
|
||||
AttributeSourceContainer container,
|
||||
final JaxbKeyManyToOneElement keyManyToOneElement,
|
||||
final NaturalIdMutability naturalIdMutability) {
|
||||
super( mappingDocument, naturalIdMutability, null );
|
||||
this.keyManyToOneElement = keyManyToOneElement;
|
||||
|
||||
final String referencedClassName = keyManyToOneElement.getClazz();
|
||||
JavaTypeDescriptor referencedClass = null;
|
||||
if ( StringHelper.isNotEmpty( referencedClassName ) ) {
|
||||
referencedClass = bindingContext().getJavaTypeDescriptorRepository().getType(
|
||||
bindingContext().getJavaTypeDescriptorRepository().buildName(
|
||||
bindingContext().qualifyClassName( keyManyToOneElement.getClazz() )
|
||||
)
|
||||
);
|
||||
}
|
||||
this.typeSource = new HibernateTypeSourceImpl( referencedClass );
|
||||
|
||||
this.valueSources = Helper.buildValueSources(
|
||||
sourceMappingDocument(),
|
||||
new Helper.ValueSourcesAdapter() {
|
||||
@Override
|
||||
public String getColumnAttribute() {
|
||||
return keyManyToOneElement.getColumnAttribute();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getFormulaAttribute() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<JaxbColumnElement> getColumn() {
|
||||
return keyManyToOneElement.getColumn();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> getFormula() {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getContainingTableName() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isIncludedInInsertByDefault() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isIncludedInUpdateByDefault() {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
this.attributePath = container.getAttributePathBase().append( getName() );
|
||||
this.attributeRole = container.getAttributeRoleBase().append( getName() );
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return keyManyToOneElement.getName();
|
||||
}
|
||||
|
||||
@Override
|
||||
public AttributePath getAttributePath() {
|
||||
return attributePath;
|
||||
}
|
||||
|
||||
@Override
|
||||
public AttributeRole getAttributeRole() {
|
||||
return attributeRole;
|
||||
}
|
||||
|
||||
@Override
|
||||
public HibernateTypeSourceImpl getTypeInformation() {
|
||||
return typeSource;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getPropertyAccessorName() {
|
||||
return keyManyToOneElement.getAccess();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isIncludedInOptimisticLocking() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public SingularAttributeNature getSingularAttributeNature() {
|
||||
return SingularAttributeNature.MANY_TO_ONE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isVirtualAttribute() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean requiresImmediateFetch() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String getFetchSelectionString() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String getLazySelectionString() {
|
||||
return keyManyToOneElement.getLazy() != null ?
|
||||
keyManyToOneElement.getLazy().value() :
|
||||
null;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String getOuterJoinSelectionString() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean areValuesIncludedInInsertByDefault() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean areValuesIncludedInUpdateByDefault() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean areValuesNullableByDefault() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getContainingTableName() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<RelationalValueSource> relationalValueSources() {
|
||||
return valueSources;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Collection<? extends ToolingHintSource> getToolingHintSources() {
|
||||
return keyManyToOneElement.getMeta();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getReferencedEntityName() {
|
||||
return keyManyToOneElement.getEntityName();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isUnique() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ForeignKeyDirection getForeignKeyDirection() {
|
||||
return ForeignKeyDirection.TO_PARENT;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<CascadeStyle> getCascadeStyles() {
|
||||
return Collections.singleton( CascadeStyles.NONE );
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getExplicitForeignKeyName() {
|
||||
return keyManyToOneElement.getForeignKey();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isCascadeDeleteEnabled() {
|
||||
return "cascade".equals( keyManyToOneElement.getOnDelete().value() );
|
||||
}
|
||||
|
||||
protected String getClassName() {
|
||||
return keyManyToOneElement.getClazz();
|
||||
}
|
||||
}
|
|
@ -1,66 +0,0 @@
|
|||
/*
|
||||
* 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.internal.hbm;
|
||||
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbListElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbListIndexElement;
|
||||
import org.hibernate.metamodel.source.spi.AttributeSourceContainer;
|
||||
import org.hibernate.metamodel.source.spi.IndexedPluralAttributeSource;
|
||||
import org.hibernate.metamodel.source.spi.PluralAttributeIndexSource;
|
||||
import org.hibernate.metamodel.source.spi.PluralAttributeSequentialIndexSource;
|
||||
import org.hibernate.metamodel.spi.PluralAttributeNature;
|
||||
|
||||
public class ListSourceImpl extends AbstractPluralAttributeSourceImpl implements IndexedPluralAttributeSource {
|
||||
private final PluralAttributeSequentialIndexSource indexSource;
|
||||
|
||||
public ListSourceImpl(
|
||||
MappingDocument sourceMappingDocument,
|
||||
JaxbListElement listElement,
|
||||
AttributeSourceContainer container) {
|
||||
super( sourceMappingDocument, listElement, container );
|
||||
JaxbListIndexElement listIndexElement = listElement.getListIndex();
|
||||
if ( listIndexElement == null ) {
|
||||
this.indexSource = new PluralAttributeSequentialIndexSourceImpl( sourceMappingDocument(), listElement.getIndex() );
|
||||
}
|
||||
else {
|
||||
this.indexSource = new PluralAttributeSequentialIndexSourceImpl( sourceMappingDocument(), listIndexElement );
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public PluralAttributeIndexSource getIndexSource() {
|
||||
return indexSource;
|
||||
}
|
||||
|
||||
@Override
|
||||
public JaxbListElement getPluralAttributeElement() {
|
||||
return ( JaxbListElement ) super.getPluralAttributeElement();
|
||||
}
|
||||
|
||||
@Override
|
||||
public PluralAttributeNature getNature() {
|
||||
return PluralAttributeNature.LIST;
|
||||
}
|
||||
|
||||
}
|
|
@ -1,64 +0,0 @@
|
|||
/*
|
||||
* Hibernate, Relational Persistence for Idiomatic Java
|
||||
*
|
||||
* JBoss, Home of Professional Open Source
|
||||
* Copyright 2013 Red Hat Inc. and/or its affiliates and other contributors
|
||||
* as indicated by the @authors tag. All rights reserved.
|
||||
* See the copyright.txt in the distribution for a
|
||||
* full listing of individual contributors.
|
||||
*
|
||||
* 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, v. 2.1.
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT A
|
||||
* 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,
|
||||
* v.2.1 along with this distribution; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301, USA.
|
||||
*/
|
||||
package org.hibernate.metamodel.source.internal.hbm;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import org.hibernate.cfg.HbmBinder;
|
||||
import org.hibernate.engine.query.spi.sql.NativeSQLQueryCollectionReturn;
|
||||
import org.hibernate.engine.query.spi.sql.NativeSQLQueryReturn;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbLoadCollectionElement;
|
||||
import org.hibernate.metamodel.spi.InFlightMetadataCollector;
|
||||
import org.hibernate.metamodel.spi.LocalBindingContext;
|
||||
|
||||
/**
|
||||
* @author Strong Liu <stliu@hibernate.org>
|
||||
*/
|
||||
class LoadCollectionBinder extends AbstractReturnBinder<JaxbLoadCollectionElement> {
|
||||
LoadCollectionBinder(
|
||||
final JaxbLoadCollectionElement element,
|
||||
final int elementIndex,
|
||||
final LocalBindingContext context,
|
||||
final InFlightMetadataCollector metadataCollector) {
|
||||
super( element, elementIndex, context, metadataCollector );
|
||||
}
|
||||
|
||||
@Override
|
||||
NativeSQLQueryReturn process() {
|
||||
final String collectionAttribute = element.getRole();
|
||||
int dot = collectionAttribute.lastIndexOf( '.' );
|
||||
if ( dot == -1 ) {
|
||||
throw context.makeMappingException(
|
||||
"Collection attribute for sql query return [alias=" + alias + "] not formatted correctly {OwnerClassName.propertyName}"
|
||||
);
|
||||
}
|
||||
final String ownerClassName = HbmBinder.getClassName(
|
||||
collectionAttribute.substring( 0, dot ), context.getMappingDefaults().getPackageName()
|
||||
);
|
||||
final String ownerPropertyName = collectionAttribute.substring( dot + 1 );
|
||||
final Map<String, String[]> propertyResults = new HashMap<String, String[]>();
|
||||
processReturnProperties( new ReturnPropertiesCallbackImpl( alias, propertyResults, context ) );
|
||||
return new NativeSQLQueryCollectionReturn(
|
||||
alias, ownerClassName, ownerPropertyName, propertyResults, lockMode
|
||||
);
|
||||
}
|
||||
}
|
|
@ -1,252 +0,0 @@
|
|||
/*
|
||||
* 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.internal.hbm;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
import org.hibernate.engine.spi.CascadeStyle;
|
||||
import org.hibernate.internal.util.StringHelper;
|
||||
import org.hibernate.metamodel.reflite.spi.JavaTypeDescriptor;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbColumnElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbManyToOneElement;
|
||||
import org.hibernate.metamodel.source.spi.AttributeSourceContainer;
|
||||
import org.hibernate.metamodel.source.spi.RelationalValueSource;
|
||||
import org.hibernate.metamodel.source.spi.ToolingHintSource;
|
||||
import org.hibernate.metamodel.spi.AttributePath;
|
||||
import org.hibernate.metamodel.spi.AttributeRole;
|
||||
import org.hibernate.metamodel.spi.NaturalIdMutability;
|
||||
import org.hibernate.metamodel.spi.SingularAttributeNature;
|
||||
import org.hibernate.type.ForeignKeyDirection;
|
||||
|
||||
/**
|
||||
* Implementation for {@code <many-to-one/>} mappings
|
||||
*
|
||||
* @author Steve Ebersole
|
||||
*/
|
||||
class ManyToOneAttributeSourceImpl extends AbstractToOneAttributeSourceImpl {
|
||||
private final JaxbManyToOneElement manyToOneElement;
|
||||
private final HibernateTypeSourceImpl typeSource;
|
||||
|
||||
private final String containingTableName;
|
||||
private final List<RelationalValueSource> valueSources;
|
||||
|
||||
private final AttributeRole attributeRole;
|
||||
private final AttributePath attributePath;
|
||||
|
||||
ManyToOneAttributeSourceImpl(
|
||||
MappingDocument sourceMappingDocument,
|
||||
AttributeSourceContainer container,
|
||||
final JaxbManyToOneElement manyToOneElement,
|
||||
final String logicalTableName,
|
||||
NaturalIdMutability naturalIdMutability) {
|
||||
super( sourceMappingDocument, naturalIdMutability, manyToOneElement.getPropertyRef() );
|
||||
this.manyToOneElement = manyToOneElement;
|
||||
|
||||
final String referencedClassName = manyToOneElement.getClazz();
|
||||
JavaTypeDescriptor referencedClass = null;
|
||||
if ( StringHelper.isNotEmpty( referencedClassName ) ) {
|
||||
referencedClass = bindingContext().getJavaTypeDescriptorRepository().getType(
|
||||
bindingContext().getJavaTypeDescriptorRepository().buildName(
|
||||
bindingContext().qualifyClassName( manyToOneElement.getClazz() )
|
||||
)
|
||||
);
|
||||
}
|
||||
this.typeSource = new HibernateTypeSourceImpl( referencedClass );
|
||||
|
||||
this.containingTableName = logicalTableName;
|
||||
this.valueSources = Helper.buildValueSources(
|
||||
sourceMappingDocument(),
|
||||
new Helper.ValueSourcesAdapter() {
|
||||
@Override
|
||||
public String getColumnAttribute() {
|
||||
return manyToOneElement.getColumnAttribute();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getFormulaAttribute() {
|
||||
return manyToOneElement.getFormulaAttribute();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<JaxbColumnElement> getColumn() {
|
||||
return manyToOneElement.getColumn();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> getFormula() {
|
||||
return manyToOneElement.getFormula();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getContainingTableName() {
|
||||
return logicalTableName;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isIncludedInInsertByDefault() {
|
||||
return manyToOneElement.isInsert();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isIncludedInUpdateByDefault() {
|
||||
return manyToOneElement.isUpdate();
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
this.attributeRole = container.getAttributeRoleBase().append( manyToOneElement.getName() );
|
||||
this.attributePath = container.getAttributePathBase().append( manyToOneElement.getName() );
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return manyToOneElement.getName();
|
||||
}
|
||||
|
||||
@Override
|
||||
public AttributePath getAttributePath() {
|
||||
return attributePath;
|
||||
}
|
||||
|
||||
@Override
|
||||
public AttributeRole getAttributeRole() {
|
||||
return attributeRole;
|
||||
}
|
||||
|
||||
@Override
|
||||
public HibernateTypeSourceImpl getTypeInformation() {
|
||||
return typeSource;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getPropertyAccessorName() {
|
||||
return manyToOneElement.getAccess();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isIgnoreNotFound() {
|
||||
return manyToOneElement.getNotFound() != null && "ignore".equalsIgnoreCase( manyToOneElement.getNotFound().value() );
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isIncludedInOptimisticLocking() {
|
||||
return manyToOneElement.isOptimisticLock();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<CascadeStyle> getCascadeStyles() {
|
||||
return Helper.interpretCascadeStyles( manyToOneElement.getCascade(), bindingContext() );
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean requiresImmediateFetch() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String getFetchSelectionString() {
|
||||
return manyToOneElement.getFetch() != null ?
|
||||
manyToOneElement.getFetch().value() :
|
||||
null;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String getLazySelectionString() {
|
||||
return manyToOneElement.getLazy() != null ?
|
||||
manyToOneElement.getLazy().value() :
|
||||
null;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String getOuterJoinSelectionString() {
|
||||
return manyToOneElement.getOuterJoin() != null ?
|
||||
manyToOneElement.getOuterJoin().value() :
|
||||
null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public SingularAttributeNature getSingularAttributeNature() {
|
||||
return SingularAttributeNature.MANY_TO_ONE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean areValuesIncludedInInsertByDefault() {
|
||||
return manyToOneElement.isInsert();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean areValuesIncludedInUpdateByDefault() {
|
||||
return manyToOneElement.isUpdate();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean areValuesNullableByDefault() {
|
||||
return ! Helper.getValue( manyToOneElement.isNotNull(), false );
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getContainingTableName() {
|
||||
return containingTableName;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<RelationalValueSource> relationalValueSources() {
|
||||
return valueSources;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Collection<? extends ToolingHintSource> getToolingHintSources() {
|
||||
return manyToOneElement.getMeta();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getReferencedEntityName() {
|
||||
return manyToOneElement.getClazz() != null
|
||||
? bindingContext().qualifyClassName( manyToOneElement.getClazz() )
|
||||
: manyToOneElement.getEntityName();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isUnique() {
|
||||
return manyToOneElement.isUnique();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getExplicitForeignKeyName() {
|
||||
return manyToOneElement.getForeignKey();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isCascadeDeleteEnabled() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ForeignKeyDirection getForeignKeyDirection() {
|
||||
return ForeignKeyDirection.TO_PARENT;
|
||||
}
|
||||
|
||||
}
|
|
@ -1,200 +0,0 @@
|
|||
/*
|
||||
* 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.internal.hbm;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import org.hibernate.cfg.NamingStrategy;
|
||||
import org.hibernate.metamodel.internal.binder.Binder;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbColumnElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbIndexElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbMapKeyElement;
|
||||
import org.hibernate.metamodel.source.spi.PluralAttributeMapKeySourceBasic;
|
||||
import org.hibernate.metamodel.source.spi.RelationalValueSource;
|
||||
import org.hibernate.metamodel.source.spi.SizeSource;
|
||||
import org.hibernate.metamodel.spi.PluralAttributeIndexNature;
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public class MapKeySourceBasicImpl extends AbstractHbmSourceNode implements PluralAttributeMapKeySourceBasic {
|
||||
private final PluralAttributeIndexNature nature;
|
||||
private final List<RelationalValueSource> valueSources;
|
||||
private final HibernateTypeSourceImpl typeSource;
|
||||
|
||||
public MapKeySourceBasicImpl(MappingDocument sourceMappingDocument, final JaxbMapKeyElement mapKey) {
|
||||
super( sourceMappingDocument );
|
||||
|
||||
final String typeName = extractTypeName( mapKey );
|
||||
final Map<String, String> typeParams = mapKey.getType() != null
|
||||
? Helper.extractParameters( mapKey.getType().getParam() )
|
||||
: java.util.Collections.<String, String>emptyMap();
|
||||
this.typeSource = new HibernateTypeSourceImpl( typeName, typeParams );
|
||||
|
||||
this.valueSources = Helper.buildValueSources(
|
||||
sourceMappingDocument(),
|
||||
new Helper.ValueSourcesAdapter() {
|
||||
|
||||
@Override
|
||||
public String getColumnAttribute() {
|
||||
return mapKey.getColumnAttribute();
|
||||
}
|
||||
|
||||
@Override
|
||||
public SizeSource getSizeSource() {
|
||||
return Helper.createSizeSourceIfMapped(
|
||||
mapKey.getLength(),
|
||||
null,
|
||||
null
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public List<JaxbColumnElement> getColumn() {
|
||||
return mapKey.getColumn();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> getFormula() {
|
||||
return mapKey.getFormula();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getFormulaAttribute() {
|
||||
return mapKey.getFormulaAttribute();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isIncludedInInsertByDefault() {
|
||||
return areValuesIncludedInInsertByDefault();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isIncludedInUpdateByDefault() {
|
||||
return areValuesIncludedInUpdateByDefault();
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
this.nature = PluralAttributeIndexNature.BASIC;
|
||||
}
|
||||
|
||||
private String extractTypeName(JaxbMapKeyElement mapKey) {
|
||||
if ( mapKey.getTypeAttribute() != null ) {
|
||||
return mapKey.getTypeAttribute();
|
||||
}
|
||||
if ( mapKey.getType() != null ) {
|
||||
return mapKey.getType().getName();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public MapKeySourceBasicImpl(MappingDocument sourceMappingDocument, final JaxbIndexElement indexElement) {
|
||||
super( sourceMappingDocument );
|
||||
this.typeSource = new HibernateTypeSourceImpl( indexElement.getType() );
|
||||
|
||||
this.valueSources = Helper.buildValueSources(
|
||||
sourceMappingDocument,
|
||||
new Helper.ValueSourcesAdapter() {
|
||||
|
||||
@Override
|
||||
public String getColumnAttribute() {
|
||||
return indexElement.getColumnAttribute();
|
||||
}
|
||||
|
||||
@Override
|
||||
public SizeSource getSizeSource() {
|
||||
return Helper.createSizeSourceIfMapped(
|
||||
indexElement.getLength(),
|
||||
null,
|
||||
null
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public List<JaxbColumnElement> getColumn() {
|
||||
return indexElement.getColumn();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isIncludedInInsertByDefault() {
|
||||
return areValuesIncludedInInsertByDefault();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isIncludedInUpdateByDefault() {
|
||||
return areValuesIncludedInUpdateByDefault();
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
this.nature = PluralAttributeIndexNature.BASIC;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean areValuesIncludedInInsertByDefault() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean areValuesIncludedInUpdateByDefault() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean areValuesNullableByDefault() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public PluralAttributeIndexNature getNature() {
|
||||
return nature;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<Binder.DefaultNamingStrategy> getDefaultNamingStrategies() {
|
||||
final Binder.DefaultNamingStrategy defaultNamingStrategy =
|
||||
new Binder.DefaultNamingStrategy() {
|
||||
@Override
|
||||
public String defaultName(NamingStrategy namingStrategy) {
|
||||
return namingStrategy.columnName( "idx" );
|
||||
}
|
||||
};
|
||||
return Collections.singletonList( defaultNamingStrategy );
|
||||
}
|
||||
|
||||
@Override
|
||||
public HibernateTypeSourceImpl getTypeInformation() {
|
||||
return typeSource;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<RelationalValueSource> relationalValueSources() {
|
||||
return valueSources;
|
||||
}
|
||||
}
|
|
@ -1,90 +0,0 @@
|
|||
/*
|
||||
* 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.internal.hbm;
|
||||
|
||||
import org.hibernate.AssertionFailure;
|
||||
import org.hibernate.cfg.NotYetImplementedException;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbMapElement;
|
||||
import org.hibernate.metamodel.source.spi.AttributeSourceContainer;
|
||||
import org.hibernate.metamodel.source.spi.IndexedPluralAttributeSource;
|
||||
import org.hibernate.metamodel.source.spi.PluralAttributeIndexSource;
|
||||
import org.hibernate.metamodel.spi.PluralAttributeNature;
|
||||
|
||||
public class MapSourceImpl extends AbstractPluralAttributeSourceImpl implements IndexedPluralAttributeSource {
|
||||
private final PluralAttributeIndexSource indexSource;
|
||||
|
||||
public MapSourceImpl(
|
||||
MappingDocument sourceMappingDocument,
|
||||
JaxbMapElement mapElement,
|
||||
AttributeSourceContainer container) {
|
||||
super( sourceMappingDocument, mapElement, container );
|
||||
if ( mapElement.getMapKey() != null ) {
|
||||
this.indexSource = new MapKeySourceBasicImpl( sourceMappingDocument, mapElement.getMapKey() );
|
||||
}
|
||||
else if ( mapElement.getIndex() != null ) {
|
||||
this.indexSource = new MapKeySourceBasicImpl( sourceMappingDocument, mapElement.getIndex() );
|
||||
}
|
||||
else if ( mapElement.getCompositeMapKey() != null ) {
|
||||
this.indexSource = new PluralAttributeMapKeySourceEmbeddedImpl(
|
||||
sourceMappingDocument,
|
||||
this,
|
||||
mapElement.getCompositeMapKey()
|
||||
);
|
||||
}
|
||||
else if ( mapElement.getCompositeIndex() != null ) {
|
||||
this.indexSource = new PluralAttributeMapKeySourceEmbeddedImpl(
|
||||
sourceMappingDocument,
|
||||
this,
|
||||
mapElement.getCompositeIndex()
|
||||
);
|
||||
}
|
||||
else if ( mapElement.getMapKeyManyToMany() != null ) {
|
||||
throw new NotYetImplementedException( "<map-key-many-to-many> is not supported yet" );
|
||||
}
|
||||
else if ( mapElement.getIndexManyToMany() != null ) {
|
||||
throw new NotYetImplementedException( "<index-many-to-many> is not supported yet" );
|
||||
}
|
||||
else if ( mapElement.getIndexManyToAny() != null ) {
|
||||
throw new NotYetImplementedException( "<index-many-to-any> is not supported yet" );
|
||||
}
|
||||
else {
|
||||
throw new AssertionFailure( "No map key found" );
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public PluralAttributeIndexSource getIndexSource() {
|
||||
return indexSource;
|
||||
}
|
||||
|
||||
@Override
|
||||
public JaxbMapElement getPluralAttributeElement() {
|
||||
return ( JaxbMapElement ) super.getPluralAttributeElement();
|
||||
}
|
||||
|
||||
@Override
|
||||
public PluralAttributeNature getNature() {
|
||||
return PluralAttributeNature.MAP;
|
||||
}
|
||||
}
|
|
@ -1,156 +0,0 @@
|
|||
/*
|
||||
* 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.internal.hbm;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.hibernate.internal.util.collections.CollectionHelper;
|
||||
import org.hibernate.metamodel.reflite.spi.JavaTypeDescriptor;
|
||||
import org.hibernate.metamodel.source.internal.OverriddenMappingDefaults;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.EntityElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbFetchProfileElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbHibernateMapping;
|
||||
import org.hibernate.metamodel.source.spi.MappingDefaults;
|
||||
import org.hibernate.metamodel.source.spi.MappingException;
|
||||
import org.hibernate.metamodel.source.spi.MetaAttributeContext;
|
||||
import org.hibernate.metamodel.spi.BaseDelegatingBindingContext;
|
||||
import org.hibernate.metamodel.spi.BindingContext;
|
||||
import org.hibernate.xml.spi.BindResult;
|
||||
import org.hibernate.xml.spi.Origin;
|
||||
|
||||
/**
|
||||
* Aggregates together information about a mapping document.
|
||||
*
|
||||
* @author Steve Ebersole
|
||||
*/
|
||||
public class MappingDocument {
|
||||
private final BindResult<JaxbHibernateMapping> hbmBindResult;
|
||||
private final LocalBindingContextImpl mappingLocalBindingContext;
|
||||
|
||||
public MappingDocument(BindResult<JaxbHibernateMapping> hbmBindResult, BindingContext bindingContext) {
|
||||
this.hbmBindResult = hbmBindResult;
|
||||
this.mappingLocalBindingContext = new LocalBindingContextImpl( bindingContext );
|
||||
|
||||
}
|
||||
|
||||
public JaxbHibernateMapping getMappingRoot() {
|
||||
return hbmBindResult.getRoot();
|
||||
}
|
||||
|
||||
public Origin getOrigin() {
|
||||
return hbmBindResult.getOrigin();
|
||||
}
|
||||
|
||||
public BindResult<JaxbHibernateMapping> getJaxbRoot() {
|
||||
return hbmBindResult;
|
||||
}
|
||||
|
||||
public HbmBindingContext getMappingLocalBindingContext() {
|
||||
return mappingLocalBindingContext;
|
||||
}
|
||||
|
||||
private class LocalBindingContextImpl extends BaseDelegatingBindingContext implements HbmBindingContext {
|
||||
private final MappingDefaults localMappingDefaults;
|
||||
private final MetaAttributeContext metaAttributeContext;
|
||||
|
||||
private LocalBindingContextImpl(BindingContext rootBindingContext) {
|
||||
super( rootBindingContext );
|
||||
this.localMappingDefaults = new OverriddenMappingDefaults(
|
||||
rootBindingContext.getMappingDefaults(),
|
||||
hbmBindResult.getRoot().getPackage(),
|
||||
hbmBindResult.getRoot().getSchema(),
|
||||
hbmBindResult.getRoot().getCatalog(),
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
hbmBindResult.getRoot().getDefaultCascade(),
|
||||
hbmBindResult.getRoot().getDefaultAccess(),
|
||||
hbmBindResult.getRoot().isDefaultLazy()
|
||||
);
|
||||
|
||||
if ( CollectionHelper.isEmpty( hbmBindResult.getRoot().getMeta() ) ) {
|
||||
this.metaAttributeContext = new MetaAttributeContext(
|
||||
rootBindingContext.getGlobalMetaAttributeContext()
|
||||
);
|
||||
}
|
||||
else {
|
||||
this.metaAttributeContext = Helper.extractMetaAttributeContext(
|
||||
hbmBindResult.getRoot().getMeta(),
|
||||
true,
|
||||
rootBindingContext.getGlobalMetaAttributeContext()
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String qualifyClassName(String unqualifiedName) {
|
||||
return Helper.qualifyIfNeeded( unqualifiedName, getMappingDefaults().getPackageName() );
|
||||
}
|
||||
|
||||
@Override
|
||||
public JavaTypeDescriptor typeDescriptor(String name) {
|
||||
return super.typeDescriptor( qualifyClassName( name ) );
|
||||
}
|
||||
|
||||
@Override
|
||||
public MappingDefaults getMappingDefaults() {
|
||||
return localMappingDefaults;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Origin getOrigin() {
|
||||
return hbmBindResult.getOrigin();
|
||||
}
|
||||
|
||||
@Override
|
||||
public MappingException makeMappingException(String message) {
|
||||
return new MappingException( message, getOrigin() );
|
||||
}
|
||||
|
||||
@Override
|
||||
public MappingException makeMappingException(String message, Exception cause) {
|
||||
return new MappingException( message, cause, getOrigin() );
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isAutoImport() {
|
||||
return hbmBindResult.getRoot().isAutoImport();
|
||||
}
|
||||
|
||||
@Override
|
||||
public MetaAttributeContext getMetaAttributeContext() {
|
||||
return metaAttributeContext;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String determineEntityName(EntityElement entityElement) {
|
||||
return Helper.determineEntityName( entityElement, getMappingDefaults().getPackageName() );
|
||||
}
|
||||
|
||||
@Override
|
||||
public void processFetchProfiles(List<JaxbFetchProfileElement> fetchProfiles, String containingEntityName) {
|
||||
// todo : this really needs to not be part of the context
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,205 +0,0 @@
|
|||
/*
|
||||
* Hibernate, Relational Persistence for Idiomatic Java
|
||||
*
|
||||
* JBoss, Home of Professional Open Source
|
||||
* Copyright 2012 Red Hat Inc. and/or its affiliates and other contributors
|
||||
* as indicated by the @authors tag. All rights reserved.
|
||||
* See the copyright.txt in the distribution for a
|
||||
* full listing of individual contributors.
|
||||
*
|
||||
* 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, v. 2.1.
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT A
|
||||
* 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,
|
||||
* v.2.1 along with this distribution; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301, USA.
|
||||
*/
|
||||
package org.hibernate.metamodel.source.internal.hbm;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import org.hibernate.engine.spi.NamedQueryDefinitionBuilder;
|
||||
import org.hibernate.engine.spi.NamedSQLQueryDefinition;
|
||||
import org.hibernate.engine.spi.NamedSQLQueryDefinitionBuilder;
|
||||
import org.hibernate.internal.util.StringHelper;
|
||||
import org.hibernate.metamodel.source.internal.hbm.parser.BasicQueryElementContentParser;
|
||||
import org.hibernate.metamodel.source.internal.hbm.parser.SQLQueryElementContentParser;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbLoadCollectionElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbQueryElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbReturnPropertyElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbSqlQueryElement;
|
||||
import org.hibernate.metamodel.spi.InFlightMetadataCollector;
|
||||
import org.hibernate.metamodel.spi.LocalBindingContext;
|
||||
import org.hibernate.metamodel.spi.binding.AttributeBinding;
|
||||
import org.hibernate.metamodel.spi.binding.EmbeddedAttributeBinding;
|
||||
import org.hibernate.metamodel.spi.binding.EntityBinding;
|
||||
import org.hibernate.metamodel.spi.binding.SingularAssociationAttributeBinding;
|
||||
import org.hibernate.metamodel.spi.binding.SingularAttributeBinding;
|
||||
|
||||
/**
|
||||
* Helper class used to bind named query elements.
|
||||
*
|
||||
* @author Brett Meyer
|
||||
* @author Strong Liu
|
||||
*/
|
||||
public class NamedQueryBindingHelper {
|
||||
|
||||
/**
|
||||
* Helper method used to bind {@code <query/>} element.
|
||||
*
|
||||
* @param queryElement The {@code <query/>} element.
|
||||
* @param metadataCollector The {@link org.hibernate.metamodel.Metadata} which this named query will be added to.
|
||||
*/
|
||||
public static void bindNamedQuery(
|
||||
final JaxbQueryElement queryElement,
|
||||
final InFlightMetadataCollector metadataCollector) {
|
||||
final NamedQueryDefinitionBuilder builder = new NamedQueryDefinitionBuilder();
|
||||
final BasicQueryElementContentParser parser = new BasicQueryElementContentParser();
|
||||
parser.parse( builder, queryElement );
|
||||
metadataCollector.addNamedQuery( builder.createNamedQueryDefinition() );
|
||||
}
|
||||
|
||||
public static void bindNamedSQLQuery(
|
||||
final JaxbSqlQueryElement queryElement,
|
||||
final LocalBindingContext bindingContext,
|
||||
final InFlightMetadataCollector metadataCollector) {
|
||||
final NamedSQLQueryDefinitionBuilder builder = new NamedSQLQueryDefinitionBuilder();
|
||||
final SQLQueryElementContentParser parser = new SQLQueryElementContentParser();
|
||||
|
||||
parser.parse( builder, queryElement );
|
||||
|
||||
final boolean callable = queryElement.isCallable();
|
||||
final String resultSetRef = queryElement.getResultsetRef();
|
||||
//TODO: check if the refereneced result set mapping definition exist or not?
|
||||
builder.setCallable( callable ).setResultSetRef( resultSetRef );
|
||||
|
||||
NamedSQLQueryDefinition namedQuery;
|
||||
//query returns are defined in the <resultset/> element.
|
||||
if ( StringHelper.isNotEmpty( resultSetRef ) ) {
|
||||
namedQuery = builder.createNamedQueryDefinition();
|
||||
}
|
||||
else {
|
||||
namedQuery = parser.buildQueryReturns( queryElement.getName(),builder, bindingContext, metadataCollector );
|
||||
}
|
||||
metadataCollector.addNamedNativeQuery( namedQuery );
|
||||
}
|
||||
|
||||
|
||||
|
||||
private static Map<String, String[]> bindPropertyResults(
|
||||
String alias, JaxbLoadCollectionElement element,
|
||||
EntityBinding entityBinding) {
|
||||
List<JaxbReturnPropertyElement> returnPropertyElements
|
||||
= element.getReturnProperty();
|
||||
List<JaxbReturnPropertyElement> properties
|
||||
= new ArrayList<JaxbReturnPropertyElement>();
|
||||
List<String> propertyNames = new ArrayList<String>();
|
||||
HashMap<String, ArrayList<String>> propertyResults = new HashMap<String, ArrayList<String>>();
|
||||
for ( JaxbReturnPropertyElement propertyElement : returnPropertyElements ) {
|
||||
String name = propertyElement.getName();
|
||||
if ( entityBinding == null || name.indexOf( '.' ) == -1 ) {
|
||||
properties.add( propertyElement );
|
||||
propertyNames.add( name );
|
||||
}
|
||||
else {
|
||||
/**
|
||||
* Reorder properties
|
||||
* 1. get the parent property
|
||||
* 2. list all the properties following the expected one in the parent property
|
||||
* 3. calculate the lowest index and insert the property
|
||||
*/
|
||||
if ( entityBinding == null ) {
|
||||
throw new org.hibernate.MappingException(
|
||||
"dotted notation in <return-join> or <load_collection> not yet supported"
|
||||
);
|
||||
}
|
||||
int dotIndex = name.lastIndexOf( '.' );
|
||||
String reducedName = name.substring( 0, dotIndex );
|
||||
AttributeBinding value = null;// getRecursiveAttributeBinding(entityBinding, reducedName );
|
||||
Iterable<AttributeBinding> parentPropIter;
|
||||
if ( EmbeddedAttributeBinding.class.isInstance( value ) ) {
|
||||
EmbeddedAttributeBinding comp
|
||||
= (EmbeddedAttributeBinding) value;
|
||||
parentPropIter = comp.getEmbeddableBinding().attributeBindings();
|
||||
}
|
||||
else if ( SingularAssociationAttributeBinding.class.isInstance( value ) ) {
|
||||
SingularAssociationAttributeBinding toOne
|
||||
= SingularAssociationAttributeBinding.class.cast(
|
||||
value
|
||||
);
|
||||
EntityBinding referencedEntityBinding
|
||||
= toOne.getReferencedEntityBinding();
|
||||
SingularAttributeBinding referencedAttributeBinding
|
||||
= toOne.getReferencedAttributeBinding();
|
||||
try {
|
||||
parentPropIter = EmbeddedAttributeBinding.class.cast(
|
||||
referencedAttributeBinding
|
||||
).getEmbeddableBinding().attributeBindings();
|
||||
}
|
||||
catch ( ClassCastException e ) {
|
||||
throw new org.hibernate.MappingException(
|
||||
"dotted notation reference neither a component nor a many/one to one", e
|
||||
);
|
||||
}
|
||||
}
|
||||
else {
|
||||
throw new org.hibernate.MappingException(
|
||||
"dotted notation reference neither a component nor a many/one to one"
|
||||
);
|
||||
}
|
||||
boolean hasFollowers = false;
|
||||
List<String> followers = new ArrayList<String>();
|
||||
for ( AttributeBinding binding : parentPropIter ) {
|
||||
String currentPropertyName
|
||||
= binding.getAttribute().getName();
|
||||
String currentName = reducedName + '.'
|
||||
+ currentPropertyName;
|
||||
if ( hasFollowers ) {
|
||||
followers.add( currentName );
|
||||
}
|
||||
if ( name.equals( currentName ) ) {
|
||||
hasFollowers = true;
|
||||
}
|
||||
}
|
||||
|
||||
int index = propertyNames.size();
|
||||
int followersSize = followers.size();
|
||||
for ( int loop = 0; loop < followersSize; loop++ ) {
|
||||
String follower = followers.get( loop );
|
||||
int currentIndex = getIndexOfFirstMatchingProperty(
|
||||
propertyNames, follower
|
||||
);
|
||||
index = currentIndex != -1 && currentIndex < index
|
||||
? currentIndex : index;
|
||||
}
|
||||
propertyNames.add( index, name );
|
||||
properties.add( index, propertyElement );
|
||||
}
|
||||
}
|
||||
|
||||
Map<String, String[]> results = new HashMap<String, String[]>( propertyResults.size() );
|
||||
return results;
|
||||
}
|
||||
|
||||
|
||||
|
||||
private static int getIndexOfFirstMatchingProperty(List propertyNames,
|
||||
String follower) {
|
||||
int propertySize = propertyNames.size();
|
||||
for ( int propIndex = 0; propIndex < propertySize; propIndex++ ) {
|
||||
if ( ( (String) propertyNames.get( propIndex ) ).startsWith(
|
||||
follower
|
||||
) ) {
|
||||
return propIndex;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
}
|
|
@ -1,248 +0,0 @@
|
|||
/*
|
||||
* Hibernate, Relational Persistence for Idiomatic Java
|
||||
*
|
||||
* Copyright (c) 2012, Red Hat Inc. or third-party contributors as
|
||||
* indicated by the @author tags or express copyright attribution
|
||||
* statements applied by the authors. All third-party contributions are
|
||||
* distributed under license by Red Hat Inc.
|
||||
*
|
||||
* This copyrighted material is made available to anyone wishing to use, modify,
|
||||
* copy, or redistribute it subject to the terms and conditions of the GNU
|
||||
* Lesser General Public License, as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
|
||||
* for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this distribution; if not, write to:
|
||||
* Free Software Foundation, Inc.
|
||||
* 51 Franklin Street, Fifth Floor
|
||||
* Boston, MA 02110-1301 USA
|
||||
*/
|
||||
package org.hibernate.metamodel.source.internal.hbm;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
import org.hibernate.engine.spi.CascadeStyle;
|
||||
import org.hibernate.internal.util.StringHelper;
|
||||
import org.hibernate.metamodel.reflite.spi.JavaTypeDescriptor;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbColumnElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbOneToOneElement;
|
||||
import org.hibernate.metamodel.source.spi.AttributeSourceContainer;
|
||||
import org.hibernate.metamodel.source.spi.RelationalValueSource;
|
||||
import org.hibernate.metamodel.source.spi.ToolingHintSource;
|
||||
import org.hibernate.metamodel.spi.AttributePath;
|
||||
import org.hibernate.metamodel.spi.AttributeRole;
|
||||
import org.hibernate.metamodel.spi.NaturalIdMutability;
|
||||
import org.hibernate.metamodel.spi.SingularAttributeNature;
|
||||
import org.hibernate.type.ForeignKeyDirection;
|
||||
|
||||
/**
|
||||
* Implementation for {@code <one-to-one/>} mappings
|
||||
*
|
||||
* @author Gail Badner
|
||||
* @author Steve Ebersole
|
||||
*/
|
||||
class OneToOneAttributeSourceImpl extends AbstractToOneAttributeSourceImpl {
|
||||
private final JaxbOneToOneElement oneToOneElement;
|
||||
private final HibernateTypeSourceImpl typeSource;
|
||||
|
||||
private final String containingTableName;
|
||||
private final List<RelationalValueSource> valueSources;
|
||||
|
||||
private final AttributeRole attributeRole;
|
||||
private final AttributePath attributePath;
|
||||
|
||||
OneToOneAttributeSourceImpl(
|
||||
MappingDocument sourceMappingDocument,
|
||||
AttributeSourceContainer container,
|
||||
final JaxbOneToOneElement oneToOneElement,
|
||||
final String logicalTableName,
|
||||
NaturalIdMutability naturalIdMutability) {
|
||||
super( sourceMappingDocument, naturalIdMutability, oneToOneElement.getPropertyRef() );
|
||||
this.oneToOneElement = oneToOneElement;
|
||||
|
||||
final String referencedClassName = oneToOneElement.getClazz();
|
||||
JavaTypeDescriptor referencedClass = null;
|
||||
if ( StringHelper.isNotEmpty( referencedClassName ) ) {
|
||||
referencedClass = bindingContext().getJavaTypeDescriptorRepository().getType(
|
||||
bindingContext().getJavaTypeDescriptorRepository().buildName(
|
||||
bindingContext().qualifyClassName( oneToOneElement.getClazz() )
|
||||
)
|
||||
);
|
||||
}
|
||||
this.typeSource = new HibernateTypeSourceImpl( referencedClass );
|
||||
|
||||
this.containingTableName = logicalTableName;
|
||||
this.valueSources = Helper.buildValueSources(
|
||||
sourceMappingDocument(),
|
||||
new Helper.ValueSourcesAdapter() {
|
||||
@Override
|
||||
public String getColumnAttribute() {
|
||||
// Not applicable to one-to-one
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getFormulaAttribute() {
|
||||
return oneToOneElement.getFormulaAttribute();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<JaxbColumnElement> getColumn() {
|
||||
// Not applicable to one-to-one
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> getFormula() {
|
||||
return oneToOneElement.getFormula();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getContainingTableName() {
|
||||
return logicalTableName;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isIncludedInInsertByDefault() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isIncludedInUpdateByDefault() {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
this.attributeRole = container.getAttributeRoleBase().append( oneToOneElement.getName() );
|
||||
this.attributePath = container.getAttributePathBase().append( oneToOneElement.getName() );
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return oneToOneElement.getName();
|
||||
}
|
||||
|
||||
@Override
|
||||
public AttributePath getAttributePath() {
|
||||
return attributePath;
|
||||
}
|
||||
|
||||
@Override
|
||||
public AttributeRole getAttributeRole() {
|
||||
return attributeRole;
|
||||
}
|
||||
|
||||
@Override
|
||||
public HibernateTypeSourceImpl getTypeInformation() {
|
||||
return typeSource;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getPropertyAccessorName() {
|
||||
return oneToOneElement.getAccess();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isIncludedInOptimisticLocking() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<CascadeStyle> getCascadeStyles() {
|
||||
return Helper.interpretCascadeStyles( oneToOneElement.getCascade(), bindingContext() );
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String getFetchSelectionString() {
|
||||
return oneToOneElement.getFetch()!=null? oneToOneElement.getFetch().value() : null;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String getLazySelectionString() {
|
||||
return oneToOneElement.getLazy()!=null? oneToOneElement.getLazy().value() : null;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String getOuterJoinSelectionString() {
|
||||
return oneToOneElement.getOuterJoin()!=null? oneToOneElement.getOuterJoin().value() : null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public SingularAttributeNature getSingularAttributeNature() {
|
||||
return SingularAttributeNature.ONE_TO_ONE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isVirtualAttribute() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean requiresImmediateFetch() {
|
||||
return !oneToOneElement.isConstrained();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean areValuesIncludedInInsertByDefault() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean areValuesIncludedInUpdateByDefault() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean areValuesNullableByDefault() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getContainingTableName() {
|
||||
return containingTableName;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<RelationalValueSource> relationalValueSources() {
|
||||
return valueSources;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Collection<? extends ToolingHintSource> getToolingHintSources() {
|
||||
return oneToOneElement.getMeta();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getReferencedEntityName() {
|
||||
return oneToOneElement.getClazz() != null
|
||||
? bindingContext().qualifyClassName( oneToOneElement.getClazz() )
|
||||
: oneToOneElement.getEntityName();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isUnique() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getExplicitForeignKeyName() {
|
||||
return oneToOneElement.getForeignKey();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isCascadeDeleteEnabled() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ForeignKeyDirection getForeignKeyDirection() {
|
||||
return oneToOneElement.isConstrained() ? ForeignKeyDirection.FROM_PARENT : ForeignKeyDirection.TO_PARENT;
|
||||
}
|
||||
}
|
|
@ -1,147 +0,0 @@
|
|||
/*
|
||||
* 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.internal.hbm;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbColumnElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbElementElement;
|
||||
import org.hibernate.metamodel.source.spi.PluralAttributeElementSourceBasic;
|
||||
import org.hibernate.metamodel.source.spi.RelationalValueSource;
|
||||
import org.hibernate.metamodel.source.spi.SizeSource;
|
||||
import org.hibernate.metamodel.spi.PluralAttributeElementNature;
|
||||
|
||||
/**
|
||||
* @author Steve Ebersole
|
||||
*/
|
||||
public class PluralAttributeElementSourceBasicImpl
|
||||
extends AbstractHbmSourceNode
|
||||
implements PluralAttributeElementSourceBasic {
|
||||
private final HibernateTypeSourceImpl typeSource;
|
||||
private final List<RelationalValueSource> valueSources;
|
||||
|
||||
public PluralAttributeElementSourceBasicImpl(
|
||||
MappingDocument sourceMappingDocument,
|
||||
final JaxbElementElement elementElement) {
|
||||
super( sourceMappingDocument );
|
||||
|
||||
final String typeName = extractTypeName( elementElement );
|
||||
final Map<String, String> typeParams = elementElement.getType() != null
|
||||
? Helper.extractParameters( elementElement.getType().getParam() )
|
||||
: java.util.Collections.<String, String>emptyMap();
|
||||
this.typeSource = new HibernateTypeSourceImpl( typeName, typeParams );
|
||||
|
||||
this.valueSources = Helper.buildValueSources(
|
||||
sourceMappingDocument(),
|
||||
new Helper.ValueSourcesAdapter() {
|
||||
@Override
|
||||
public boolean isIncludedInInsertByDefault() {
|
||||
return PluralAttributeElementSourceBasicImpl.this.areValuesIncludedInInsertByDefault();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isIncludedInUpdateByDefault() {
|
||||
return PluralAttributeElementSourceBasicImpl.this.areValuesIncludedInUpdateByDefault();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getColumnAttribute() {
|
||||
return elementElement.getColumnAttribute();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getFormulaAttribute() {
|
||||
return elementElement.getFormulaAttribute();
|
||||
}
|
||||
|
||||
@Override
|
||||
public SizeSource getSizeSource() {
|
||||
return Helper.createSizeSourceIfMapped(
|
||||
elementElement.getLength(),
|
||||
elementElement.getPrecision(),
|
||||
elementElement.getScale()
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<JaxbColumnElement> getColumn() {
|
||||
return elementElement.getColumn();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> getFormula() {
|
||||
return elementElement.getFormula();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isForceNotNull() {
|
||||
return elementElement.isNotNull();
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
private String extractTypeName(JaxbElementElement elementElement) {
|
||||
if ( elementElement.getTypeAttribute() != null ) {
|
||||
return elementElement.getTypeAttribute();
|
||||
}
|
||||
else if ( elementElement.getType() != null ) {
|
||||
return elementElement.getType().getName();
|
||||
}
|
||||
else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public PluralAttributeElementNature getNature() {
|
||||
return PluralAttributeElementNature.BASIC;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<RelationalValueSource> relationalValueSources() {
|
||||
return valueSources;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean areValuesIncludedInInsertByDefault() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean areValuesIncludedInUpdateByDefault() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean areValuesNullableByDefault() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public HibernateTypeSourceImpl getExplicitHibernateTypeSource() {
|
||||
return typeSource;
|
||||
}
|
||||
}
|
|
@ -1,150 +0,0 @@
|
|||
/*
|
||||
* 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.internal.hbm;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
import org.hibernate.EntityMode;
|
||||
import org.hibernate.engine.spi.CascadeStyle;
|
||||
import org.hibernate.internal.util.StringHelper;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbAnyElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbCompositeElementElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbManyToOneElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbNestedCompositeElementElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbPropertyElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbTuplizerElement;
|
||||
import org.hibernate.metamodel.source.spi.EmbeddableSource;
|
||||
import org.hibernate.metamodel.source.spi.PluralAttributeElementSourceEmbedded;
|
||||
import org.hibernate.metamodel.source.spi.ToolingHintSource;
|
||||
import org.hibernate.metamodel.spi.NaturalIdMutability;
|
||||
import org.hibernate.metamodel.spi.PluralAttributeElementNature;
|
||||
|
||||
/**
|
||||
* @author Steve Ebersole
|
||||
* @author Gail Badner
|
||||
*/
|
||||
public class PluralAttributeElementSourceEmbeddedImpl
|
||||
extends AbstractHbmSourceNode
|
||||
implements PluralAttributeElementSourceEmbedded {
|
||||
|
||||
private final JaxbCompositeElementElement compositeElement;
|
||||
private final EmbeddableSourceImpl embeddableSource;
|
||||
private final Set<CascadeStyle> cascadeStyles;
|
||||
|
||||
public PluralAttributeElementSourceEmbeddedImpl(
|
||||
MappingDocument mappingDocument,
|
||||
AbstractPluralAttributeSourceImpl pluralAttributeSource,
|
||||
JaxbCompositeElementElement compositeElement,
|
||||
String cascadeString) {
|
||||
super( mappingDocument );
|
||||
this.compositeElement = compositeElement;
|
||||
|
||||
this.embeddableSource = new EmbeddableSourceImpl(
|
||||
mappingDocument,
|
||||
pluralAttributeSource.getAttributeRole(),
|
||||
pluralAttributeSource.getAttributePath(),
|
||||
new EmbeddableJaxbSourceImpl( compositeElement ),
|
||||
null,
|
||||
NaturalIdMutability.NOT_NATURAL_ID
|
||||
);
|
||||
|
||||
this.cascadeStyles = Helper.interpretCascadeStyles( cascadeString, bindingContext() );
|
||||
}
|
||||
|
||||
@Override
|
||||
public PluralAttributeElementNature getNature() {
|
||||
return PluralAttributeElementNature.AGGREGATE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public EmbeddableSource getEmbeddableSource() {
|
||||
return embeddableSource;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Collection<? extends ToolingHintSource> getToolingHintSources() {
|
||||
return compositeElement.getMeta();
|
||||
}
|
||||
|
||||
public static class EmbeddableJaxbSourceImpl extends AbstractEmbeddableJaxbSource {
|
||||
private final JaxbCompositeElementElement compositeElement;
|
||||
|
||||
public EmbeddableJaxbSourceImpl(JaxbCompositeElementElement compositeElement) {
|
||||
this.compositeElement = compositeElement;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getClazz() {
|
||||
return compositeElement.getClazz();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String findParent() {
|
||||
return compositeElement.getParent() != null
|
||||
? compositeElement.getParent().getName()
|
||||
: null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String findTuplizer() {
|
||||
if ( compositeElement.getTuplizer() == null ) {
|
||||
return null;
|
||||
}
|
||||
final EntityMode entityMode = StringHelper.isEmpty( compositeElement.getClazz() ) ? EntityMode.MAP : EntityMode.POJO;
|
||||
for ( JaxbTuplizerElement tuplizerElement : compositeElement.getTuplizer() ) {
|
||||
if ( entityMode == EntityMode.parse( tuplizerElement.getEntityMode().value() ) ) {
|
||||
return tuplizerElement.getClazz();
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<JaxbPropertyElement> getPropertyElementList() {
|
||||
return compositeElement.getProperty();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<JaxbAnyElement> getAnyElementList() {
|
||||
return compositeElement.getAny();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<JaxbNestedCompositeElementElement> getNestedCompositeElementList() {
|
||||
return compositeElement.getNestedCompositeElement();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<JaxbManyToOneElement> getManyToOneElementList() {
|
||||
return compositeElement.getManyToOne();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<CascadeStyle> getCascadeStyles() {
|
||||
return cascadeStyles;
|
||||
}
|
||||
}
|
|
@ -1,268 +0,0 @@
|
|||
/*
|
||||
* 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.internal.hbm;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
import org.hibernate.engine.FetchTiming;
|
||||
import org.hibernate.engine.spi.CascadeStyle;
|
||||
import org.hibernate.internal.util.StringHelper;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbColumnElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbFilterElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbManyToManyElement;
|
||||
import org.hibernate.metamodel.source.spi.FilterSource;
|
||||
import org.hibernate.metamodel.source.spi.MappingException;
|
||||
import org.hibernate.metamodel.source.spi.PluralAttributeElementSourceManyToMany;
|
||||
import org.hibernate.metamodel.source.spi.PluralAttributeSource;
|
||||
import org.hibernate.metamodel.source.spi.RelationalValueSource;
|
||||
import org.hibernate.metamodel.spi.PluralAttributeElementNature;
|
||||
import org.hibernate.metamodel.spi.relational.TableSpecification;
|
||||
import org.hibernate.metamodel.spi.relational.Value;
|
||||
|
||||
/**
|
||||
* @author Steve Ebersole
|
||||
* @author Gail Badner
|
||||
*/
|
||||
public class PluralAttributeElementSourceManyToManyImpl
|
||||
extends AbstractPluralAssociationElementSourceImpl
|
||||
implements PluralAttributeElementSourceManyToMany {
|
||||
private final JaxbManyToManyElement manyToManyElement;
|
||||
private final Set<CascadeStyle> cascadeStyles;
|
||||
|
||||
private final List<RelationalValueSource> valueSources;
|
||||
private final FilterSource[] filterSources;
|
||||
public PluralAttributeElementSourceManyToManyImpl(
|
||||
MappingDocument mappingDocument,
|
||||
final PluralAttributeSource pluralAttributeSource,
|
||||
final JaxbManyToManyElement manyToManyElement,
|
||||
String cascadeString) {
|
||||
super( mappingDocument, pluralAttributeSource );
|
||||
this.manyToManyElement = manyToManyElement;
|
||||
this.cascadeStyles = Helper.interpretCascadeStyles( cascadeString, bindingContext() );
|
||||
|
||||
this.valueSources = Helper.buildValueSources(
|
||||
sourceMappingDocument(),
|
||||
new Helper.ValueSourcesAdapter() {
|
||||
@Override
|
||||
public boolean isIncludedInInsertByDefault() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isIncludedInUpdateByDefault() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getColumnAttribute() {
|
||||
return manyToManyElement.getColumnAttribute();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getFormulaAttribute() {
|
||||
return manyToManyElement.getFormulaAttribute();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<JaxbColumnElement> getColumn() {
|
||||
return manyToManyElement.getColumn();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> getFormula() {
|
||||
return manyToManyElement.getFormula();
|
||||
}
|
||||
}
|
||||
);
|
||||
this.filterSources = buildFilterSources();
|
||||
}
|
||||
|
||||
private FilterSource[] buildFilterSources() {
|
||||
final int size = manyToManyElement.getFilter().size();
|
||||
if ( size == 0 ) {
|
||||
return null;
|
||||
}
|
||||
|
||||
FilterSource[] results = new FilterSource[size];
|
||||
for ( int i = 0; i < size; i++ ) {
|
||||
JaxbFilterElement element = manyToManyElement.getFilter().get( i );
|
||||
results[i] = new FilterSourceImpl( sourceMappingDocument(), element );
|
||||
}
|
||||
return results;
|
||||
}
|
||||
|
||||
@Override
|
||||
public PluralAttributeElementNature getNature() {
|
||||
return PluralAttributeElementNature.MANY_TO_MANY;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getReferencedEntityName() {
|
||||
return StringHelper.isNotEmpty( manyToManyElement.getEntityName() )
|
||||
? manyToManyElement.getEntityName()
|
||||
: bindingContext().qualifyClassName( manyToManyElement.getClazz() );
|
||||
}
|
||||
|
||||
@Override
|
||||
public FilterSource[] getFilterSources() {
|
||||
return filterSources;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getReferencedEntityAttributeName() {
|
||||
return manyToManyElement.getPropertyRef();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<RelationalValueSource> relationalValueSources() {
|
||||
return valueSources;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isIgnoreNotFound() {
|
||||
return manyToManyElement.getNotFound() != null && "ignore".equalsIgnoreCase( manyToManyElement.getNotFound().value() );
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getExplicitForeignKeyName() {
|
||||
return manyToManyElement.getForeignKey();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isCascadeDeleteEnabled() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public JoinColumnResolutionDelegate getForeignKeyTargetColumnResolutionDelegate() {
|
||||
return manyToManyElement.getPropertyRef() == null
|
||||
? null
|
||||
: new JoinColumnResolutionDelegateImpl();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isUnique() {
|
||||
return manyToManyElement.isUnique();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getWhere() {
|
||||
return manyToManyElement.getWhere();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<CascadeStyle> getCascadeStyles() {
|
||||
return cascadeStyles;
|
||||
}
|
||||
|
||||
@Override
|
||||
public FetchTiming getFetchTiming() {
|
||||
final String fetchSelection = manyToManyElement.getFetch() != null ?
|
||||
manyToManyElement.getFetch().value() :
|
||||
null;
|
||||
final String lazySelection = manyToManyElement.getLazy() != null
|
||||
? manyToManyElement.getLazy().value()
|
||||
: null;
|
||||
final String outerJoinSelection = manyToManyElement.getOuterJoin() != null
|
||||
? manyToManyElement.getOuterJoin().value()
|
||||
: null;
|
||||
|
||||
if ( lazySelection == null ) {
|
||||
if ( "join".equals( fetchSelection ) || "true".equals( outerJoinSelection ) ) {
|
||||
return FetchTiming.IMMEDIATE;
|
||||
}
|
||||
else if ( "false".equals( outerJoinSelection ) ) {
|
||||
return FetchTiming.DELAYED;
|
||||
}
|
||||
else {
|
||||
// default is FetchTiming.IMMEDIATE.
|
||||
return FetchTiming.IMMEDIATE;
|
||||
}
|
||||
}
|
||||
else if ( "true".equals( lazySelection ) ) {
|
||||
return FetchTiming.DELAYED;
|
||||
}
|
||||
else if ( "false".equals( lazySelection ) ) {
|
||||
return FetchTiming.IMMEDIATE;
|
||||
}
|
||||
// TODO: improve this method to say attribute name.
|
||||
throw new MappingException(
|
||||
String.format(
|
||||
"Unexpected lazy selection [%s] on many-to-many element",
|
||||
lazySelection
|
||||
),
|
||||
origin()
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean areValuesIncludedInInsertByDefault() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean areValuesIncludedInUpdateByDefault() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean areValuesNullableByDefault() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isOrdered() {
|
||||
return StringHelper.isNotEmpty( getOrder() );
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getOrder() {
|
||||
return manyToManyElement.getOrderBy();
|
||||
}
|
||||
|
||||
public class JoinColumnResolutionDelegateImpl implements JoinColumnResolutionDelegate {
|
||||
@Override
|
||||
public String getReferencedAttributeName() {
|
||||
return manyToManyElement.getPropertyRef();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<? extends Value> getJoinColumns(JoinColumnResolutionContext context) {
|
||||
return context.resolveRelationalValuesForAttribute( manyToManyElement.getPropertyRef() );
|
||||
}
|
||||
|
||||
@Override
|
||||
public TableSpecification getReferencedTable(JoinColumnResolutionContext context) {
|
||||
return context.resolveTableForAttribute( manyToManyElement.getPropertyRef() );
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean createForeignKeyConstraint() {
|
||||
// TODO: Can HBM do something like JPA's @ForeignKey(NO_CONSTRAINT)?
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
|
@ -1,75 +0,0 @@
|
|||
/*
|
||||
* 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.internal.hbm;
|
||||
|
||||
import java.util.Set;
|
||||
|
||||
import org.hibernate.engine.spi.CascadeStyle;
|
||||
import org.hibernate.internal.util.StringHelper;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbOneToManyElement;
|
||||
import org.hibernate.metamodel.source.spi.PluralAttributeElementSourceOneToMany;
|
||||
import org.hibernate.metamodel.source.spi.PluralAttributeSource;
|
||||
import org.hibernate.metamodel.spi.PluralAttributeElementNature;
|
||||
|
||||
/**
|
||||
* @author Steve Ebersole
|
||||
*/
|
||||
public class PluralAttributeElementSourceOneToManyImpl
|
||||
extends AbstractPluralAssociationElementSourceImpl
|
||||
implements PluralAttributeElementSourceOneToMany {
|
||||
private final JaxbOneToManyElement oneToManyElement;
|
||||
private final Set<CascadeStyle> cascadeStyles;
|
||||
|
||||
public PluralAttributeElementSourceOneToManyImpl(
|
||||
MappingDocument mappingDocument,
|
||||
final PluralAttributeSource pluralAttributeSource,
|
||||
final JaxbOneToManyElement oneToManyElement,
|
||||
String cascadeString) {
|
||||
super( mappingDocument, pluralAttributeSource );
|
||||
this.oneToManyElement = oneToManyElement;
|
||||
this.cascadeStyles = Helper.interpretCascadeStyles( cascadeString, bindingContext() );
|
||||
}
|
||||
|
||||
@Override
|
||||
public PluralAttributeElementNature getNature() {
|
||||
return PluralAttributeElementNature.ONE_TO_MANY;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getReferencedEntityName() {
|
||||
return StringHelper.isNotEmpty( oneToManyElement.getEntityName() )
|
||||
? oneToManyElement.getEntityName()
|
||||
: bindingContext().qualifyClassName( oneToManyElement.getClazz() );
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isIgnoreNotFound() {
|
||||
return oneToManyElement.getNotFound() != null && "ignore".equalsIgnoreCase( oneToManyElement.getNotFound().value() );
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<CascadeStyle> getCascadeStyles() {
|
||||
return cascadeStyles;
|
||||
}
|
||||
}
|
|
@ -1,141 +0,0 @@
|
|||
/*
|
||||
* 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.internal.hbm;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbColumnElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbKeyElement;
|
||||
import org.hibernate.metamodel.source.spi.AttributeSourceContainer;
|
||||
import org.hibernate.metamodel.source.spi.PluralAttributeKeySource;
|
||||
import org.hibernate.metamodel.source.spi.RelationalValueSource;
|
||||
import org.hibernate.metamodel.spi.relational.TableSpecification;
|
||||
import org.hibernate.metamodel.spi.relational.Value;
|
||||
|
||||
/**
|
||||
* @author Steve Ebersole
|
||||
*/
|
||||
public class PluralAttributeKeySourceImpl
|
||||
extends AbstractHbmSourceNode
|
||||
implements PluralAttributeKeySource {
|
||||
private final JaxbKeyElement keyElement;
|
||||
|
||||
private final List<RelationalValueSource> valueSources;
|
||||
|
||||
public PluralAttributeKeySourceImpl(
|
||||
MappingDocument mappingDocument,
|
||||
final JaxbKeyElement keyElement,
|
||||
final AttributeSourceContainer container) {
|
||||
super( mappingDocument );
|
||||
this.keyElement = keyElement;
|
||||
|
||||
this.valueSources = Helper.buildValueSources(
|
||||
sourceMappingDocument(),
|
||||
new Helper.ValueSourcesAdapter() {
|
||||
@Override
|
||||
public boolean isIncludedInInsertByDefault() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isIncludedInUpdateByDefault() {
|
||||
return Helper.getValue( keyElement.isUpdate(), true );
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getColumnAttribute() {
|
||||
return keyElement.getColumnAttribute();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<JaxbColumnElement> getColumn() {
|
||||
return keyElement.getColumn();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isForceNotNull() {
|
||||
return Helper.getValue( keyElement.isNotNull(), false );
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getExplicitForeignKeyName() {
|
||||
return keyElement.getForeignKey();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean createForeignKeyConstraint() {
|
||||
// TODO: Can HBM do something like JPA's @ForeignKey(NO_CONSTRAINT)?
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public JoinColumnResolutionDelegate getForeignKeyTargetColumnResolutionDelegate() {
|
||||
return keyElement.getPropertyRef() == null
|
||||
? null
|
||||
: new JoinColumnResolutionDelegate() {
|
||||
@Override
|
||||
public List<? extends Value> getJoinColumns(JoinColumnResolutionContext context) {
|
||||
return context.resolveRelationalValuesForAttribute( keyElement.getPropertyRef() );
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getReferencedAttributeName() {
|
||||
return keyElement.getPropertyRef();
|
||||
}
|
||||
|
||||
@Override
|
||||
public TableSpecification getReferencedTable(JoinColumnResolutionContext context) {
|
||||
return context.resolveTableForAttribute( keyElement.getPropertyRef() );
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isCascadeDeleteEnabled() {
|
||||
return "cascade".equals( keyElement.getOnDelete().value() );
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<RelationalValueSource> relationalValueSources() {
|
||||
return valueSources;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean areValuesIncludedInInsertByDefault() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean areValuesIncludedInUpdateByDefault() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean areValuesNullableByDefault() {
|
||||
return true;
|
||||
}
|
||||
}
|
|
@ -1,182 +0,0 @@
|
|||
/*
|
||||
* Hibernate, Relational Persistence for Idiomatic Java
|
||||
*
|
||||
* Copyright (c) 2013, 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.internal.hbm;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.hibernate.metamodel.internal.binder.Binder;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbCompositeIndexElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbCompositeMapKeyElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbKeyManyToOneElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbKeyPropertyElement;
|
||||
import org.hibernate.metamodel.source.spi.EmbeddableSource;
|
||||
import org.hibernate.metamodel.source.spi.HibernateTypeSource;
|
||||
import org.hibernate.metamodel.source.spi.PluralAttributeMapKeySourceEmbedded;
|
||||
import org.hibernate.metamodel.source.spi.RelationalValueSource;
|
||||
import org.hibernate.metamodel.spi.NaturalIdMutability;
|
||||
import org.hibernate.metamodel.spi.PluralAttributeIndexNature;
|
||||
|
||||
/**
|
||||
* @author Gail Badner
|
||||
*/
|
||||
public class PluralAttributeMapKeySourceEmbeddedImpl
|
||||
extends AbstractHbmSourceNode
|
||||
implements PluralAttributeMapKeySourceEmbedded {
|
||||
|
||||
private final AbstractPluralAttributeSourceImpl pluralAttributeSource;
|
||||
private final EmbeddableSourceImpl embeddableSource;
|
||||
|
||||
|
||||
public PluralAttributeMapKeySourceEmbeddedImpl(
|
||||
MappingDocument mappingDocument,
|
||||
AbstractPluralAttributeSourceImpl pluralAttributeSource,
|
||||
final JaxbCompositeIndexElement compositeIndexElement) {
|
||||
this(
|
||||
mappingDocument,
|
||||
pluralAttributeSource,
|
||||
new AbstractEmbeddableJaxbSource() {
|
||||
|
||||
@Override
|
||||
public String getClazz() {
|
||||
return compositeIndexElement.getClazz();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String findParent() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String findTuplizer() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<JaxbKeyPropertyElement> getKeyPropertyElementList() {
|
||||
return compositeIndexElement.getKeyProperty();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<JaxbKeyManyToOneElement> getKeyManyToOneElementList() {
|
||||
return compositeIndexElement.getKeyManyToOne();
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
public PluralAttributeMapKeySourceEmbeddedImpl(
|
||||
MappingDocument mappingDocument,
|
||||
AbstractPluralAttributeSourceImpl pluralAttributeSource,
|
||||
final JaxbCompositeMapKeyElement compositeMapKeyElement) {
|
||||
this(
|
||||
mappingDocument,
|
||||
pluralAttributeSource,
|
||||
|
||||
new AbstractEmbeddableJaxbSource() {
|
||||
|
||||
@Override
|
||||
public String getClazz() {
|
||||
return compositeMapKeyElement.getClazz();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String findParent() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String findTuplizer() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<JaxbKeyPropertyElement> getKeyPropertyElementList() {
|
||||
return compositeMapKeyElement.getKeyProperty();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<JaxbKeyManyToOneElement> getKeyManyToOneElementList() {
|
||||
return compositeMapKeyElement.getKeyManyToOne();
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
private PluralAttributeMapKeySourceEmbeddedImpl(
|
||||
MappingDocument mappingDocument,
|
||||
AbstractPluralAttributeSourceImpl pluralAttributeSource,
|
||||
EmbeddableJaxbSource embeddableJaxbSource) {
|
||||
super( mappingDocument );
|
||||
|
||||
this.pluralAttributeSource = pluralAttributeSource;
|
||||
this.embeddableSource = new EmbeddableSourceImpl(
|
||||
mappingDocument,
|
||||
pluralAttributeSource.getAttributeRole().append( "key" ),
|
||||
pluralAttributeSource.getAttributePath().append( "key" ),
|
||||
embeddableJaxbSource,
|
||||
null,
|
||||
NaturalIdMutability.NOT_NATURAL_ID
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public PluralAttributeIndexNature getNature() {
|
||||
return PluralAttributeIndexNature.AGGREGATE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public EmbeddableSource getEmbeddableSource() {
|
||||
return embeddableSource;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<Binder.DefaultNamingStrategy> getDefaultNamingStrategies() {
|
||||
return null; //To change body of implemented methods use File | Settings | File Templates.
|
||||
}
|
||||
|
||||
@Override
|
||||
public HibernateTypeSource getTypeInformation() {
|
||||
return null; //To change body of implemented methods use File | Settings | File Templates.
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<RelationalValueSource> relationalValueSources() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean areValuesIncludedInInsertByDefault() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean areValuesIncludedInUpdateByDefault() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean areValuesNullableByDefault() {
|
||||
return true;
|
||||
}
|
||||
}
|
|
@ -1,173 +0,0 @@
|
|||
/*
|
||||
* 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.internal.hbm;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
import org.hibernate.cfg.NamingStrategy;
|
||||
import org.hibernate.internal.util.StringHelper;
|
||||
import org.hibernate.metamodel.internal.binder.Binder;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbColumnElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbIndexElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbListIndexElement;
|
||||
import org.hibernate.metamodel.source.spi.PluralAttributeSequentialIndexSource;
|
||||
import org.hibernate.metamodel.source.spi.RelationalValueSource;
|
||||
import org.hibernate.metamodel.source.spi.SizeSource;
|
||||
import org.hibernate.metamodel.spi.PluralAttributeIndexNature;
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public class PluralAttributeSequentialIndexSourceImpl
|
||||
extends AbstractHbmSourceNode
|
||||
implements PluralAttributeSequentialIndexSource {
|
||||
private final int base;
|
||||
private final HibernateTypeSourceImpl typeSource;
|
||||
private final List<RelationalValueSource> valueSources;
|
||||
|
||||
public PluralAttributeSequentialIndexSourceImpl(
|
||||
MappingDocument sourceMappingDocument,
|
||||
final JaxbListIndexElement indexElement) {
|
||||
super( sourceMappingDocument );
|
||||
base = Integer.parseInt( indexElement.getBase() );
|
||||
typeSource = new HibernateTypeSourceImpl( "integer", bindingContext().typeDescriptor( "int" ) );
|
||||
valueSources = Helper.buildValueSources(
|
||||
sourceMappingDocument,
|
||||
new Helper.ValueSourcesAdapter() {
|
||||
List<JaxbColumnElement> columnElements = indexElement.getColumn() == null
|
||||
? Collections.<JaxbColumnElement>emptyList()
|
||||
: Collections.singletonList( indexElement.getColumn() );
|
||||
|
||||
@Override
|
||||
public String getColumnAttribute() {
|
||||
return indexElement.getColumnAttribute();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<JaxbColumnElement> getColumn() {
|
||||
return columnElements;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isIncludedInInsertByDefault() {
|
||||
return areValuesIncludedInInsertByDefault();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isIncludedInUpdateByDefault() {
|
||||
return areValuesIncludedInUpdateByDefault();
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
public PluralAttributeSequentialIndexSourceImpl(
|
||||
MappingDocument sourceMappingDocument,
|
||||
final JaxbIndexElement indexElement) {
|
||||
super( sourceMappingDocument );
|
||||
base = 0;
|
||||
typeSource = new HibernateTypeSourceImpl(
|
||||
StringHelper.isEmpty( indexElement.getType() ) ? "integer" : indexElement.getType(),
|
||||
bindingContext().typeDescriptor( "int" )
|
||||
);
|
||||
valueSources = Helper.buildValueSources(
|
||||
sourceMappingDocument,
|
||||
new Helper.ValueSourcesAdapter() {
|
||||
@Override
|
||||
public String getColumnAttribute() {
|
||||
return indexElement.getColumnAttribute();
|
||||
}
|
||||
|
||||
@Override
|
||||
public SizeSource getSizeSource() {
|
||||
return Helper.createSizeSourceIfMapped(
|
||||
indexElement.getLength(),
|
||||
null,
|
||||
null
|
||||
);
|
||||
}
|
||||
@Override
|
||||
public List<JaxbColumnElement> getColumn() {
|
||||
return indexElement.getColumn();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isIncludedInInsertByDefault() {
|
||||
return areValuesIncludedInInsertByDefault();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isIncludedInUpdateByDefault() {
|
||||
return areValuesIncludedInUpdateByDefault();
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean areValuesIncludedInInsertByDefault() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean areValuesIncludedInUpdateByDefault() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean areValuesNullableByDefault() {
|
||||
return false;
|
||||
}
|
||||
@Override
|
||||
public int base() {
|
||||
return base;
|
||||
}
|
||||
|
||||
@Override
|
||||
public PluralAttributeIndexNature getNature() {
|
||||
return PluralAttributeIndexNature.SEQUENTIAL;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<Binder.DefaultNamingStrategy> getDefaultNamingStrategies() {
|
||||
final Binder.DefaultNamingStrategy defaultNamingStrategy = new Binder.DefaultNamingStrategy() {
|
||||
@Override
|
||||
public String defaultName(NamingStrategy namingStrategy) {
|
||||
return namingStrategy.columnName( "idx" );
|
||||
}
|
||||
};
|
||||
return Collections.singletonList( defaultNamingStrategy );
|
||||
}
|
||||
|
||||
@Override
|
||||
public HibernateTypeSourceImpl getTypeInformation() {
|
||||
return typeSource;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List< RelationalValueSource > relationalValueSources() {
|
||||
return valueSources;
|
||||
}
|
||||
}
|
|
@ -1,223 +0,0 @@
|
|||
/*
|
||||
* Hibernate, Relational Persistence for Idiomatic Java
|
||||
*
|
||||
* Copyright (c) 2012, Red Hat Inc. or third-party contributors as
|
||||
* indicated by the @author tags or express copyright attribution
|
||||
* statements applied by the authors. All third-party contributions are
|
||||
* distributed under license by Red Hat Inc.
|
||||
*
|
||||
* This copyrighted material is made available to anyone wishing to use, modify,
|
||||
* copy, or redistribute it subject to the terms and conditions of the GNU
|
||||
* Lesser General Public License, as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
|
||||
* for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this distribution; if not, write to:
|
||||
* Free Software Foundation, Inc.
|
||||
* 51 Franklin Street, Fifth Floor
|
||||
* Boston, MA 02110-1301 USA
|
||||
*/
|
||||
package org.hibernate.metamodel.source.internal.hbm;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import org.hibernate.mapping.PropertyGeneration;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbColumnElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbPropertyElement;
|
||||
import org.hibernate.metamodel.source.spi.AttributeSourceContainer;
|
||||
import org.hibernate.metamodel.source.spi.RelationalValueSource;
|
||||
import org.hibernate.metamodel.source.spi.SingularAttributeSource;
|
||||
import org.hibernate.metamodel.source.spi.SizeSource;
|
||||
import org.hibernate.metamodel.source.spi.ToolingHintSource;
|
||||
import org.hibernate.metamodel.spi.AttributePath;
|
||||
import org.hibernate.metamodel.spi.AttributeRole;
|
||||
import org.hibernate.metamodel.spi.NaturalIdMutability;
|
||||
import org.hibernate.metamodel.spi.SingularAttributeNature;
|
||||
|
||||
/**
|
||||
* Implementation for {@code <property/>} mappings
|
||||
*
|
||||
* @author Steve Ebersole
|
||||
*/
|
||||
class PropertyAttributeSourceImpl extends AbstractHbmSourceNode implements SingularAttributeSource {
|
||||
private final JaxbPropertyElement propertyElement;
|
||||
private final HibernateTypeSourceImpl typeSource;
|
||||
private final List<RelationalValueSource> valueSources;
|
||||
private final NaturalIdMutability naturalIdMutability;
|
||||
private final String containingTableName;
|
||||
|
||||
private final AttributeRole attributeRole;
|
||||
private final AttributePath attributePath;
|
||||
|
||||
PropertyAttributeSourceImpl(
|
||||
MappingDocument sourceMappingDocument,
|
||||
AttributeSourceContainer container,
|
||||
final JaxbPropertyElement propertyElement,
|
||||
final String logicalTableName,
|
||||
NaturalIdMutability naturalIdMutability) {
|
||||
super( sourceMappingDocument );
|
||||
this.propertyElement = propertyElement;
|
||||
|
||||
final String name = propertyElement.getTypeAttribute() != null
|
||||
? propertyElement.getTypeAttribute()
|
||||
: propertyElement.getType() != null
|
||||
? propertyElement.getType().getName()
|
||||
: null;
|
||||
final Map<String, String> parameters = ( propertyElement.getType() != null )
|
||||
? Helper.extractParameters( propertyElement.getType().getParam() )
|
||||
: null;
|
||||
this.typeSource = new HibernateTypeSourceImpl( name, parameters );
|
||||
|
||||
this.containingTableName = logicalTableName;
|
||||
this.valueSources = Helper.buildValueSources(
|
||||
sourceMappingDocument(),
|
||||
new Helper.ValueSourcesAdapter() {
|
||||
@Override
|
||||
public String getColumnAttribute() {
|
||||
return propertyElement.getColumnAttribute();
|
||||
}
|
||||
|
||||
@Override
|
||||
public SizeSource getSizeSource() {
|
||||
// TODO: propertyElement.getPrecision() and getScale() return String,
|
||||
// but should return int
|
||||
return Helper.createSizeSourceIfMapped(
|
||||
propertyElement.getLength(),
|
||||
propertyElement.getPrecision() == null ? null : Integer.valueOf( propertyElement.getPrecision() ),
|
||||
propertyElement.getScale() == null ? null : Integer.valueOf( propertyElement.getScale() )
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getFormulaAttribute() {
|
||||
return propertyElement.getFormulaAttribute();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<JaxbColumnElement> getColumn() {
|
||||
return propertyElement.getColumn();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> getFormula() {
|
||||
return propertyElement.getFormula();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getContainingTableName() {
|
||||
return logicalTableName;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isIncludedInInsertByDefault() {
|
||||
return Helper.getValue( propertyElement.isInsert(), true );
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isIncludedInUpdateByDefault() {
|
||||
return Helper.getValue( propertyElement.isUpdate(), true );
|
||||
}
|
||||
}
|
||||
);
|
||||
this.naturalIdMutability = naturalIdMutability;
|
||||
|
||||
this.attributeRole = container.getAttributeRoleBase().append( getName() );
|
||||
this.attributePath = container.getAttributePathBase().append( getName() );
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return propertyElement.getName();
|
||||
}
|
||||
|
||||
@Override
|
||||
public AttributePath getAttributePath() {
|
||||
return attributePath;
|
||||
}
|
||||
|
||||
@Override
|
||||
public AttributeRole getAttributeRole() {
|
||||
return attributeRole;
|
||||
}
|
||||
|
||||
@Override
|
||||
public HibernateTypeSourceImpl getTypeInformation() {
|
||||
return typeSource;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getPropertyAccessorName() {
|
||||
return propertyElement.getAccess();
|
||||
}
|
||||
|
||||
@Override
|
||||
public PropertyGeneration getGeneration() {
|
||||
return PropertyGeneration.parse( propertyElement.getGenerated().value() );
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isLazy() {
|
||||
return Helper.getValue( propertyElement.isLazy(), false );
|
||||
}
|
||||
|
||||
@Override
|
||||
public NaturalIdMutability getNaturalIdMutability() {
|
||||
return naturalIdMutability;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isIncludedInOptimisticLocking() {
|
||||
return Helper.getValue( propertyElement.isOptimisticLock(), true );
|
||||
}
|
||||
|
||||
@Override
|
||||
public SingularAttributeNature getSingularAttributeNature() {
|
||||
return SingularAttributeNature.BASIC;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isVirtualAttribute() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean areValuesIncludedInInsertByDefault() {
|
||||
return Helper.getValue( propertyElement.isInsert(), true );
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean areValuesIncludedInUpdateByDefault() {
|
||||
return Helper.getValue( propertyElement.isUpdate(), true );
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean areValuesNullableByDefault() {
|
||||
return ! Helper.getValue( propertyElement.isNotNull(), false );
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getContainingTableName() {
|
||||
return containingTableName;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<RelationalValueSource> relationalValueSources() {
|
||||
return valueSources;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isSingular() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Collection<? extends ToolingHintSource> getToolingHintSources() {
|
||||
return propertyElement.getMeta();
|
||||
}
|
||||
}
|
|
@ -1,61 +0,0 @@
|
|||
/*
|
||||
* Hibernate, Relational Persistence for Idiomatic Java
|
||||
*
|
||||
* JBoss, Home of Professional Open Source
|
||||
* Copyright 2013 Red Hat Inc. and/or its affiliates and other contributors
|
||||
* as indicated by the @authors tag. All rights reserved.
|
||||
* See the copyright.txt in the distribution for a
|
||||
* full listing of individual contributors.
|
||||
*
|
||||
* 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, v. 2.1.
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT A
|
||||
* 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,
|
||||
* v.2.1 along with this distribution; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301, USA.
|
||||
*/
|
||||
package org.hibernate.metamodel.source.internal.hbm;
|
||||
|
||||
import org.hibernate.engine.ResultSetMappingDefinition;
|
||||
import org.hibernate.engine.query.spi.sql.NativeSQLQueryScalarReturn;
|
||||
import org.hibernate.internal.util.StringHelper;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbLoadCollectionElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbResultsetElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbReturnElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbReturnJoinElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbReturnScalarElement;
|
||||
import org.hibernate.metamodel.spi.InFlightMetadataCollector;
|
||||
import org.hibernate.metamodel.spi.LocalBindingContext;
|
||||
import org.hibernate.type.Type;
|
||||
|
||||
public class ResultSetMappingBinder {
|
||||
public static ResultSetMappingDefinition buildResultSetMappingDefinitions(
|
||||
final JaxbResultsetElement element,
|
||||
final LocalBindingContext bindingContext,
|
||||
final InFlightMetadataCollector metadataCollector) {
|
||||
final ResultSetMappingDefinition definition = new ResultSetMappingDefinition( element.getName() );
|
||||
int cnt = 0;
|
||||
for ( final JaxbReturnScalarElement r : element.getReturnScalar() ) {
|
||||
String column = r.getColumn();
|
||||
String typeFromXML = r.getType();
|
||||
Type type = StringHelper.isNotEmpty( typeFromXML ) ? metadataCollector.getTypeResolver()
|
||||
.heuristicType( typeFromXML ) : null;
|
||||
definition.addQueryReturn( new NativeSQLQueryScalarReturn( column, type ) );
|
||||
}
|
||||
for ( final JaxbReturnElement r : element.getReturn() ) {
|
||||
definition.addQueryReturn( new ReturnBinder( r, cnt++, bindingContext, metadataCollector ).process() );
|
||||
}
|
||||
for ( final JaxbReturnJoinElement r : element.getReturnJoin() ) {
|
||||
definition.addQueryReturn( new ReturnJoinBinder( r, cnt++, bindingContext, metadataCollector ).process() );
|
||||
}
|
||||
for ( final JaxbLoadCollectionElement r : element.getLoadCollection() ) {
|
||||
definition.addQueryReturn( new LoadCollectionBinder( r, cnt++, bindingContext, metadataCollector ).process() );
|
||||
}
|
||||
|
||||
return definition;
|
||||
}
|
||||
}
|
|
@ -1,142 +0,0 @@
|
|||
/*
|
||||
* Hibernate, Relational Persistence for Idiomatic Java
|
||||
*
|
||||
* JBoss, Home of Professional Open Source
|
||||
* Copyright 2013 Red Hat Inc. and/or its affiliates and other contributors
|
||||
* as indicated by the @authors tag. All rights reserved.
|
||||
* See the copyright.txt in the distribution for a
|
||||
* full listing of individual contributors.
|
||||
*
|
||||
* 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, v. 2.1.
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT A
|
||||
* 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,
|
||||
* v.2.1 along with this distribution; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301, USA.
|
||||
*/
|
||||
package org.hibernate.metamodel.source.internal.hbm;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import org.hibernate.engine.query.spi.sql.NativeSQLQueryReturn;
|
||||
import org.hibernate.engine.query.spi.sql.NativeSQLQueryRootReturn;
|
||||
import org.hibernate.internal.util.StringHelper;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbReturnElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbReturnPropertyElement;
|
||||
import org.hibernate.metamodel.spi.InFlightMetadataCollector;
|
||||
import org.hibernate.metamodel.spi.LocalBindingContext;
|
||||
import org.hibernate.metamodel.spi.binding.EntityBinding;
|
||||
|
||||
/**
|
||||
* @author Strong Liu <stliu@hibernate.org>
|
||||
*/
|
||||
class ReturnBinder extends AbstractReturnBinder<JaxbReturnElement> {
|
||||
ReturnBinder(
|
||||
final JaxbReturnElement element,
|
||||
final int elementIndex,
|
||||
final LocalBindingContext context,
|
||||
final InFlightMetadataCollector metadataCollector) {
|
||||
super( element, elementIndex, context, metadataCollector );
|
||||
}
|
||||
|
||||
@Override
|
||||
NativeSQLQueryReturn process() {
|
||||
final String clazz = element.getClazz();
|
||||
String entityName = element.getEntityName();
|
||||
if ( StringHelper.isEmpty( clazz ) && StringHelper.isEmpty( entityName ) ) {
|
||||
throw context.makeMappingException(
|
||||
"<return alias='" + alias + "'> must specify either a class or entity-name"
|
||||
);
|
||||
}
|
||||
entityName = StringHelper.isNotEmpty( entityName ) ? entityName : context.qualifyClassName( clazz );
|
||||
final EntityBinding entityBinding = metadataCollector.getEntityBinding( entityName );
|
||||
// TODO throw exception here??
|
||||
// if ( entityBinding == null ) {
|
||||
// throw bindingContext.makeMappingException( "Can't locate entitybinding" );
|
||||
// }
|
||||
|
||||
final Map<String, String[]> propertyResults = new HashMap<String, String[]>();
|
||||
bindDiscriminatorColumn( propertyResults );
|
||||
processReturnProperties( new ReturnPropertiesCallbackImpl2( alias, propertyResults, context ) );
|
||||
|
||||
return new NativeSQLQueryRootReturn(
|
||||
alias, entityName, propertyResults, lockMode
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
private void bindDiscriminatorColumn(final Map<String, String[]> propertyResults) {
|
||||
final JaxbReturnElement.JaxbReturnDiscriminator discriminator = element.getReturnDiscriminator();
|
||||
if ( discriminator != null && StringHelper.isNotEmpty( discriminator.getColumn() ) ) {
|
||||
String discriminatorColumn = StringHelper.unquote( discriminator.getColumn() );
|
||||
propertyResults.put( "class", new String[] { discriminatorColumn } );
|
||||
}
|
||||
}
|
||||
|
||||
private static class ReturnPropertiesCallbackImpl2 implements ReturnPropertiesCallback {
|
||||
private final LocalBindingContext bindingContext;
|
||||
private final String alias;
|
||||
private final Map<String, String[]> propertyResults;
|
||||
|
||||
private ReturnPropertiesCallbackImpl2(
|
||||
final String alias, final Map<String, String[]> propertyResults,
|
||||
final LocalBindingContext bindingContext) {
|
||||
this.alias = alias;
|
||||
this.bindingContext = bindingContext;
|
||||
this.propertyResults = propertyResults;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void process(final JaxbReturnPropertyElement propertyElement) {
|
||||
final String name = propertyElement.getName();
|
||||
if ( "class".equals( name ) ) {
|
||||
throw bindingContext.makeMappingException(
|
||||
"class is not a valid property name to use in a <return-property>, use <return-discriminator> instead"
|
||||
);
|
||||
}
|
||||
if ( propertyResults.containsKey( name ) ) {
|
||||
throw bindingContext.makeMappingException(
|
||||
"duplicate return-property for property " + name + " on alias " + alias
|
||||
);
|
||||
}
|
||||
final List<String> returnColumnNames = getResultColumns( propertyElement, bindingContext );
|
||||
|
||||
if ( returnColumnNames.isEmpty() ) {
|
||||
throw bindingContext.makeMappingException(
|
||||
"return-property for alias " + alias + " must specify at least one column or return-column name"
|
||||
);
|
||||
}
|
||||
|
||||
propertyResults.put( name, returnColumnNames.toArray( new String[returnColumnNames.size()] ) );
|
||||
}
|
||||
|
||||
private static List<String> getResultColumns(
|
||||
final JaxbReturnPropertyElement propertyresult, final LocalBindingContext context) {
|
||||
List<String> allResultColumns = new ArrayList<String>();
|
||||
if ( propertyresult.getColumn() != null ) {
|
||||
String column = context.getMetadataCollector()
|
||||
.getObjectNameNormalizer()
|
||||
.normalizeIdentifierQuoting( propertyresult.getColumn() );
|
||||
allResultColumns.add( column );
|
||||
}
|
||||
for ( JaxbReturnPropertyElement.JaxbReturnColumn returnColumn : propertyresult.getReturnColumn() ) {
|
||||
if ( returnColumn.getName() != null ) {
|
||||
String column = context.getMetadataCollector()
|
||||
.getObjectNameNormalizer()
|
||||
.normalizeIdentifierQuoting( returnColumn.getName() );
|
||||
|
||||
allResultColumns.add( column );
|
||||
}
|
||||
}
|
||||
return allResultColumns;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -1,61 +0,0 @@
|
|||
/*
|
||||
* Hibernate, Relational Persistence for Idiomatic Java
|
||||
*
|
||||
* JBoss, Home of Professional Open Source
|
||||
* Copyright 2013 Red Hat Inc. and/or its affiliates and other contributors
|
||||
* as indicated by the @authors tag. All rights reserved.
|
||||
* See the copyright.txt in the distribution for a
|
||||
* full listing of individual contributors.
|
||||
*
|
||||
* 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, v. 2.1.
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT A
|
||||
* 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,
|
||||
* v.2.1 along with this distribution; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301, USA.
|
||||
*/
|
||||
package org.hibernate.metamodel.source.internal.hbm;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import org.hibernate.engine.query.spi.sql.NativeSQLQueryJoinReturn;
|
||||
import org.hibernate.engine.query.spi.sql.NativeSQLQueryReturn;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbReturnJoinElement;
|
||||
import org.hibernate.metamodel.spi.InFlightMetadataCollector;
|
||||
import org.hibernate.metamodel.spi.LocalBindingContext;
|
||||
|
||||
/**
|
||||
* @author Strong Liu <stliu@hibernate.org>
|
||||
*/
|
||||
class ReturnJoinBinder extends AbstractReturnBinder<JaxbReturnJoinElement> {
|
||||
ReturnJoinBinder(
|
||||
final JaxbReturnJoinElement element,
|
||||
final int elementIndex,
|
||||
final LocalBindingContext context,
|
||||
final InFlightMetadataCollector metadataCollector) {
|
||||
super( element, elementIndex, context, metadataCollector );
|
||||
}
|
||||
|
||||
@Override
|
||||
NativeSQLQueryReturn process() {
|
||||
final String roleAttribute = element.getProperty();
|
||||
int dot = roleAttribute.lastIndexOf( '.' );
|
||||
if ( dot == -1 ) {
|
||||
throw context.makeMappingException(
|
||||
"Role attribute for sql query return " + "[alias=" + alias + "] not formatted correctly " + "{owningAlias.propertyName}"
|
||||
);
|
||||
}
|
||||
final String roleOwnerAlias = roleAttribute.substring( 0, dot );
|
||||
final String roleProperty = roleAttribute.substring( dot + 1 );
|
||||
final Map<String, String[]> propertyResults = new HashMap<String, String[]>();
|
||||
processReturnProperties( new ReturnPropertiesCallbackImpl( alias, propertyResults, context ) );
|
||||
return new NativeSQLQueryJoinReturn(
|
||||
alias, roleOwnerAlias, roleProperty, propertyResults, lockMode
|
||||
);
|
||||
}
|
||||
}
|
|
@ -1,90 +0,0 @@
|
|||
/*
|
||||
* 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.internal.hbm;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbClassElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbNaturalIdElement;
|
||||
import org.hibernate.metamodel.source.spi.AttributeSource;
|
||||
import org.hibernate.metamodel.source.spi.IdentifiableTypeSource;
|
||||
import org.hibernate.metamodel.source.spi.TableSpecificationSource;
|
||||
import org.hibernate.metamodel.spi.NaturalIdMutability;
|
||||
|
||||
/**
|
||||
* @author Steve Ebersole
|
||||
* @author Gail Badner
|
||||
*/
|
||||
public class RootEntitySourceImpl extends AbstractEntitySourceImpl {
|
||||
private final TableSpecificationSource primaryTable;
|
||||
|
||||
protected RootEntitySourceImpl(
|
||||
MappingDocument sourceMappingDocument,
|
||||
JaxbClassElement entityElement) {
|
||||
super( sourceMappingDocument, entityElement );
|
||||
this.primaryTable = Helper.createTableSource( sourceMappingDocument(), entityElement, this );
|
||||
afterInstantiation();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected List<AttributeSource> buildAttributeSources(List<AttributeSource> attributeSources) {
|
||||
final JaxbNaturalIdElement naturalId = entityElement().getNaturalId();
|
||||
if ( naturalId != null ) {
|
||||
final NaturalIdMutability naturalIdMutability = naturalId.isMutable()
|
||||
? NaturalIdMutability.MUTABLE
|
||||
: NaturalIdMutability.IMMUTABLE;
|
||||
processPropertyAttributes( attributeSources, naturalId.getProperty(), null, naturalIdMutability );
|
||||
processManyToOneAttributes( attributeSources, naturalId.getManyToOne(), null, naturalIdMutability );
|
||||
processComponentAttributes( attributeSources, naturalId.getComponent(), null, naturalIdMutability );
|
||||
processDynamicComponentAttributes(
|
||||
attributeSources,
|
||||
naturalId.getDynamicComponent(),
|
||||
null,
|
||||
naturalIdMutability
|
||||
);
|
||||
processAnyAttributes( attributeSources, naturalId.getAny(), null, naturalIdMutability );
|
||||
}
|
||||
return super.buildAttributeSources( attributeSources );
|
||||
}
|
||||
|
||||
@Override
|
||||
protected JaxbClassElement entityElement() {
|
||||
return (JaxbClassElement) super.entityElement();
|
||||
}
|
||||
|
||||
@Override
|
||||
public TableSpecificationSource getPrimaryTable() {
|
||||
return primaryTable;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDiscriminatorMatchValue() {
|
||||
return entityElement().getDiscriminatorValue();
|
||||
}
|
||||
|
||||
@Override
|
||||
public IdentifiableTypeSource getSuperType() {
|
||||
return null;
|
||||
}
|
||||
}
|
|
@ -1,199 +0,0 @@
|
|||
/*
|
||||
* Hibernate, Relational Persistence for Idiomatic Java
|
||||
*
|
||||
* Copyright (c) 2012, Red Hat Inc. or third-party contributors as
|
||||
* indicated by the @author tags or express copyright attribution
|
||||
* statements applied by the authors. All third-party contributions are
|
||||
* distributed under license by Red Hat Inc.
|
||||
*
|
||||
* This copyrighted material is made available to anyone wishing to use, modify,
|
||||
* copy, or redistribute it subject to the terms and conditions of the GNU
|
||||
* Lesser General Public License, as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
|
||||
* for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this distribution; if not, write to:
|
||||
* Free Software Foundation, Inc.
|
||||
* 51 Franklin Street, Fifth Floor
|
||||
* Boston, MA 02110-1301 USA
|
||||
*/
|
||||
package org.hibernate.metamodel.source.internal.hbm;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import org.hibernate.engine.FetchStyle;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbColumnElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbFetchStyleAttribute;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbJoinElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbOnDeleteAttribute;
|
||||
import org.hibernate.metamodel.source.spi.ColumnSource;
|
||||
import org.hibernate.metamodel.source.spi.InLineViewSource;
|
||||
import org.hibernate.metamodel.source.spi.RelationalValueSource;
|
||||
import org.hibernate.metamodel.source.spi.SecondaryTableSource;
|
||||
import org.hibernate.metamodel.source.spi.TableSource;
|
||||
import org.hibernate.metamodel.source.spi.TableSpecificationSource;
|
||||
import org.hibernate.metamodel.spi.binding.CustomSQL;
|
||||
import org.hibernate.metamodel.spi.relational.TableSpecification;
|
||||
import org.hibernate.metamodel.spi.relational.Value;
|
||||
|
||||
/**
|
||||
* @author Steve Ebersole
|
||||
*/
|
||||
class SecondaryTableSourceImpl extends AbstractHbmSourceNode implements SecondaryTableSource {
|
||||
private final JaxbJoinElement joinElement;
|
||||
private final TableSpecificationSource joinTable;
|
||||
private final List<ColumnSource> columnSources;
|
||||
private final JoinColumnResolutionDelegate fkJoinColumnResolutionDelegate;
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public SecondaryTableSourceImpl(
|
||||
MappingDocument sourceMappingDocument,
|
||||
final JaxbJoinElement joinElement,
|
||||
Helper.InLineViewNameInferrer inLineViewNameInferrer) {
|
||||
super( sourceMappingDocument );
|
||||
this.joinElement = joinElement;
|
||||
this.joinTable = Helper.createTableSource( sourceMappingDocument(), joinElement, inLineViewNameInferrer );
|
||||
|
||||
// the cast is ok here because the adapter should never be returning formulas since the schema does not allow it
|
||||
this.columnSources = extractColumnSources();
|
||||
|
||||
fkJoinColumnResolutionDelegate = joinElement.getKey().getPropertyRef() == null
|
||||
? null
|
||||
: new JoinColumnResolutionDelegateImpl( joinElement );
|
||||
}
|
||||
|
||||
private List<ColumnSource> extractColumnSources() {
|
||||
final List<ColumnSource> columnSources = new ArrayList<ColumnSource>();
|
||||
final List<RelationalValueSource> valueSources = Helper.buildValueSources(
|
||||
sourceMappingDocument(),
|
||||
new Helper.ValueSourcesAdapter() {
|
||||
@Override
|
||||
public String getContainingTableName() {
|
||||
return joinElement.getTable();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getColumnAttribute() {
|
||||
return joinElement.getKey().getColumnAttribute();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<JaxbColumnElement> getColumn() {
|
||||
return joinElement.getKey().getColumn();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isForceNotNull() {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
);
|
||||
for ( RelationalValueSource valueSource : valueSources ) {
|
||||
columnSources.add( (ColumnSource) valueSource );
|
||||
}
|
||||
return columnSources;
|
||||
}
|
||||
|
||||
@Override
|
||||
public TableSpecificationSource getTableSource() {
|
||||
return joinTable;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<ColumnSource> getPrimaryKeyColumnSources() {
|
||||
return columnSources;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getComment() {
|
||||
return joinElement.getComment();
|
||||
}
|
||||
|
||||
@Override
|
||||
public FetchStyle getFetchStyle() {
|
||||
return joinElement.getFetch() == JaxbFetchStyleAttribute.JOIN ?
|
||||
FetchStyle.JOIN :
|
||||
FetchStyle.SELECT;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isInverse() {
|
||||
return joinElement.isInverse();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isOptional() {
|
||||
return joinElement.isOptional();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isCascadeDeleteEnabled() {
|
||||
return joinElement.getKey().getOnDelete() == JaxbOnDeleteAttribute.CASCADE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getExplicitForeignKeyName() {
|
||||
return joinElement.getKey().getForeignKey();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean createForeignKeyConstraint() {
|
||||
// TODO: Can HBM do something like JPA's @ForeignKey(NO_CONSTRAINT)?
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public JoinColumnResolutionDelegate getForeignKeyTargetColumnResolutionDelegate() {
|
||||
return fkJoinColumnResolutionDelegate;
|
||||
}
|
||||
|
||||
@Override
|
||||
public CustomSQL getCustomSqlInsert() {
|
||||
return Helper.buildCustomSql( joinElement.getSqlInsert() );
|
||||
}
|
||||
|
||||
@Override
|
||||
public CustomSQL getCustomSqlUpdate() {
|
||||
return Helper.buildCustomSql( joinElement.getSqlUpdate() );
|
||||
}
|
||||
|
||||
@Override
|
||||
public CustomSQL getCustomSqlDelete() {
|
||||
return Helper.buildCustomSql( joinElement.getSqlDelete() );
|
||||
}
|
||||
|
||||
|
||||
public String getLogicalTableNameForContainedColumns() {
|
||||
return TableSource.class.isInstance( joinTable )
|
||||
? ( (TableSource) joinTable ).getExplicitTableName()
|
||||
: ( (InLineViewSource) joinTable ).getLogicalName();
|
||||
}
|
||||
|
||||
private static class JoinColumnResolutionDelegateImpl implements JoinColumnResolutionDelegate {
|
||||
private final JaxbJoinElement joinElement;
|
||||
|
||||
public JoinColumnResolutionDelegateImpl(JaxbJoinElement joinElement) {
|
||||
this.joinElement = joinElement;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<? extends Value> getJoinColumns(JoinColumnResolutionContext context) {
|
||||
return context.resolveRelationalValuesForAttribute( getReferencedAttributeName() );
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getReferencedAttributeName() {
|
||||
return joinElement.getKey().getPropertyRef();
|
||||
}
|
||||
|
||||
@Override
|
||||
public TableSpecification getReferencedTable(JoinColumnResolutionContext context) {
|
||||
return context.resolveTableForAttribute( joinElement.getKey().getPropertyRef() );
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,75 +0,0 @@
|
|||
/*
|
||||
* 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.internal.hbm;
|
||||
|
||||
import org.hibernate.internal.util.StringHelper;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbSetElement;
|
||||
import org.hibernate.metamodel.source.spi.AttributeSourceContainer;
|
||||
import org.hibernate.metamodel.source.spi.Orderable;
|
||||
import org.hibernate.metamodel.source.spi.Sortable;
|
||||
import org.hibernate.metamodel.spi.PluralAttributeNature;
|
||||
|
||||
/**
|
||||
* @author Steve Ebersole
|
||||
*/
|
||||
public class SetSourceImpl extends AbstractPluralAttributeSourceImpl implements Orderable, Sortable {
|
||||
public SetSourceImpl(
|
||||
MappingDocument sourceMappingDocument,
|
||||
JaxbSetElement setElement,
|
||||
AttributeSourceContainer container) {
|
||||
super( sourceMappingDocument, setElement, container );
|
||||
}
|
||||
|
||||
@Override
|
||||
public JaxbSetElement getPluralAttributeElement() {
|
||||
return (JaxbSetElement) super.getPluralAttributeElement();
|
||||
}
|
||||
|
||||
@Override
|
||||
public PluralAttributeNature getNature() {
|
||||
return PluralAttributeNature.SET;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isSorted() {
|
||||
String comparatorName = getComparatorName();
|
||||
return StringHelper.isNotEmpty( comparatorName )
|
||||
&& !comparatorName.equals("unsorted");
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getComparatorName() {
|
||||
return getPluralAttributeElement().getSort();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isOrdered() {
|
||||
return StringHelper.isNotEmpty( getOrder() );
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getOrder() {
|
||||
return getPluralAttributeElement().getOrderBy();
|
||||
}
|
||||
}
|
|
@ -1,205 +0,0 @@
|
|||
/*
|
||||
* 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.internal.hbm;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import org.hibernate.mapping.PropertyGeneration;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbColumnElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbIdElement;
|
||||
import org.hibernate.metamodel.source.spi.AttributeSourceContainer;
|
||||
import org.hibernate.metamodel.source.spi.RelationalValueSource;
|
||||
import org.hibernate.metamodel.source.spi.SingularAttributeSource;
|
||||
import org.hibernate.metamodel.source.spi.SizeSource;
|
||||
import org.hibernate.metamodel.source.spi.ToolingHintSource;
|
||||
import org.hibernate.metamodel.spi.AttributePath;
|
||||
import org.hibernate.metamodel.spi.AttributeRole;
|
||||
import org.hibernate.metamodel.spi.NaturalIdMutability;
|
||||
import org.hibernate.metamodel.spi.SingularAttributeNature;
|
||||
|
||||
/**
|
||||
* Implementation for {@code <id/>} mappings
|
||||
*
|
||||
* @author Steve Ebersole
|
||||
*/
|
||||
class SingularIdentifierAttributeSourceImpl
|
||||
extends AbstractHbmSourceNode
|
||||
implements SingularAttributeSource {
|
||||
|
||||
private final JaxbIdElement idElement;
|
||||
private final HibernateTypeSourceImpl typeSource;
|
||||
private final List<RelationalValueSource> valueSources;
|
||||
|
||||
private final AttributeRole attributeRole;
|
||||
private final AttributePath attributePath;
|
||||
|
||||
public SingularIdentifierAttributeSourceImpl(
|
||||
MappingDocument mappingDocument,
|
||||
AttributeSourceContainer container,
|
||||
final JaxbIdElement idElement) {
|
||||
super( mappingDocument );
|
||||
this.idElement = idElement;
|
||||
|
||||
final String name = idElement.getTypeAttribute() != null
|
||||
? idElement.getTypeAttribute()
|
||||
: idElement.getType() != null
|
||||
? idElement.getType().getName()
|
||||
: null;
|
||||
final Map<String, String> parameters = ( idElement.getType() != null )
|
||||
? Helper.extractParameters( idElement.getType().getParam() )
|
||||
: null;
|
||||
this.typeSource = new HibernateTypeSourceImpl( name, parameters );
|
||||
|
||||
this.valueSources = Helper.buildValueSources(
|
||||
sourceMappingDocument(),
|
||||
new Helper.ValueSourcesAdapter() {
|
||||
@Override
|
||||
public String getColumnAttribute() {
|
||||
return idElement.getColumnAttribute();
|
||||
}
|
||||
|
||||
@Override
|
||||
public SizeSource getSizeSource() {
|
||||
return Helper.createSizeSourceIfMapped(
|
||||
idElement.getLength(),
|
||||
null,
|
||||
null
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<JaxbColumnElement> getColumn() {
|
||||
return idElement.getColumn();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isIncludedInInsertByDefault() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isForceNotNull() {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
this.attributeRole = container.getAttributeRoleBase().append( getName() );
|
||||
this.attributePath = container.getAttributePathBase().append( getName() );
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return idElement.getName() == null
|
||||
? "id"
|
||||
: idElement.getName();
|
||||
}
|
||||
|
||||
@Override
|
||||
public AttributePath getAttributePath() {
|
||||
return attributePath;
|
||||
}
|
||||
|
||||
@Override
|
||||
public AttributeRole getAttributeRole() {
|
||||
return attributeRole;
|
||||
}
|
||||
|
||||
@Override
|
||||
public HibernateTypeSourceImpl getTypeInformation() {
|
||||
return typeSource;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getPropertyAccessorName() {
|
||||
return idElement.getAccess();
|
||||
}
|
||||
|
||||
@Override
|
||||
public PropertyGeneration getGeneration() {
|
||||
return PropertyGeneration.INSERT;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isLazy() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public NaturalIdMutability getNaturalIdMutability() {
|
||||
return NaturalIdMutability.NOT_NATURAL_ID;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isIncludedInOptimisticLocking() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public SingularAttributeNature getSingularAttributeNature() {
|
||||
return SingularAttributeNature.BASIC;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isVirtualAttribute() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean areValuesIncludedInInsertByDefault() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean areValuesIncludedInUpdateByDefault() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean areValuesNullableByDefault() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getContainingTableName() {
|
||||
return null; //To change body of implemented methods use File | Settings | File Templates.
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<RelationalValueSource> relationalValueSources() {
|
||||
return valueSources;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isSingular() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Collection<? extends ToolingHintSource> getToolingHintSources() {
|
||||
return idElement.getMeta();
|
||||
}
|
||||
}
|
|
@ -1,75 +0,0 @@
|
|||
/*
|
||||
* Hibernate, Relational Persistence for Idiomatic Java
|
||||
*
|
||||
* Copyright (c) 2013, 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.internal.hbm;
|
||||
|
||||
import org.hibernate.metamodel.source.spi.SizeSource;
|
||||
|
||||
/**
|
||||
* @author Gail Badner
|
||||
*/
|
||||
public class SizeSourceImpl implements SizeSource {
|
||||
|
||||
private final Integer length;
|
||||
private final Integer precision;
|
||||
private final Integer scale;
|
||||
|
||||
public SizeSourceImpl(Integer precision, Integer scale, Integer length) {
|
||||
this.precision = precision;
|
||||
this.scale = scale;
|
||||
this.length = length;
|
||||
}
|
||||
|
||||
public boolean isLengthDefined() {
|
||||
return length != null;
|
||||
}
|
||||
|
||||
public int getLength() {
|
||||
if ( length == null ) {
|
||||
throw new UnsupportedOperationException( "length is undefined." );
|
||||
}
|
||||
return length;
|
||||
}
|
||||
|
||||
public boolean isPrecisionDefined() {
|
||||
return precision != null;
|
||||
}
|
||||
|
||||
public int getPrecision() {
|
||||
if ( precision == null ) {
|
||||
throw new UnsupportedOperationException( "precision is undefined." );
|
||||
}
|
||||
return precision;
|
||||
}
|
||||
|
||||
public boolean isScaleDefined() {
|
||||
return scale != null;
|
||||
}
|
||||
|
||||
public int getScale() {
|
||||
if ( scale == null ) {
|
||||
throw new UnsupportedOperationException( "scale is undefined." );
|
||||
}
|
||||
return scale;
|
||||
}
|
||||
}
|
|
@ -1,70 +0,0 @@
|
|||
/*
|
||||
* 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.internal.hbm;
|
||||
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.EntityElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbSubclassElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.TableInformationSource;
|
||||
import org.hibernate.metamodel.source.spi.EntitySource;
|
||||
import org.hibernate.metamodel.source.spi.IdentifiableTypeSource;
|
||||
import org.hibernate.metamodel.source.spi.SubclassEntitySource;
|
||||
import org.hibernate.metamodel.source.spi.TableSpecificationSource;
|
||||
|
||||
/**
|
||||
* @author Steve Ebersole
|
||||
*/
|
||||
public class SubclassEntitySourceImpl extends AbstractEntitySourceImpl implements SubclassEntitySource {
|
||||
private final EntitySource container;
|
||||
private final TableSpecificationSource primaryTable;
|
||||
protected SubclassEntitySourceImpl(
|
||||
MappingDocument sourceMappingDocument,
|
||||
EntityElement entityElement,
|
||||
EntitySource container) {
|
||||
super( sourceMappingDocument, entityElement );
|
||||
this.container = container;
|
||||
this.primaryTable = TableInformationSource.class.isInstance( entityElement )
|
||||
? Helper.createTableSource( sourceMappingDocument(), (TableInformationSource) entityElement, this )
|
||||
: null;
|
||||
|
||||
|
||||
afterInstantiation();
|
||||
}
|
||||
|
||||
@Override
|
||||
public TableSpecificationSource getPrimaryTable() {
|
||||
return primaryTable;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDiscriminatorMatchValue() {
|
||||
return JaxbSubclassElement.class.isInstance( entityElement() )
|
||||
? ( (JaxbSubclassElement) entityElement() ).getDiscriminatorValue()
|
||||
: null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IdentifiableTypeSource getSuperType() {
|
||||
return container;
|
||||
}
|
||||
}
|
|
@ -1,79 +0,0 @@
|
|||
/*
|
||||
* Hibernate, Relational Persistence for Idiomatic Java
|
||||
*
|
||||
* Copyright (c) 2012, Red Hat Inc. or third-party contributors as
|
||||
* indicated by the @author tags or express copyright attribution
|
||||
* statements applied by the authors. All third-party contributions are
|
||||
* distributed under license by Red Hat Inc.
|
||||
*
|
||||
* This copyrighted material is made available to anyone wishing to use, modify,
|
||||
* copy, or redistribute it subject to the terms and conditions of the GNU
|
||||
* Lesser General Public License, as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
|
||||
* for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this distribution; if not, write to:
|
||||
* Free Software Foundation, Inc.
|
||||
* 51 Franklin Street, Fifth Floor
|
||||
* Boston, MA 02110-1301 USA
|
||||
*/
|
||||
package org.hibernate.metamodel.source.internal.hbm;
|
||||
|
||||
import org.hibernate.metamodel.source.spi.TableSource;
|
||||
|
||||
/**
|
||||
* @author Steve Ebersole
|
||||
*/
|
||||
public class TableSourceImpl
|
||||
extends AbstractHbmSourceNode
|
||||
implements TableSource {
|
||||
private final String schema;
|
||||
private final String catalog;
|
||||
private final String tableName;
|
||||
private final String rowId;
|
||||
|
||||
TableSourceImpl(
|
||||
MappingDocument mappingDocument,
|
||||
String schema,
|
||||
String catalog,
|
||||
String tableName) {
|
||||
this( mappingDocument, schema, catalog, tableName, null );
|
||||
}
|
||||
|
||||
TableSourceImpl(
|
||||
MappingDocument mappingDocument,
|
||||
String schema,
|
||||
String catalog,
|
||||
String tableName,
|
||||
String rowId) {
|
||||
super( mappingDocument );
|
||||
this.schema = schema;
|
||||
this.catalog = catalog;
|
||||
this.tableName = tableName;
|
||||
this.rowId = rowId;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getExplicitSchemaName() {
|
||||
return schema;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getExplicitCatalogName() {
|
||||
return catalog;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getExplicitTableName() {
|
||||
return tableName;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getRowId() {
|
||||
return rowId;
|
||||
}
|
||||
}
|
|
@ -1,201 +0,0 @@
|
|||
/*
|
||||
* 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.internal.hbm;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
import org.hibernate.internal.util.ValueHolder;
|
||||
import org.hibernate.mapping.PropertyGeneration;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbTimestampElement;
|
||||
import org.hibernate.metamodel.source.spi.RelationalValueSource;
|
||||
import org.hibernate.metamodel.source.spi.ToolingHintSource;
|
||||
import org.hibernate.metamodel.source.spi.VersionAttributeSource;
|
||||
import org.hibernate.metamodel.spi.AttributePath;
|
||||
import org.hibernate.metamodel.spi.AttributeRole;
|
||||
import org.hibernate.metamodel.spi.NaturalIdMutability;
|
||||
import org.hibernate.metamodel.spi.SingularAttributeNature;
|
||||
|
||||
/**
|
||||
* Implementation for {@code <timestamp/>} mappings
|
||||
*
|
||||
* @author Steve Ebersole
|
||||
*/
|
||||
class TimestampAttributeSourceImpl
|
||||
extends AbstractHbmSourceNode
|
||||
implements VersionAttributeSource {
|
||||
private final JaxbTimestampElement timestampElement;
|
||||
private final HibernateTypeSourceImpl typeSource;
|
||||
|
||||
private final List<RelationalValueSource> valueSources;
|
||||
|
||||
private final AttributePath attributePath;
|
||||
private final AttributeRole attributeRole;
|
||||
|
||||
TimestampAttributeSourceImpl(
|
||||
MappingDocument mappingDocument,
|
||||
RootEntitySourceImpl rootEntitySource,
|
||||
final JaxbTimestampElement timestampElement) {
|
||||
super( mappingDocument );
|
||||
this.timestampElement = timestampElement;
|
||||
|
||||
this.typeSource = new HibernateTypeSourceImpl(
|
||||
"db".equals( timestampElement.getSource().value() )
|
||||
? "dbtimestamp"
|
||||
: "timestamp"
|
||||
);
|
||||
|
||||
this.valueSources = Helper.buildValueSources(
|
||||
sourceMappingDocument(),
|
||||
new Helper.ValueSourcesAdapter() {
|
||||
@Override
|
||||
public String getColumnAttribute() {
|
||||
return timestampElement.getColumnAttribute();
|
||||
}
|
||||
@Override
|
||||
public boolean isIncludedInInsertByDefault() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isIncludedInUpdateByDefault() {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
this.attributePath = rootEntitySource.getAttributePathBase().append( getName() );
|
||||
this.attributeRole = rootEntitySource.getAttributeRoleBase().append( getName() );
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return timestampElement.getName();
|
||||
}
|
||||
|
||||
@Override
|
||||
public AttributePath getAttributePath() {
|
||||
return attributePath;
|
||||
}
|
||||
|
||||
@Override
|
||||
public AttributeRole getAttributeRole() {
|
||||
return attributeRole;
|
||||
}
|
||||
|
||||
@Override
|
||||
public HibernateTypeSourceImpl getTypeInformation() {
|
||||
return typeSource;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getPropertyAccessorName() {
|
||||
return timestampElement.getAccess();
|
||||
}
|
||||
|
||||
private ValueHolder<PropertyGeneration> propertyGenerationValue = new ValueHolder<PropertyGeneration>(
|
||||
new ValueHolder.DeferredInitializer<PropertyGeneration>() {
|
||||
@Override
|
||||
public PropertyGeneration initialize() {
|
||||
final PropertyGeneration propertyGeneration = timestampElement.getGenerated() == null
|
||||
? PropertyGeneration.NEVER
|
||||
: PropertyGeneration.parse( timestampElement.getGenerated().value() );
|
||||
if ( propertyGeneration == PropertyGeneration.INSERT ) {
|
||||
throw makeMappingException( "'generated' attribute cannot be 'insert' for versioning property" );
|
||||
}
|
||||
return propertyGeneration;
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
@Override
|
||||
public PropertyGeneration getGeneration() {
|
||||
return propertyGenerationValue.getValue();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isLazy() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public NaturalIdMutability getNaturalIdMutability() {
|
||||
return NaturalIdMutability.NOT_NATURAL_ID;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isIncludedInOptimisticLocking() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public SingularAttributeNature getSingularAttributeNature() {
|
||||
return SingularAttributeNature.BASIC;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isVirtualAttribute() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean areValuesIncludedInInsertByDefault() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean areValuesIncludedInUpdateByDefault() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean areValuesNullableByDefault() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getContainingTableName() {
|
||||
return null; //To change body of implemented methods use File | Settings | File Templates.
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<RelationalValueSource> relationalValueSources() {
|
||||
return valueSources;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isSingular() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Collection<? extends ToolingHintSource> getToolingHintSources() {
|
||||
return timestampElement.getMeta();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getUnsavedValue() {
|
||||
return timestampElement.getUnsavedValue().value();
|
||||
}
|
||||
}
|
|
@ -1,66 +0,0 @@
|
|||
/*
|
||||
* Hibernate, Relational Persistence for Idiomatic Java
|
||||
*
|
||||
* Copyright (c) 2012, Red Hat Inc. or third-party contributors as
|
||||
* indicated by the @author tags or express copyright attribution
|
||||
* statements applied by the authors. All third-party contributions are
|
||||
* distributed under license by Red Hat Inc.
|
||||
*
|
||||
* This copyrighted material is made available to anyone wishing to use, modify,
|
||||
* copy, or redistribute it subject to the terms and conditions of the GNU
|
||||
* Lesser General Public License, as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
|
||||
* for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this distribution; if not, write to:
|
||||
* Free Software Foundation, Inc.
|
||||
* 51 Franklin Street, Fifth Floor
|
||||
* Boston, MA 02110-1301 USA
|
||||
*/
|
||||
package org.hibernate.metamodel.source.internal.hbm;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbTypedefElement;
|
||||
import org.hibernate.metamodel.source.spi.TypeDescriptorSource;
|
||||
|
||||
/**
|
||||
* @author Steve Ebersole
|
||||
*/
|
||||
public class TypeDescriptorSourceImpl implements TypeDescriptorSource {
|
||||
private static final String[] NO_REGISTRATION_KEYS = new String[0];
|
||||
|
||||
private final String name;
|
||||
private final String implementationClassName;
|
||||
private final Map<String,String> params;
|
||||
|
||||
public TypeDescriptorSourceImpl(JaxbTypedefElement typeDefElement) {
|
||||
this.name = typeDefElement.getName();
|
||||
this.implementationClassName = typeDefElement.getClazz();
|
||||
this.params = Helper.extractParameters( typeDefElement.getParam() );
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getTypeImplementationClassName() {
|
||||
return implementationClassName;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String[] getRegistrationKeys() {
|
||||
return NO_REGISTRATION_KEYS;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Map<String, String> getParameters() {
|
||||
return params;
|
||||
}
|
||||
}
|
|
@ -1,58 +0,0 @@
|
|||
/*
|
||||
* 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.internal.hbm;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.hibernate.metamodel.source.spi.UniqueConstraintSource;
|
||||
|
||||
/**
|
||||
* @author Hardy Ferentschik
|
||||
*/
|
||||
class UniqueConstraintSourceImpl extends AbstractConstraintSource implements UniqueConstraintSource {
|
||||
|
||||
public UniqueConstraintSourceImpl(String name, String tableName, List<String> columnNames, List<String> orderings) {
|
||||
// super( name, tableName, columnNames, orderings );
|
||||
super( name, tableName );
|
||||
}
|
||||
|
||||
public UniqueConstraintSourceImpl(String name, String tableName, List<String> columnNames) {
|
||||
// super( name, tableName, columnNames, Collections.EMPTY_LIST );
|
||||
super( name, tableName );
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
sb.append( "UniqueConstraintSourceImpl" );
|
||||
sb.append( "{name='" ).append( name ).append( '\'' );
|
||||
sb.append( ", tableName='" ).append( tableName ).append( '\'' );
|
||||
sb.append( ", columnNames=" ).append( columnNames );
|
||||
sb.append( ", orderings=" ).append( orderings );
|
||||
sb.append( '}' );
|
||||
return sb.toString();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1,208 +0,0 @@
|
|||
/*
|
||||
* 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.internal.hbm;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
import org.hibernate.internal.util.ValueHolder;
|
||||
import org.hibernate.mapping.PropertyGeneration;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbColumnElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbVersionElement;
|
||||
import org.hibernate.metamodel.source.spi.RelationalValueSource;
|
||||
import org.hibernate.metamodel.source.spi.ToolingHintSource;
|
||||
import org.hibernate.metamodel.source.spi.VersionAttributeSource;
|
||||
import org.hibernate.metamodel.spi.AttributePath;
|
||||
import org.hibernate.metamodel.spi.AttributeRole;
|
||||
import org.hibernate.metamodel.spi.NaturalIdMutability;
|
||||
import org.hibernate.metamodel.spi.SingularAttributeNature;
|
||||
|
||||
|
||||
/**
|
||||
* Implementation for {@code <version/>} mappings
|
||||
*
|
||||
* @author Steve Ebersole
|
||||
*/
|
||||
class VersionAttributeSourceImpl
|
||||
extends AbstractHbmSourceNode
|
||||
implements VersionAttributeSource {
|
||||
private final JaxbVersionElement versionElement;
|
||||
private final HibernateTypeSourceImpl typeSource;
|
||||
|
||||
private final List<RelationalValueSource> valueSources;
|
||||
|
||||
private final AttributePath attributePath;
|
||||
private final AttributeRole attributeRole;
|
||||
|
||||
VersionAttributeSourceImpl(
|
||||
MappingDocument mappingDocument,
|
||||
RootEntitySourceImpl rootEntitySource,
|
||||
final JaxbVersionElement versionElement) {
|
||||
super( mappingDocument );
|
||||
this.versionElement = versionElement;
|
||||
|
||||
this.typeSource = new HibernateTypeSourceImpl(
|
||||
versionElement.getType() == null
|
||||
? "integer"
|
||||
: versionElement.getType()
|
||||
);
|
||||
|
||||
this.valueSources = Helper.buildValueSources(
|
||||
sourceMappingDocument(),
|
||||
new Helper.ValueSourcesAdapter() {
|
||||
@Override
|
||||
public String getColumnAttribute() {
|
||||
return versionElement.getColumnAttribute();
|
||||
}
|
||||
@Override
|
||||
public List<JaxbColumnElement> getColumn() {
|
||||
return versionElement.getColumn();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isIncludedInInsertByDefault() {
|
||||
return Helper.getValue( versionElement.isInsert(), true );
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isIncludedInUpdateByDefault() {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
this.attributePath = rootEntitySource.getAttributePathBase().append( getName() );
|
||||
this.attributeRole = rootEntitySource.getAttributeRoleBase().append( getName() );
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public String getUnsavedValue() {
|
||||
return versionElement.getUnsavedValue().value();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return versionElement.getName();
|
||||
}
|
||||
|
||||
@Override
|
||||
public AttributePath getAttributePath() {
|
||||
return attributePath;
|
||||
}
|
||||
|
||||
@Override
|
||||
public AttributeRole getAttributeRole() {
|
||||
return attributeRole;
|
||||
}
|
||||
|
||||
@Override
|
||||
public HibernateTypeSourceImpl getTypeInformation() {
|
||||
return typeSource;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getPropertyAccessorName() {
|
||||
return versionElement.getAccess();
|
||||
}
|
||||
|
||||
private ValueHolder<PropertyGeneration> propertyGenerationValue = new ValueHolder<PropertyGeneration>(
|
||||
new ValueHolder.DeferredInitializer<PropertyGeneration>() {
|
||||
@Override
|
||||
public PropertyGeneration initialize() {
|
||||
final PropertyGeneration propertyGeneration = versionElement.getGenerated() == null
|
||||
? PropertyGeneration.NEVER
|
||||
: PropertyGeneration.parse( versionElement.getGenerated().value() );
|
||||
if ( propertyGeneration == PropertyGeneration.INSERT ) {
|
||||
throw makeMappingException( "'generated' attribute cannot be 'insert' for versioning property" );
|
||||
}
|
||||
return propertyGeneration;
|
||||
}
|
||||
}
|
||||
);
|
||||
@Override
|
||||
public PropertyGeneration getGeneration() {
|
||||
return propertyGenerationValue.getValue();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isLazy() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public NaturalIdMutability getNaturalIdMutability() {
|
||||
return NaturalIdMutability.NOT_NATURAL_ID;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isIncludedInOptimisticLocking() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public SingularAttributeNature getSingularAttributeNature() {
|
||||
return SingularAttributeNature.BASIC;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isVirtualAttribute() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean areValuesIncludedInInsertByDefault() {
|
||||
return Helper.getValue( versionElement.isInsert(), true );
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean areValuesIncludedInUpdateByDefault() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean areValuesNullableByDefault() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getContainingTableName() {
|
||||
return null; //To change body of implemented methods use File | Settings | File Templates.
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<RelationalValueSource> relationalValueSources() {
|
||||
return valueSources;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isSingular() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Collection<? extends ToolingHintSource> getToolingHintSources() {
|
||||
return versionElement.getMeta();
|
||||
}
|
||||
}
|
|
@ -1,228 +0,0 @@
|
|||
/*
|
||||
* Hibernate, Relational Persistence for Idiomatic Java
|
||||
*
|
||||
* JBoss, Home of Professional Open Source
|
||||
* Copyright 2012 Red Hat Inc. and/or its affiliates and other contributors
|
||||
* as indicated by the @authors tag. All rights reserved.
|
||||
* See the copyright.txt in the distribution for a
|
||||
* full listing of individual contributors.
|
||||
*
|
||||
* 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, v. 2.1.
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT A
|
||||
* 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,
|
||||
* v.2.1 along with this distribution; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301, USA.
|
||||
*/
|
||||
package org.hibernate.metamodel.source.internal.hbm.parser;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import org.hibernate.CacheMode;
|
||||
import org.hibernate.FlushMode;
|
||||
import org.hibernate.MappingException;
|
||||
import org.hibernate.engine.spi.NamedQueryDefinitionBuilder;
|
||||
import org.hibernate.internal.util.StringHelper;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbCacheModeAttribute;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbFlushModeAttribute;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbQueryElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbQueryParamElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbSqlQueryElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.QuerySourceElement;
|
||||
|
||||
/**
|
||||
* @author Brett Meyer
|
||||
*/
|
||||
abstract class AbstractQueryElementContentsParser {
|
||||
|
||||
// TODO: Hate the use of QuerySourceElement -- remove/refactor.
|
||||
|
||||
public void parse( NamedQueryDefinitionBuilder builder,
|
||||
final JaxbQueryElement queryElement ) {
|
||||
|
||||
QuerySourceElement element = new QuerySourceElement() {
|
||||
@Override
|
||||
public List<Serializable> getContent() {
|
||||
return queryElement.getContent();
|
||||
}
|
||||
|
||||
@Override
|
||||
public JaxbCacheModeAttribute getCacheMode() {
|
||||
return queryElement.getCacheMode();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getCacheRegion() {
|
||||
return queryElement.getCacheRegion();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isCacheable() {
|
||||
return queryElement.isCacheable();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getComment() {
|
||||
return queryElement.getComment();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Integer getFetchSize() {
|
||||
return queryElement.getFetchSize();
|
||||
}
|
||||
|
||||
@Override
|
||||
public JaxbFlushModeAttribute getFlushMode() {
|
||||
return queryElement.getFlushMode();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return queryElement.getName();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isReadOnly() {
|
||||
return queryElement.isReadOnly();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Integer getTimeout() {
|
||||
return queryElement.getTimeout();
|
||||
}
|
||||
};
|
||||
|
||||
parse( builder, element );
|
||||
}
|
||||
|
||||
public void parse( NamedQueryDefinitionBuilder builder,
|
||||
final JaxbSqlQueryElement queryElement ) {
|
||||
|
||||
QuerySourceElement element = new QuerySourceElement() {
|
||||
@Override
|
||||
public List<Serializable> getContent() {
|
||||
return queryElement.getContent();
|
||||
}
|
||||
|
||||
@Override
|
||||
public JaxbCacheModeAttribute getCacheMode() {
|
||||
return queryElement.getCacheMode();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getCacheRegion() {
|
||||
return queryElement.getCacheRegion();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isCacheable() {
|
||||
return queryElement.isCacheable();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getComment() {
|
||||
return queryElement.getComment();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Integer getFetchSize() {
|
||||
return queryElement.getFetchSize();
|
||||
}
|
||||
|
||||
@Override
|
||||
public JaxbFlushModeAttribute getFlushMode() {
|
||||
return queryElement.getFlushMode();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return queryElement.getName();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isReadOnly() {
|
||||
return queryElement.isReadOnly();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Integer getTimeout() {
|
||||
return queryElement.getTimeout();
|
||||
}
|
||||
};
|
||||
|
||||
parse( builder, element );
|
||||
}
|
||||
|
||||
private void parse( NamedQueryDefinitionBuilder builder,
|
||||
QuerySourceElement queryElement ) {
|
||||
final String queryName = queryElement.getName();
|
||||
final boolean cacheable = queryElement.isCacheable();
|
||||
final String region = queryElement.getCacheRegion();
|
||||
final Integer timeout = queryElement.getTimeout();
|
||||
final Integer fetchSize = queryElement.getFetchSize();
|
||||
final boolean readonly = queryElement.isReadOnly();
|
||||
final String comment = queryElement.getComment();
|
||||
final CacheMode cacheMode = queryElement.getCacheMode() == null
|
||||
? null : CacheMode.valueOf( queryElement
|
||||
.getCacheMode().value().toUpperCase() );
|
||||
final FlushMode flushMode = queryElement.getFlushMode() == null
|
||||
? null : FlushMode.valueOf( queryElement
|
||||
.getFlushMode().value().toUpperCase() );
|
||||
|
||||
builder.setName( queryName ).setCacheable( cacheable )
|
||||
.setCacheRegion( region ).setTimeout( timeout )
|
||||
.setFetchSize( fetchSize ).setFlushMode( flushMode )
|
||||
.setCacheMode( cacheMode ).setReadOnly( readonly )
|
||||
.setComment( comment );
|
||||
|
||||
final List<Serializable> list = queryElement.getContent();
|
||||
parse( queryName, list, builder );
|
||||
}
|
||||
|
||||
private void parse(String queryName, List<Serializable> contents,
|
||||
NamedQueryDefinitionBuilder builder) {
|
||||
final Map<String, String> queryParam = new HashMap<String, String>();
|
||||
String query = "";
|
||||
boolean isQueryDefined = false;
|
||||
for ( Serializable obj : contents ) {
|
||||
if ( obj == null ) {
|
||||
continue;
|
||||
}
|
||||
else if ( JaxbQueryParamElement.class.isInstance( obj ) ) {
|
||||
JaxbQueryParamElement element
|
||||
= JaxbQueryParamElement.class.cast( obj );
|
||||
queryParam.put( element.getName(), element.getType() );
|
||||
}
|
||||
else if ( String.class.isInstance( obj ) ) {
|
||||
if ( !isQueryDefined ) {
|
||||
if ( StringHelper.isNotEmpty( obj.toString().trim() ) ) {
|
||||
query = obj.toString().trim();
|
||||
isQueryDefined = true;
|
||||
}
|
||||
|
||||
}
|
||||
else {
|
||||
throw new MappingException(
|
||||
"Duplicate query string is defined in Named query[+"
|
||||
+ queryName + "]" );
|
||||
}
|
||||
}
|
||||
parseExtra( queryName, obj, builder );
|
||||
}
|
||||
builder.setParameterTypes( queryParam );
|
||||
if ( StringHelper.isEmpty( query ) ) {
|
||||
throw new MappingException(
|
||||
"Named query[" + queryName+ "] has no query string defined");
|
||||
}
|
||||
builder.setQuery( query );
|
||||
}
|
||||
|
||||
protected abstract void parseExtra(String queryName, Serializable obj, NamedQueryDefinitionBuilder builder);
|
||||
}
|
|
@ -1,37 +0,0 @@
|
|||
/*
|
||||
* Hibernate, Relational Persistence for Idiomatic Java
|
||||
*
|
||||
* JBoss, Home of Professional Open Source
|
||||
* Copyright 2012 Red Hat Inc. and/or its affiliates and other contributors
|
||||
* as indicated by the @authors tag. All rights reserved.
|
||||
* See the copyright.txt in the distribution for a
|
||||
* full listing of individual contributors.
|
||||
*
|
||||
* 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, v. 2.1.
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT A
|
||||
* 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,
|
||||
* v.2.1 along with this distribution; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301, USA.
|
||||
*/
|
||||
package org.hibernate.metamodel.source.internal.hbm.parser;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
import org.hibernate.engine.spi.NamedQueryDefinitionBuilder;
|
||||
|
||||
/**
|
||||
* @author Brett Meyer
|
||||
*/
|
||||
public class BasicQueryElementContentParser extends AbstractQueryElementContentsParser {
|
||||
|
||||
@Override
|
||||
protected void parseExtra(String queryName, Serializable obj,
|
||||
NamedQueryDefinitionBuilder builder) {
|
||||
// do nothing
|
||||
}
|
||||
}
|
|
@ -1,118 +0,0 @@
|
|||
/*
|
||||
* Hibernate, Relational Persistence for Idiomatic Java
|
||||
*
|
||||
* JBoss, Home of Professional Open Source
|
||||
* Copyright 2012 Red Hat Inc. and/or its affiliates and other contributors
|
||||
* as indicated by the @authors tag. All rights reserved.
|
||||
* See the copyright.txt in the distribution for a
|
||||
* full listing of individual contributors.
|
||||
*
|
||||
* 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, v. 2.1.
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT A
|
||||
* 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,
|
||||
* v.2.1 along with this distribution; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301, USA.
|
||||
*/
|
||||
package org.hibernate.metamodel.source.internal.hbm.parser;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import javax.xml.bind.JAXBElement;
|
||||
|
||||
import org.hibernate.engine.ResultSetMappingDefinition;
|
||||
import org.hibernate.engine.spi.NamedQueryDefinitionBuilder;
|
||||
import org.hibernate.engine.spi.NamedSQLQueryDefinition;
|
||||
import org.hibernate.engine.spi.NamedSQLQueryDefinitionBuilder;
|
||||
import org.hibernate.metamodel.source.internal.hbm.ResultSetMappingBinder;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbLoadCollectionElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbResultsetElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbReturnElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbReturnJoinElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbReturnScalarElement;
|
||||
import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbSynchronizeElement;
|
||||
import org.hibernate.metamodel.spi.InFlightMetadataCollector;
|
||||
import org.hibernate.metamodel.spi.LocalBindingContext;
|
||||
|
||||
/**
|
||||
* @author Brett Meyer
|
||||
* @author String Liu
|
||||
*/
|
||||
public class SQLQueryElementContentParser extends AbstractQueryElementContentsParser {
|
||||
private final List<String> synchronizedTables = new ArrayList<String>();
|
||||
private final List<JaxbLoadCollectionElement> loadCollectionElements = new ArrayList<JaxbLoadCollectionElement>();
|
||||
private final List<JaxbReturnScalarElement> returnScalarElements = new ArrayList<JaxbReturnScalarElement>();
|
||||
private final List<JaxbReturnElement> returnElements = new ArrayList<JaxbReturnElement>();
|
||||
private final List<JaxbReturnJoinElement> returnJoinElements = new ArrayList<JaxbReturnJoinElement>();
|
||||
|
||||
@Override
|
||||
protected void parseExtra( String queryName, Serializable obj,
|
||||
NamedQueryDefinitionBuilder builder ) {
|
||||
if ( !JAXBElement.class.isInstance( obj ) ) {
|
||||
return;
|
||||
}
|
||||
JAXBElement jaxbElement = JAXBElement.class.cast( obj );
|
||||
Class targetType = jaxbElement.getDeclaredType();
|
||||
Object value = jaxbElement.getValue();
|
||||
if ( JaxbSynchronizeElement.class == targetType ) {
|
||||
JaxbSynchronizeElement element = JaxbSynchronizeElement.class.cast( value );
|
||||
synchronizedTables.add( element.getTable() );
|
||||
}
|
||||
else if ( JaxbLoadCollectionElement.class == targetType ) {
|
||||
loadCollectionElements.add( JaxbLoadCollectionElement.class.cast( value ) );
|
||||
}
|
||||
else if ( JaxbReturnScalarElement.class == targetType ) {
|
||||
returnScalarElements.add( JaxbReturnScalarElement.class.cast( value ) );
|
||||
}
|
||||
else if ( JaxbReturnElement.class == targetType ) {
|
||||
returnElements.add( JaxbReturnElement.class.cast( value ) );
|
||||
}
|
||||
else if ( JaxbReturnJoinElement.class == targetType ) {
|
||||
returnJoinElements.add( JaxbReturnJoinElement.class.cast( value ) );
|
||||
}
|
||||
}
|
||||
|
||||
public NamedSQLQueryDefinition buildQueryReturns(
|
||||
final String queryName,
|
||||
final NamedSQLQueryDefinitionBuilder builder,
|
||||
final LocalBindingContext bindingContext,
|
||||
final InFlightMetadataCollector metadataCollector) {
|
||||
|
||||
final JaxbResultsetElement mockedResultSet = new JaxbResultsetElement() {
|
||||
@Override
|
||||
public String getName() {
|
||||
return queryName;
|
||||
}
|
||||
@Override
|
||||
public List<JaxbLoadCollectionElement> getLoadCollection() {
|
||||
return loadCollectionElements;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<JaxbReturnElement> getReturn() {
|
||||
return returnElements;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<JaxbReturnJoinElement> getReturnJoin() {
|
||||
return returnJoinElements;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<JaxbReturnScalarElement> getReturnScalar() {
|
||||
return returnScalarElements;
|
||||
}
|
||||
};
|
||||
|
||||
final ResultSetMappingDefinition definition = ResultSetMappingBinder.buildResultSetMappingDefinitions( mockedResultSet,bindingContext, metadataCollector );
|
||||
|
||||
return builder.setQueryReturns( definition.getQueryReturns() )
|
||||
.setQuerySpaces( synchronizedTables )
|
||||
.createNamedQueryDefinition();
|
||||
}
|
||||
}
|
|
@ -24,6 +24,7 @@
|
|||
package org.hibernate.metamodel.spi;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import javax.persistence.SharedCacheMode;
|
||||
|
||||
import org.hibernate.MultiTenancyStrategy;
|
||||
|
@ -31,16 +32,12 @@ import org.hibernate.boot.registry.StandardServiceRegistry;
|
|||
import org.hibernate.boot.spi.CacheRegionDefinition;
|
||||
import org.hibernate.cache.spi.access.AccessType;
|
||||
import org.hibernate.cfg.NamingStrategy;
|
||||
import org.hibernate.metamodel.MetadataSourceProcessingOrder;
|
||||
import org.hibernate.metamodel.archive.scan.spi.ScanEnvironment;
|
||||
import org.hibernate.metamodel.archive.scan.spi.ScanOptions;
|
||||
import org.hibernate.metamodel.archive.scan.spi.Scanner;
|
||||
import org.hibernate.metamodel.archive.spi.ArchiveDescriptorFactory;
|
||||
import org.hibernate.metamodel.spi.relational.Database;
|
||||
import org.hibernate.type.BasicType;
|
||||
|
||||
import org.jboss.jandex.IndexView;
|
||||
|
||||
import org.xml.sax.EntityResolver;
|
||||
|
||||
/**
|
||||
|
@ -200,9 +197,7 @@ public interface MetadataBuildingOptions {
|
|||
*/
|
||||
PersistentAttributeMemberResolver getPersistentAttributeMemberResolver();
|
||||
|
||||
// todo : these 2 will go away...
|
||||
|
||||
MetadataSourceProcessingOrder getMetadataSourceProcessingOrder();
|
||||
// todo : this will go away...
|
||||
|
||||
EntityResolver getEntityResolver();
|
||||
}
|
||||
|
|
|
@ -1,72 +0,0 @@
|
|||
/*
|
||||
* 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.spi;
|
||||
|
||||
import java.util.Collection;
|
||||
|
||||
import org.hibernate.metamodel.source.spi.EntityHierarchySource;
|
||||
import org.hibernate.metamodel.source.spi.FilterDefinitionSource;
|
||||
import org.hibernate.metamodel.source.spi.IdentifierGeneratorSource;
|
||||
import org.hibernate.metamodel.source.spi.TypeDescriptorSource;
|
||||
|
||||
/**
|
||||
* Handles the processing of metadata sources in a dependency-ordered manner.
|
||||
*
|
||||
* @author Steve Ebersole
|
||||
*/
|
||||
public interface MetadataSourceProcessor {
|
||||
/**
|
||||
* Retrieve the sources pertaining to type descriptors.
|
||||
*
|
||||
* @return The type descriptor sources.
|
||||
*/
|
||||
Iterable<TypeDescriptorSource> extractTypeDefinitionSources();
|
||||
|
||||
/**
|
||||
* Retrieve the sources pertaining to filter defs.
|
||||
*
|
||||
* @return The filter def sources.
|
||||
*/
|
||||
Iterable<FilterDefinitionSource> extractFilterDefinitionSources();
|
||||
|
||||
/**
|
||||
* Retrieve the sources of "global" identifier generator specifications.
|
||||
*
|
||||
* @return The identifier generator sources.
|
||||
*/
|
||||
Iterable<IdentifierGeneratorSource> extractGlobalIdentifierGeneratorSources();
|
||||
|
||||
/**
|
||||
* Retrieve the entity hierarchies.
|
||||
*
|
||||
* @return The entity hierarchies
|
||||
*/
|
||||
Collection<EntityHierarchySource> extractEntityHierarchies();
|
||||
|
||||
/**
|
||||
* Process the parts of the metadata that depend on mapping (entities, et al) information having been
|
||||
* processed and available.
|
||||
*/
|
||||
void processMappingDependentMetadata();
|
||||
}
|
|
@ -23,6 +23,12 @@
|
|||
*/
|
||||
package org.hibernate.metamodel.internal.source;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertFalse;
|
||||
import static org.junit.Assert.assertNotNull;
|
||||
import static org.junit.Assert.assertNull;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
import java.util.Iterator;
|
||||
|
||||
import org.hibernate.EntityMode;
|
||||
|
@ -34,8 +40,7 @@ import org.hibernate.internal.util.StringHelper;
|
|||
import org.hibernate.internal.util.collections.ArrayHelper;
|
||||
import org.hibernate.mapping.PropertyGeneration;
|
||||
import org.hibernate.metamodel.MetadataSources;
|
||||
import org.hibernate.metamodel.source.internal.annotations.AnnotationMetadataSourceProcessorImpl;
|
||||
import org.hibernate.metamodel.source.internal.hbm.HbmMetadataSourceProcessorImpl;
|
||||
import org.hibernate.metamodel.source.internal.annotations.AnnotationMetadataSourceProcessor;
|
||||
import org.hibernate.metamodel.source.spi.EntityHierarchySource;
|
||||
import org.hibernate.metamodel.source.spi.EntitySource;
|
||||
import org.hibernate.metamodel.source.spi.IdentifierGeneratorSource;
|
||||
|
@ -45,21 +50,12 @@ import org.hibernate.metamodel.source.spi.SingularAttributeSource;
|
|||
import org.hibernate.metamodel.source.spi.TableSource;
|
||||
import org.hibernate.metamodel.source.spi.TableSpecificationSource;
|
||||
import org.hibernate.metamodel.spi.BindingContext;
|
||||
import org.hibernate.metamodel.spi.MetadataSourceProcessor;
|
||||
import org.hibernate.metamodel.spi.SingularAttributeNature;
|
||||
import org.hibernate.metamodel.spi.binding.IdentifierGeneratorDefinition;
|
||||
import org.hibernate.metamodel.spi.binding.InheritanceType;
|
||||
|
||||
import org.hibernate.testing.junit4.BaseUnitTestCase;
|
||||
import org.junit.Test;
|
||||
|
||||
import org.jboss.jandex.IndexView;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertFalse;
|
||||
import static org.junit.Assert.assertNotNull;
|
||||
import static org.junit.Assert.assertNull;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
import org.junit.Test;
|
||||
|
||||
/**
|
||||
* @author Steve Ebersole
|
||||
|
@ -67,18 +63,19 @@ import static org.junit.Assert.assertTrue;
|
|||
public class AssertSourcesTest extends BaseUnitTestCase {
|
||||
final StandardServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().build() ;
|
||||
|
||||
@Test
|
||||
public void testUserEntitySourcesHbm() {
|
||||
BindingContext rootContext = RootBindingContextBuilder.buildBindingContext( serviceRegistry );
|
||||
|
||||
MetadataSources hbm = new MetadataSources( serviceRegistry );
|
||||
hbm.addResource( getClass().getPackage().getName().replace( '.', '/' ) + "/User.hbm.xml" );
|
||||
MetadataSourceProcessor hbmProcessor = new HbmMetadataSourceProcessorImpl(
|
||||
rootContext,
|
||||
hbm
|
||||
);
|
||||
testUserEntitySources( hbmProcessor, rootContext );
|
||||
}
|
||||
// TODO
|
||||
// @Test
|
||||
// public void testUserEntitySourcesHbm() {
|
||||
// BindingContext rootContext = RootBindingContextBuilder.buildBindingContext( serviceRegistry );
|
||||
//
|
||||
// MetadataSources hbm = new MetadataSources( serviceRegistry );
|
||||
// hbm.addResource( getClass().getPackage().getName().replace( '.', '/' ) + "/User.hbm.xml" );
|
||||
// MetadataSourceProcessor hbmProcessor = new HbmMetadataSourceProcessorImpl(
|
||||
// rootContext,
|
||||
// hbm
|
||||
// );
|
||||
// testUserEntitySources( hbmProcessor, rootContext );
|
||||
// }
|
||||
|
||||
@Test
|
||||
public void testUserEntitySourcesAnnotations() {
|
||||
|
@ -89,14 +86,14 @@ public class AssertSourcesTest extends BaseUnitTestCase {
|
|||
final IndexView indexView = ann.buildJandexView();
|
||||
BindingContext rootContext = RootBindingContextBuilder.buildBindingContext( serviceRegistry, indexView );
|
||||
|
||||
MetadataSourceProcessor annProcessor = new AnnotationMetadataSourceProcessorImpl(
|
||||
AnnotationMetadataSourceProcessor annProcessor = new AnnotationMetadataSourceProcessor(
|
||||
rootContext,
|
||||
indexView
|
||||
);
|
||||
testUserEntitySources( annProcessor, rootContext );
|
||||
}
|
||||
|
||||
private void testUserEntitySources(MetadataSourceProcessor processor, BindingContext rootContext) {
|
||||
private void testUserEntitySources(AnnotationMetadataSourceProcessor processor, BindingContext rootContext) {
|
||||
for ( IdentifierGeneratorSource identifierGeneratorSource : processor.extractGlobalIdentifierGeneratorSources() ) {
|
||||
rootContext.getMetadataCollector().addIdGenerator(
|
||||
new IdentifierGeneratorDefinition(
|
||||
|
@ -201,14 +198,14 @@ public class AssertSourcesTest extends BaseUnitTestCase {
|
|||
ann.addAnnotatedClass( Order.class );
|
||||
ann.addAnnotatedClass( Order.OrderPk.class );
|
||||
IndexView indexView = ann.buildJandexView();
|
||||
MetadataSourceProcessor annProcessor = new AnnotationMetadataSourceProcessorImpl(
|
||||
AnnotationMetadataSourceProcessor annProcessor = new AnnotationMetadataSourceProcessor(
|
||||
RootBindingContextBuilder.buildBindingContext( serviceRegistry, indexView ),
|
||||
indexView
|
||||
);
|
||||
testOrderEntitySources( annProcessor );
|
||||
}
|
||||
|
||||
private void testOrderEntitySources(MetadataSourceProcessor processor) {
|
||||
private void testOrderEntitySources(AnnotationMetadataSourceProcessor processor) {
|
||||
Iterator<EntityHierarchySource> hierarchies = processor.extractEntityHierarchies().iterator();
|
||||
assertTrue( hierarchies.hasNext() );
|
||||
EntityHierarchySource hierarchy = hierarchies.next();
|
||||
|
@ -229,16 +226,15 @@ public class AssertSourcesTest extends BaseUnitTestCase {
|
|||
ann.addAnnotatedClass( Order.class );
|
||||
ann.addAnnotatedClass( Order.class );
|
||||
ann.addAnnotatedClass( Order.OrderPk.class );
|
||||
MetadataSourceProcessor annProcessor;
|
||||
final IndexView indexView = ann.buildJandexView();
|
||||
annProcessor = new AnnotationMetadataSourceProcessorImpl(
|
||||
AnnotationMetadataSourceProcessor annProcessor = new AnnotationMetadataSourceProcessor(
|
||||
RootBindingContextBuilder.buildBindingContext( serviceRegistry, indexView ),
|
||||
indexView
|
||||
);
|
||||
testOrderNonAggregatedEntitySources( annProcessor );
|
||||
}
|
||||
|
||||
private void testOrderNonAggregatedEntitySources(MetadataSourceProcessor processor) {
|
||||
private void testOrderNonAggregatedEntitySources(AnnotationMetadataSourceProcessor processor) {
|
||||
Iterator<EntityHierarchySource> hierarchies = processor.extractEntityHierarchies().iterator();
|
||||
assertTrue( hierarchies.hasNext() );
|
||||
EntityHierarchySource hierarchy = hierarchies.next();
|
||||
|
|
|
@ -23,22 +23,20 @@
|
|||
*/
|
||||
package org.hibernate.metamodel.spi.binding;
|
||||
|
||||
import org.junit.After;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertNotNull;
|
||||
|
||||
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
|
||||
import org.hibernate.boot.registry.internal.StandardServiceRegistryImpl;
|
||||
import org.hibernate.metamodel.MetadataSourceProcessingOrder;
|
||||
import org.hibernate.metamodel.MetadataSources;
|
||||
import org.hibernate.metamodel.internal.MetadataImpl;
|
||||
import org.hibernate.metamodel.spi.relational.Column;
|
||||
import org.hibernate.metamodel.spi.relational.Identifier;
|
||||
import org.hibernate.testing.TestForIssue;
|
||||
import org.hibernate.testing.junit4.BaseUnitTestCase;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertNotNull;
|
||||
import org.junit.After;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
/**
|
||||
* @author Gail Badner
|
||||
|
@ -56,22 +54,13 @@ public class UnidirectionalManyToManyBindingTests extends BaseUnitTestCase {
|
|||
serviceRegistry.destroy();
|
||||
}
|
||||
|
||||
// @Test
|
||||
// public void testAnnotations() {
|
||||
// doTest( MetadataSourceProcessingOrder.ANNOTATIONS_FIRST );
|
||||
// }
|
||||
|
||||
@Test
|
||||
@TestForIssue( jiraKey = "HHH-7436" )
|
||||
public void testHbm() {
|
||||
doTest( MetadataSourceProcessingOrder.HBM_FIRST );
|
||||
}
|
||||
|
||||
private void doTest(MetadataSourceProcessingOrder processingOrder) {
|
||||
MetadataSources sources = new MetadataSources( serviceRegistry );
|
||||
sources.addResource( "org/hibernate/metamodel/spi/binding/EntityWithUnidirectionalManyToManys.hbm.xml" );
|
||||
sources.addResource( "org/hibernate/metamodel/spi/binding/SimpleEntity.hbm.xml" );
|
||||
MetadataImpl metadata = (MetadataImpl) sources.getMetadataBuilder().with( processingOrder ).build();
|
||||
MetadataImpl metadata = (MetadataImpl) sources.getMetadataBuilder().build();
|
||||
|
||||
final EntityBinding entityBinding = metadata.getEntityBinding( EntityWithUnidirectionalManyToMany.class.getName() );
|
||||
final EntityBinding simpleEntityBinding = metadata.getEntityBinding( SimpleEntity.class.getName() );
|
||||
|
|
Loading…
Reference in New Issue