HHH-9466 - Drop metamodel package from source

This commit is contained in:
Steve Ebersole 2014-10-30 07:43:54 -05:00
parent b943525c80
commit 66ce8b7fb5
446 changed files with 135 additions and 44866 deletions

View File

@ -314,7 +314,7 @@
<literal>org.hibernate.boot.registry.selector.StrategyRegistrationProvider</literal> (as of 4.3) <literal>org.hibernate.boot.registry.selector.StrategyRegistrationProvider</literal> (as of 4.3)
</listitem> </listitem>
<listitem> <listitem>
<literal>org.hibernate.metamodel.spi.TypeContributor</literal> (as of 4.3) <literal>org.hibernate.boot.model.TypeContributor</literal> (as of 4.3)
</listitem> </listitem>
<listitem> <listitem>
JTA's <literal>javax.transaction.TransactionManager</literal> and JTA's <literal>javax.transaction.TransactionManager</literal> and

View File

@ -6,6 +6,6 @@
<bean id="typeContributor" <bean id="typeContributor"
class="org.hibernate.envers.internal.entities.TypeContributorImpl" /> class="org.hibernate.envers.internal.entities.TypeContributorImpl" />
<service ref="typeContributor" interface="org.hibernate.metamodel.spi.TypeContributor" /> <service ref="typeContributor" interface="org.hibernate.boot.model.TypeContributor" />
</blueprint> </blueprint>

View File

@ -33,7 +33,7 @@
<service ref="strategyRegistrationProvider" interface="org.hibernate.boot.registry.selector.StrategyRegistrationProvider"/> <service ref="strategyRegistrationProvider" interface="org.hibernate.boot.registry.selector.StrategyRegistrationProvider"/>
<bean id="typeContributor" class="org.hibernate.osgitest.TestTypeContributor"/> <bean id="typeContributor" class="org.hibernate.osgitest.TestTypeContributor"/>
<service ref="typeContributor" interface="org.hibernate.metamodel.spi.TypeContributor"/> <service ref="typeContributor" interface="org.hibernate.boot.model.TypeContributor"/>
<!-- This bundle makes use of Karaf commands to demonstrate core persistence operations. Feel free to remove it. --> <!-- This bundle makes use of Karaf commands to demonstrate core persistence operations. Feel free to remove it. -->
<command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0"> <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">

View File

@ -33,7 +33,7 @@
<service ref="strategyRegistrationProvider" interface="org.hibernate.boot.registry.selector.StrategyRegistrationProvider"/> <service ref="strategyRegistrationProvider" interface="org.hibernate.boot.registry.selector.StrategyRegistrationProvider"/>
<bean id="typeContributor" class="org.hibernate.osgitest.TestTypeContributor"/> <bean id="typeContributor" class="org.hibernate.osgitest.TestTypeContributor"/>
<service ref="typeContributor" interface="org.hibernate.metamodel.spi.TypeContributor"/> <service ref="typeContributor" interface="org.hibernate.boot.model.TypeContributor"/>
<!-- This bundle makes use of Karaf commands to demonstrate core persistence operations. Feel free to remove it. --> <!-- This bundle makes use of Karaf commands to demonstrate core persistence operations. Feel free to remove it. -->
<command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0"> <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">

View File

@ -21,7 +21,7 @@
* 51 Franklin Street, Fifth Floor * 51 Franklin Street, Fifth Floor
* Boston, MA 02110-1301 USA * Boston, MA 02110-1301 USA
*/ */
package org.hibernate.metamodel.spi; package org.hibernate.boot.model;
import org.hibernate.type.BasicType; import org.hibernate.type.BasicType;
import org.hibernate.usertype.CompositeUserType; import org.hibernate.usertype.CompositeUserType;

View File

@ -21,7 +21,7 @@
* 51 Franklin Street, Fifth Floor * 51 Franklin Street, Fifth Floor
* Boston, MA 02110-1301 USA * Boston, MA 02110-1301 USA
*/ */
package org.hibernate.metamodel.spi; package org.hibernate.boot.model;
import org.hibernate.service.ServiceRegistry; import org.hibernate.service.ServiceRegistry;

View File

@ -28,8 +28,6 @@ import java.util.Comparator;
import org.hibernate.cache.spi.CacheDataDescription; import org.hibernate.cache.spi.CacheDataDescription;
import org.hibernate.mapping.Collection; import org.hibernate.mapping.Collection;
import org.hibernate.mapping.PersistentClass; import org.hibernate.mapping.PersistentClass;
import org.hibernate.metamodel.binding.EntityBinding;
import org.hibernate.metamodel.binding.PluralAttributeBinding;
import org.hibernate.type.VersionType; import org.hibernate.type.VersionType;
/** /**
@ -88,17 +86,6 @@ public class CacheDataDescriptionImpl implements CacheDataDescription {
); );
} }
/**
* Builds a CacheDataDescriptionImpl from the mapping model of an entity class (using the new metamodel code).
*
* @param model The mapping model.
*
* @return The constructed CacheDataDescriptionImpl
*/
public static CacheDataDescriptionImpl decode(EntityBinding model) {
return new CacheDataDescriptionImpl( model.isMutable(), model.isVersioned(), getVersionComparator( model ) );
}
/** /**
* Builds a CacheDataDescriptionImpl from the mapping model of a collection * Builds a CacheDataDescriptionImpl from the mapping model of a collection
* *
@ -116,31 +103,4 @@ public class CacheDataDescriptionImpl implements CacheDataDescription {
); );
} }
/**
* Builds a CacheDataDescriptionImpl from the mapping model of a collection (using the new metamodel code).
*
* @param model The mapping model.
*
* @return The constructed CacheDataDescriptionImpl
*/
public static CacheDataDescriptionImpl decode(PluralAttributeBinding model) {
return new CacheDataDescriptionImpl(
model.isMutable(),
model.getContainer().seekEntityBinding().isVersioned(),
getVersionComparator( model.getContainer().seekEntityBinding() )
);
}
private static Comparator getVersionComparator(EntityBinding model ) {
if ( model.isVersioned() ) {
final VersionType versionType = (VersionType) model.getHierarchyDetails()
.getVersioningAttributeBinding()
.getHibernateTypeDescriptor()
.getResolvedTypeMapping();
return versionType.getComparator();
}
return null;
}
} }

View File

@ -39,7 +39,6 @@ import org.hibernate.event.spi.PostInsertEventListener;
import org.hibernate.event.spi.PostUpdateEvent; import org.hibernate.event.spi.PostUpdateEvent;
import org.hibernate.event.spi.PostUpdateEventListener; import org.hibernate.event.spi.PostUpdateEventListener;
import org.hibernate.integrator.spi.Integrator; import org.hibernate.integrator.spi.Integrator;
import org.hibernate.metamodel.source.MetadataImplementor;
import org.hibernate.persister.collection.CollectionPersister; import org.hibernate.persister.collection.CollectionPersister;
import org.hibernate.persister.entity.EntityPersister; import org.hibernate.persister.entity.EntityPersister;
import org.hibernate.service.spi.SessionFactoryServiceRegistry; import org.hibernate.service.spi.SessionFactoryServiceRegistry;
@ -65,12 +64,6 @@ public class CollectionCacheInvalidator implements Integrator, PostInsertEventLi
integrate( serviceRegistry, sessionFactory ); integrate( serviceRegistry, sessionFactory );
} }
@Override
public void integrate(MetadataImplementor metadata, SessionFactoryImplementor sessionFactory,
SessionFactoryServiceRegistry serviceRegistry) {
integrate( serviceRegistry, sessionFactory );
}
@Override @Override
public void disintegrate(SessionFactoryImplementor sessionFactory, SessionFactoryServiceRegistry serviceRegistry) { public void disintegrate(SessionFactoryImplementor sessionFactory, SessionFactoryServiceRegistry serviceRegistry) {
} }

View File

@ -136,8 +136,8 @@ import org.hibernate.mapping.SimpleValue;
import org.hibernate.mapping.Table; import org.hibernate.mapping.Table;
import org.hibernate.mapping.TypeDef; import org.hibernate.mapping.TypeDef;
import org.hibernate.mapping.UniqueKey; import org.hibernate.mapping.UniqueKey;
import org.hibernate.metamodel.spi.TypeContributions; import org.hibernate.boot.model.TypeContributions;
import org.hibernate.metamodel.spi.TypeContributor; import org.hibernate.boot.model.TypeContributor;
import org.hibernate.proxy.EntityNotFoundDelegate; import org.hibernate.proxy.EntityNotFoundDelegate;
import org.hibernate.secure.spi.GrantedPermission; import org.hibernate.secure.spi.GrantedPermission;
import org.hibernate.secure.spi.JaccPermissionDeclarations; import org.hibernate.secure.spi.JaccPermissionDeclarations;

View File

@ -33,7 +33,6 @@ import org.hibernate.cfg.Configuration;
import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.hibernate.integrator.spi.Integrator; import org.hibernate.integrator.spi.Integrator;
import org.hibernate.internal.CoreMessageLogger; import org.hibernate.internal.CoreMessageLogger;
import org.hibernate.metamodel.source.MetadataImplementor;
import org.hibernate.service.spi.SessionFactoryServiceRegistry; import org.hibernate.service.spi.SessionFactoryServiceRegistry;
import org.jboss.logging.Logger; import org.jboss.logging.Logger;
@ -201,15 +200,6 @@ public class BeanValidationIntegrator implements Integrator {
} }
} }
@Override
public void integrate(
MetadataImplementor metadata,
SessionFactoryImplementor sessionFactory,
SessionFactoryServiceRegistry serviceRegistry ) {
}
@Override @Override
public void disintegrate(SessionFactoryImplementor sessionFactory, SessionFactoryServiceRegistry serviceRegistry) { public void disintegrate(SessionFactoryImplementor sessionFactory, SessionFactoryServiceRegistry serviceRegistry) {
// nothing to do here afaik // nothing to do here afaik

View File

@ -79,7 +79,7 @@ import org.hibernate.internal.util.StringHelper;
import org.hibernate.internal.util.collections.ArrayHelper; import org.hibernate.internal.util.collections.ArrayHelper;
import org.hibernate.internal.util.io.StreamCopier; import org.hibernate.internal.util.io.StreamCopier;
import org.hibernate.mapping.Column; import org.hibernate.mapping.Column;
import org.hibernate.metamodel.spi.TypeContributions; import org.hibernate.boot.model.TypeContributions;
import org.hibernate.persister.entity.Lockable; import org.hibernate.persister.entity.Lockable;
import org.hibernate.procedure.internal.StandardCallableStatementSupport; import org.hibernate.procedure.internal.StandardCallableStatementSupport;
import org.hibernate.procedure.spi.CallableStatementSupport; import org.hibernate.procedure.spi.CallableStatementSupport;

View File

@ -23,9 +23,6 @@ package org.hibernate.dialect.unique;
import java.util.Iterator; import java.util.Iterator;
import org.hibernate.dialect.Dialect; import org.hibernate.dialect.Dialect;
import org.hibernate.metamodel.relational.Column;
import org.hibernate.metamodel.relational.Index;
import org.hibernate.metamodel.relational.UniqueKey;
/** /**
* DB2 does not allow unique constraints on nullable columns. Rather than * DB2 does not allow unique constraints on nullable columns. Rather than
@ -65,22 +62,6 @@ public class DB2UniqueDelegate extends DefaultUniqueDelegate {
} }
} }
@Override
public String getAlterTableToAddUniqueKeyCommand(UniqueKey uniqueKey) {
if ( hasNullable( uniqueKey ) ) {
return Index.buildSqlCreateIndexString(
dialect,
uniqueKey.getName(),
uniqueKey.getTable(),
uniqueKey.getColumns(),
true
);
}
else {
return super.getAlterTableToAddUniqueKeyCommand( uniqueKey );
}
}
@Override @Override
public String getAlterTableToDropUniqueKeyCommand( public String getAlterTableToDropUniqueKeyCommand(
org.hibernate.mapping.UniqueKey uniqueKey, org.hibernate.mapping.UniqueKey uniqueKey,
@ -102,16 +83,6 @@ public class DB2UniqueDelegate extends DefaultUniqueDelegate {
} }
} }
@Override
public String getAlterTableToDropUniqueKeyCommand(UniqueKey uniqueKey) {
if ( hasNullable( uniqueKey ) ) {
return Index.buildSqlDropIndexString( dialect, uniqueKey.getTable(), uniqueKey.getName() );
}
else {
return super.getAlterTableToDropUniqueKeyCommand( uniqueKey );
}
}
private boolean hasNullable(org.hibernate.mapping.UniqueKey uniqueKey) { private boolean hasNullable(org.hibernate.mapping.UniqueKey uniqueKey) {
final Iterator<org.hibernate.mapping.Column> iter = uniqueKey.columnIterator(); final Iterator<org.hibernate.mapping.Column> iter = uniqueKey.columnIterator();
while ( iter.hasNext() ) { while ( iter.hasNext() ) {
@ -121,13 +92,4 @@ public class DB2UniqueDelegate extends DefaultUniqueDelegate {
} }
return false; return false;
} }
private boolean hasNullable(UniqueKey uniqueKey) {
for ( Column column : uniqueKey.getColumns() ) {
if ( column.isNullable() ) {
return true;
}
}
return false;
}
} }

View File

@ -23,9 +23,6 @@ package org.hibernate.dialect.unique;
import java.util.Iterator; import java.util.Iterator;
import org.hibernate.dialect.Dialect; import org.hibernate.dialect.Dialect;
import org.hibernate.metamodel.relational.Column;
import org.hibernate.metamodel.relational.Table;
import org.hibernate.metamodel.relational.UniqueKey;
/** /**
* The default UniqueDelegate implementation for most dialects. Uses * The default UniqueDelegate implementation for most dialects. Uses
@ -107,53 +104,4 @@ public class DefaultUniqueDelegate implements UniqueDelegate {
return buf.toString(); return buf.toString();
} }
// new model ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@Override
public String getColumnDefinitionUniquenessFragment(Column column) {
return "";
}
@Override
public String getTableCreationUniqueConstraintsFragment(Table table) {
return "";
}
@Override
public String getAlterTableToAddUniqueKeyCommand(UniqueKey uniqueKey) {
// Do this here, rather than allowing UniqueKey/Constraint to do it.
// We need full, simplified control over whether or not it happens.
final String tableName = uniqueKey.getTable().getQualifiedName( dialect );
final String constraintName = dialect.quote( uniqueKey.getName() );
return "alter table " + tableName + " add constraint " + constraintName + uniqueConstraintSql( uniqueKey );
}
protected String uniqueConstraintSql( UniqueKey uniqueKey ) {
final StringBuilder sb = new StringBuilder( " unique (" );
final Iterator columnIterator = uniqueKey.getColumns().iterator();
while ( columnIterator.hasNext() ) {
final org.hibernate.mapping.Column column = (org.hibernate.mapping.Column) columnIterator.next();
sb.append( column.getQuotedName( dialect ) );
if ( columnIterator.hasNext() ) {
sb.append( ", " );
}
}
return sb.append( ')' ).toString();
}
@Override
public String getAlterTableToDropUniqueKeyCommand(UniqueKey uniqueKey) {
// Do this here, rather than allowing UniqueKey/Constraint to do it.
// We need full, simplified control over whether or not it happens.
final String tableName = uniqueKey.getTable().getQualifiedName( dialect );
final String constraintName = dialect.quote( uniqueKey.getName() );
return "alter table " + tableName + " drop constraint " + constraintName;
}
} }

View File

@ -21,7 +21,6 @@
package org.hibernate.dialect.unique; package org.hibernate.dialect.unique;
import org.hibernate.dialect.Dialect; import org.hibernate.dialect.Dialect;
import org.hibernate.metamodel.relational.UniqueKey;
/** /**
* Informix requires the constraint name to come last on the alter table. * Informix requires the constraint name to come last on the alter table.
@ -48,15 +47,4 @@ public class InformixUniqueDelegate extends DefaultUniqueDelegate {
return "alter table " + tableName + " add constraint " + uniqueConstraintSql( uniqueKey ) + " constraint " + constraintName; return "alter table " + tableName + " add constraint " + uniqueConstraintSql( uniqueKey ) + " constraint " + constraintName;
} }
// new model ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@Override
public String getAlterTableToAddUniqueKeyCommand(UniqueKey uniqueKey) {
// Do this here, rather than allowing UniqueKey/Constraint to do it.
// We need full, simplified control over whether or not it happens.
final String tableName = uniqueKey.getTable().getQualifiedName( dialect );
final String constraintName = dialect.quote( uniqueKey.getName() );
return "alter table " + tableName + " add constraint " + uniqueConstraintSql( uniqueKey ) + " constraint " + constraintName;
}
} }

View File

@ -20,10 +20,6 @@
*/ */
package org.hibernate.dialect.unique; package org.hibernate.dialect.unique;
import org.hibernate.metamodel.relational.Column;
import org.hibernate.metamodel.relational.Table;
import org.hibernate.metamodel.relational.UniqueKey;
/** /**
* Dialect-level delegate in charge of applying "uniqueness" to a column. Uniqueness can be defined * Dialect-level delegate in charge of applying "uniqueness" to a column. Uniqueness can be defined
* in 1 of 3 ways:<ol> * in 1 of 3 ways:<ol>
@ -59,18 +55,6 @@ public interface UniqueDelegate {
*/ */
public String getColumnDefinitionUniquenessFragment(org.hibernate.mapping.Column column); public String getColumnDefinitionUniquenessFragment(org.hibernate.mapping.Column column);
/**
* Get the fragment that can be used to make a column unique as part of its column definition.
* <p/>
* This is intended for dialects which do not support unique constraints
*
* @param column The column to which to apply the unique
*
* @return The fragment (usually "unique"), empty string indicates the uniqueness will be indicated using a
* different approach
*/
public String getColumnDefinitionUniquenessFragment(Column column);
/** /**
* Get the fragment that can be used to apply unique constraints as part of table creation. The implementation * Get the fragment that can be used to apply unique constraints as part of table creation. The implementation
* should iterate over the {@link org.hibernate.mapping.UniqueKey} instances for the given table (see * should iterate over the {@link org.hibernate.mapping.UniqueKey} instances for the given table (see
@ -85,21 +69,6 @@ public interface UniqueDelegate {
* comma is important! * comma is important!
*/ */
public String getTableCreationUniqueConstraintsFragment(org.hibernate.mapping.Table table); public String getTableCreationUniqueConstraintsFragment(org.hibernate.mapping.Table table);
/**
* Get the fragment that can be used to apply unique constraints as part of table creation. The implementation
* should iterate over the {@link org.hibernate.mapping.UniqueKey} instances for the given table (see
* {@link org.hibernate.mapping.Table#getUniqueKeyIterator()} and generate the whole fragment for all
* unique keys
* <p/>
* Intended for Dialects which support unique constraint definitions, but just not in separate ALTER statements.
*
* @param table The table for which to generate the unique constraints fragment
*
* @return The fragment, typically in the form {@code ", unique(col1, col2), unique( col20)"}. NOTE: The leading
* comma is important!
*/
public String getTableCreationUniqueConstraintsFragment(Table table);
/** /**
* Get the SQL ALTER TABLE command to be used to create the given UniqueKey. * Get the SQL ALTER TABLE command to be used to create the given UniqueKey.
@ -115,16 +84,6 @@ public interface UniqueDelegate {
String defaultCatalog, String defaultCatalog,
String defaultSchema); String defaultSchema);
/**
* Get the SQL ALTER TABLE command to be used to create the given UniqueKey.
*
* @param uniqueKey The UniqueKey instance. Contains all information about the columns, as well as
* schema/catalog
*
* @return The ALTER TABLE command
*/
public String getAlterTableToAddUniqueKeyCommand(UniqueKey uniqueKey);
/** /**
* Get the SQL ALTER TABLE command to be used to drop the given UniqueKey. * Get the SQL ALTER TABLE command to be used to drop the given UniqueKey.
* *
@ -138,13 +97,4 @@ public interface UniqueDelegate {
org.hibernate.mapping.UniqueKey uniqueKey, org.hibernate.mapping.UniqueKey uniqueKey,
String defaultCatalog, String defaultSchema); String defaultCatalog, String defaultSchema);
/**
* Get the SQL ALTER TABLE command to be used to drop the given UniqueKey.
*
* @param uniqueKey The UniqueKey instance. Contains all information about the columns, as well as
* schema/catalog
*
* @return The ALTER TABLE command
*/
public String getAlterTableToDropUniqueKeyCommand(UniqueKey uniqueKey);
} }

View File

@ -21,7 +21,7 @@
* 51 Franklin Street, Fifth Floor * 51 Franklin Street, Fifth Floor
* Boston, MA 02110-1301 USA * Boston, MA 02110-1301 USA
*/ */
package org.hibernate.metamodel.relational; package org.hibernate.engine.jdbc;
import java.io.Serializable; import java.io.Serializable;

View File

@ -26,7 +26,6 @@ package org.hibernate.engine.query.spi;
import org.hibernate.cfg.Configuration; import org.hibernate.cfg.Configuration;
import org.hibernate.engine.query.internal.NativeQueryInterpreterStandardImpl; import org.hibernate.engine.query.internal.NativeQueryInterpreterStandardImpl;
import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.hibernate.metamodel.source.MetadataImplementor;
import org.hibernate.service.spi.ServiceRegistryImplementor; import org.hibernate.service.spi.ServiceRegistryImplementor;
import org.hibernate.service.spi.SessionFactoryServiceInitiator; import org.hibernate.service.spi.SessionFactoryServiceInitiator;
@ -47,14 +46,6 @@ public class NativeQueryInterpreterInitiator implements SessionFactoryServiceIni
return NativeQueryInterpreterStandardImpl.INSTANCE; return NativeQueryInterpreterStandardImpl.INSTANCE;
} }
@Override
public NativeQueryInterpreter initiateService(
SessionFactoryImplementor sessionFactory,
MetadataImplementor metadata,
ServiceRegistryImplementor registry) {
return NativeQueryInterpreterStandardImpl.INSTANCE;
}
@Override @Override
public Class<NativeQueryInterpreter> getServiceInitiated() { public Class<NativeQueryInterpreter> getServiceInitiated() {
return NativeQueryInterpreter.class; return NativeQueryInterpreter.class;

View File

@ -25,7 +25,6 @@ package org.hibernate.engine.spi;
import org.hibernate.cfg.Configuration; import org.hibernate.cfg.Configuration;
import org.hibernate.internal.CacheImpl; import org.hibernate.internal.CacheImpl;
import org.hibernate.metamodel.source.MetadataImplementor;
import org.hibernate.service.spi.ServiceRegistryImplementor; import org.hibernate.service.spi.ServiceRegistryImplementor;
import org.hibernate.service.spi.SessionFactoryServiceInitiator; import org.hibernate.service.spi.SessionFactoryServiceInitiator;
@ -40,11 +39,6 @@ public class CacheInitiator implements SessionFactoryServiceInitiator<CacheImple
return new CacheImpl( sessionFactory ); return new CacheImpl( sessionFactory );
} }
@Override
public CacheImplementor initiateService(SessionFactoryImplementor sessionFactory, MetadataImplementor metadata, ServiceRegistryImplementor registry) {
return new CacheImpl( sessionFactory );
}
@Override @Override
public Class<CacheImplementor> getServiceInitiated() { public Class<CacheImplementor> getServiceInitiated() {
return CacheImplementor.class; return CacheImplementor.class;

View File

@ -26,7 +26,6 @@ package org.hibernate.event.service.internal;
import org.hibernate.cfg.Configuration; import org.hibernate.cfg.Configuration;
import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.hibernate.event.service.spi.EventListenerRegistry; import org.hibernate.event.service.spi.EventListenerRegistry;
import org.hibernate.metamodel.source.MetadataImplementor;
import org.hibernate.service.spi.ServiceRegistryImplementor; import org.hibernate.service.spi.ServiceRegistryImplementor;
import org.hibernate.service.spi.SessionFactoryServiceInitiator; import org.hibernate.service.spi.SessionFactoryServiceInitiator;
@ -50,12 +49,4 @@ public class EventListenerServiceInitiator implements SessionFactoryServiceIniti
ServiceRegistryImplementor registry) { ServiceRegistryImplementor registry) {
return new EventListenerRegistryImpl(); return new EventListenerRegistryImpl();
} }
@Override
public EventListenerRegistry initiateService(
SessionFactoryImplementor sessionFactory,
MetadataImplementor metadata,
ServiceRegistryImplementor registry) {
return new EventListenerRegistryImpl();
}
} }

View File

@ -25,7 +25,6 @@ package org.hibernate.integrator.spi;
import org.hibernate.cfg.Configuration; import org.hibernate.cfg.Configuration;
import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.hibernate.metamodel.source.MetadataImplementor;
import org.hibernate.service.spi.SessionFactoryServiceRegistry; import org.hibernate.service.spi.SessionFactoryServiceRegistry;
/** /**
@ -60,17 +59,6 @@ public interface Integrator {
SessionFactoryServiceRegistry serviceRegistry); SessionFactoryServiceRegistry serviceRegistry);
/** /**
* Perform integration.
*
* @param metadata The metadata used to create the session factory
* @param sessionFactory The session factory being created
* @param serviceRegistry The session factory's service registry
*/
public void integrate( MetadataImplementor metadata,
SessionFactoryImplementor sessionFactory,
SessionFactoryServiceRegistry serviceRegistry );
/**
* Tongue-in-cheek name for a shutdown callback. * Tongue-in-cheek name for a shutdown callback.
* *
* @param sessionFactory The session factory being closed. * @param sessionFactory The session factory being closed.

View File

@ -130,9 +130,6 @@ import org.hibernate.mapping.PersistentClass;
import org.hibernate.mapping.RootClass; import org.hibernate.mapping.RootClass;
import org.hibernate.metadata.ClassMetadata; import org.hibernate.metadata.ClassMetadata;
import org.hibernate.metadata.CollectionMetadata; import org.hibernate.metadata.CollectionMetadata;
import org.hibernate.metamodel.binding.EntityBinding;
import org.hibernate.metamodel.binding.PluralAttributeBinding;
import org.hibernate.metamodel.source.MetadataImplementor;
import org.hibernate.persister.collection.CollectionPersister; import org.hibernate.persister.collection.CollectionPersister;
import org.hibernate.persister.entity.EntityPersister; import org.hibernate.persister.entity.EntityPersister;
import org.hibernate.persister.entity.Loadable; import org.hibernate.persister.entity.Loadable;
@ -674,320 +671,6 @@ public final class SessionFactoryImpl
} }
@SuppressWarnings( {"ThrowableResultOfMethodCallIgnored"})
public SessionFactoryImpl(
MetadataImplementor metadata,
SessionFactoryOptions sessionFactoryOptions,
SessionFactoryObserver observer) throws HibernateException {
final boolean traceEnabled = LOG.isTraceEnabled();
final boolean debugEnabled = traceEnabled || LOG.isDebugEnabled();
if ( debugEnabled ) {
LOG.debug( "Building session factory" );
}
this.sessionFactoryOptions = sessionFactoryOptions;
this.properties = createPropertiesFromMap(
metadata.getServiceRegistry().getService( ConfigurationService.class ).getSettings()
);
// TODO: these should be moved into SessionFactoryOptions
this.settings = new SettingsFactory().buildSettings(
properties,
metadata.getServiceRegistry()
);
this.serviceRegistry =
sessionFactoryOptions.getServiceRegistry()
.getService( SessionFactoryServiceRegistryFactory.class )
.buildServiceRegistry( this, metadata );
this.jdbcServices = this.serviceRegistry.getService( JdbcServices.class );
this.dialect = this.jdbcServices.getDialect();
this.cacheAccess = this.serviceRegistry.getService( CacheImplementor.class );
// TODO: get SQL functions from JdbcServices (HHH-6559)
//this.sqlFunctionRegistry = new SQLFunctionRegistry( this.jdbcServices.getSqlFunctions() );
this.sqlFunctionRegistry = new SQLFunctionRegistry( this.dialect, new HashMap<String, SQLFunction>() );
// TODO: get SQL functions from a new service
// this.sqlFunctionRegistry = new SQLFunctionRegistry( getDialect(), cfg.getSqlFunctions() );
if ( observer != null ) {
this.observer.addObserver( observer );
}
this.typeResolver = metadata.getTypeResolver().scope( this );
this.typeHelper = new TypeLocatorImpl( typeResolver );
this.filters = new HashMap<String, FilterDefinition>();
for ( FilterDefinition filterDefinition : metadata.getFilterDefinitions() ) {
filters.put( filterDefinition.getFilterName(), filterDefinition );
}
if ( debugEnabled ) {
LOG.debugf( "Session factory constructed with filter configurations : %s", filters );
LOG.debugf( "Instantiating session factory with properties: %s", properties );
}
this.queryPlanCache = new QueryPlanCache( this );
class IntegratorObserver implements SessionFactoryObserver {
private ArrayList<Integrator> integrators = new ArrayList<Integrator>();
@Override
public void sessionFactoryCreated(SessionFactory factory) {
}
@Override
public void sessionFactoryClosed(SessionFactory factory) {
for ( Integrator integrator : integrators ) {
integrator.disintegrate( SessionFactoryImpl.this, SessionFactoryImpl.this.serviceRegistry );
}
integrators.clear();
}
}
final IntegratorObserver integratorObserver = new IntegratorObserver();
this.observer.addObserver(integratorObserver);
for (Integrator integrator : serviceRegistry.getService(IntegratorService.class).getIntegrators()) {
integrator.integrate(metadata, this, this.serviceRegistry);
integratorObserver.integrators.add(integrator);
}
//Generators:
identifierGenerators = new HashMap<String,IdentifierGenerator>();
for ( EntityBinding entityBinding : metadata.getEntityBindings() ) {
if ( entityBinding.isRoot() ) {
identifierGenerators.put(
entityBinding.getEntity().getName(),
entityBinding.getHierarchyDetails().getEntityIdentifier().getIdentifierGenerator()
);
}
}
///////////////////////////////////////////////////////////////////////
// Prepare persisters and link them up with their cache
// region/access-strategy
StringBuilder stringBuilder = new StringBuilder();
if ( settings.getCacheRegionPrefix() != null) {
stringBuilder
.append( settings.getCacheRegionPrefix() )
.append( '.' );
}
final String cacheRegionPrefix = stringBuilder.toString();
entityPersisters = new HashMap<String,EntityPersister>();
Map<String, RegionAccessStrategy> entityAccessStrategies = new HashMap<String, RegionAccessStrategy>();
Map<String,ClassMetadata> classMeta = new HashMap<String,ClassMetadata>();
for ( EntityBinding model : metadata.getEntityBindings() ) {
// TODO: should temp table prep happen when metadata is being built?
//model.prepareTemporaryTables( metadata, getDialect() );
// cache region is defined by the root-class in the hierarchy...
EntityBinding rootEntityBinding = metadata.getRootEntityBinding( model.getEntity().getName() );
EntityRegionAccessStrategy accessStrategy = null;
if ( settings.isSecondLevelCacheEnabled() &&
rootEntityBinding.getHierarchyDetails().getCaching() != null &&
model.getHierarchyDetails().getCaching() != null &&
model.getHierarchyDetails().getCaching().getAccessType() != null ) {
final String cacheRegionName = cacheRegionPrefix + rootEntityBinding.getHierarchyDetails().getCaching().getRegion();
accessStrategy = EntityRegionAccessStrategy.class.cast( entityAccessStrategies.get( cacheRegionName ) );
if ( accessStrategy == null ) {
final AccessType accessType = model.getHierarchyDetails().getCaching().getAccessType();
if ( traceEnabled ) {
LOG.tracev( "Building cache for entity data [{0}]", model.getEntity().getName() );
}
EntityRegion entityRegion = settings.getRegionFactory().buildEntityRegion(
cacheRegionName, properties, CacheDataDescriptionImpl.decode( model )
);
accessStrategy = entityRegion.buildAccessStrategy( accessType );
entityAccessStrategies.put( cacheRegionName, accessStrategy );
cacheAccess.addCacheRegion( cacheRegionName, entityRegion );
}
}
EntityPersister cp = serviceRegistry.getService( PersisterFactory.class ).createEntityPersister(
model, accessStrategy, this, metadata
);
entityPersisters.put( model.getEntity().getName(), cp );
classMeta.put( model.getEntity().getName(), cp.getClassMetadata() );
}
this.classMetadata = Collections.unmodifiableMap(classMeta);
Map<String,Set<String>> tmpEntityToCollectionRoleMap = new HashMap<String,Set<String>>();
collectionPersisters = new HashMap<String,CollectionPersister>();
Map<String, CollectionMetadata> tmpCollectionMetadata = new HashMap<String, CollectionMetadata>();
for ( PluralAttributeBinding model : metadata.getCollectionBindings() ) {
if ( model.getAttribute() == null ) {
throw new IllegalStateException( "No attribute defined for a AbstractPluralAttributeBinding: " + model );
}
if ( model.getAttribute().isSingular() ) {
throw new IllegalStateException(
"AbstractPluralAttributeBinding has a Singular attribute defined: " + model.getAttribute().getName()
);
}
final String cacheRegionName = cacheRegionPrefix + model.getCaching().getRegion();
final AccessType accessType = model.getCaching().getAccessType();
CollectionRegionAccessStrategy accessStrategy = null;
if ( accessType != null && settings.isSecondLevelCacheEnabled() ) {
if ( traceEnabled ) {
LOG.tracev( "Building cache for collection data [{0}]", model.getAttribute().getRole() );
}
CollectionRegion collectionRegion = settings.getRegionFactory().buildCollectionRegion(
cacheRegionName, properties, CacheDataDescriptionImpl.decode( model )
);
accessStrategy = collectionRegion.buildAccessStrategy( accessType );
entityAccessStrategies.put( cacheRegionName, accessStrategy );
cacheAccess.addCacheRegion( cacheRegionName, collectionRegion );
}
CollectionPersister persister = serviceRegistry
.getService( PersisterFactory.class )
.createCollectionPersister( metadata, model, accessStrategy, this );
collectionPersisters.put( model.getAttribute().getRole(), persister );
tmpCollectionMetadata.put( model.getAttribute().getRole(), persister.getCollectionMetadata() );
Type indexType = persister.getIndexType();
if ( indexType != null && indexType.isAssociationType() && !indexType.isAnyType() ) {
String entityName = ( ( AssociationType ) indexType ).getAssociatedEntityName( this );
Set<String> roles = tmpEntityToCollectionRoleMap.get( entityName );
if ( roles == null ) {
roles = new HashSet<String>();
tmpEntityToCollectionRoleMap.put( entityName, roles );
}
roles.add( persister.getRole() );
}
Type elementType = persister.getElementType();
if ( elementType.isAssociationType() && !elementType.isAnyType() ) {
String entityName = ( ( AssociationType ) elementType ).getAssociatedEntityName( this );
Set<String> roles = tmpEntityToCollectionRoleMap.get( entityName );
if ( roles == null ) {
roles = new HashSet<String>();
tmpEntityToCollectionRoleMap.put( entityName, roles );
}
roles.add( persister.getRole() );
}
}
collectionMetadata = Collections.unmodifiableMap( tmpCollectionMetadata );
for ( Map.Entry<String, Set<String>> entry : tmpEntityToCollectionRoleMap.entrySet() ) {
entry.setValue( Collections.unmodifiableSet( entry.getValue() ) );
}
collectionRolesByEntityParticipant = Collections.unmodifiableMap( tmpEntityToCollectionRoleMap );
//Named Queries:
namedQueryRepository = new NamedQueryRepository(
metadata.getNamedQueryDefinitions(),
metadata.getNamedNativeQueryDefinitions(),
metadata.getResultSetMappingDefinitions(),
new HashMap<String, ProcedureCallMemento>( )
);
imports = new HashMap<String,String>();
for ( Map.Entry<String,String> importEntry : metadata.getImports() ) {
imports.put( importEntry.getKey(), importEntry.getValue() );
}
// after *all* persisters and named queries are registered
Iterator iter = entityPersisters.values().iterator();
while ( iter.hasNext() ) {
final EntityPersister persister = ( ( EntityPersister ) iter.next() );
persister.postInstantiate();
registerEntityNameResolvers( persister );
}
iter = collectionPersisters.values().iterator();
while ( iter.hasNext() ) {
final CollectionPersister persister = ( ( CollectionPersister ) iter.next() );
persister.postInstantiate();
}
//JNDI + Serialization:
name = settings.getSessionFactoryName();
try {
uuid = (String) UUID_GENERATOR.generate(null, null);
}
catch (Exception e) {
throw new AssertionFailure("Could not generate UUID");
}
SessionFactoryRegistry.INSTANCE.addSessionFactory(
uuid,
name,
settings.isSessionFactoryNameAlsoJndiName(),
this,
serviceRegistry.getService( JndiService.class )
);
if ( debugEnabled ) {
LOG.debug("Instantiated session factory");
}
if ( settings.isAutoCreateSchema() ) {
new SchemaExport( metadata )
.setImportSqlCommandExtractor( serviceRegistry.getService( ImportSqlCommandExtractor.class ) )
.create( false, true );
}
if ( settings.isAutoDropSchema() ) {
schemaExport = new SchemaExport( metadata )
.setImportSqlCommandExtractor( serviceRegistry.getService( ImportSqlCommandExtractor.class ) );
}
currentSessionContext = buildCurrentSessionContext();
//checking for named queries
if ( settings.isNamedQueryStartupCheckingEnabled() ) {
final Map<String,HibernateException> errors = checkNamedQueries();
if ( ! errors.isEmpty() ) {
StringBuilder failingQueries = new StringBuilder( "Errors in named queries: " );
String sep = "";
for ( Map.Entry<String,HibernateException> entry : errors.entrySet() ) {
LOG.namedQueryError( entry.getKey(), entry.getValue() );
failingQueries.append( entry.getKey() ).append( sep );
sep = ", ";
}
throw new HibernateException( failingQueries.toString() );
}
}
// this needs to happen after persisters are all ready to go...
this.fetchProfiles = new HashMap<String,FetchProfile>();
for ( org.hibernate.metamodel.binding.FetchProfile mappingProfile : metadata.getFetchProfiles() ) {
final FetchProfile fetchProfile = new FetchProfile( mappingProfile.getName() );
for ( org.hibernate.metamodel.binding.FetchProfile.Fetch mappingFetch : mappingProfile.getFetches() ) {
// resolve the persister owning the fetch
final String entityName = getImportedClassName( mappingFetch.getEntity() );
final EntityPersister owner = entityName == null ? null : entityPersisters.get( entityName );
if ( owner == null ) {
throw new HibernateException(
"Unable to resolve entity reference [" + mappingFetch.getEntity()
+ "] in fetch profile [" + fetchProfile.getName() + "]"
);
}
// validate the specified association fetch
Type associationType = owner.getPropertyType( mappingFetch.getAssociation() );
if ( associationType == null || ! associationType.isAssociationType() ) {
throw new HibernateException( "Fetch profile [" + fetchProfile.getName() + "] specified an invalid association" );
}
// resolve the style
final Fetch.Style fetchStyle = Fetch.Style.parse( mappingFetch.getStyle() );
// then construct the fetch instance...
fetchProfile.addFetch( new Association( owner, mappingFetch.getAssociation() ), fetchStyle );
( ( Loadable ) owner ).registerAffectingFetchProfile( fetchProfile.getName() );
}
fetchProfiles.put( fetchProfile.getName(), fetchProfile );
}
this.customEntityDirtinessStrategy = determineCustomEntityDirtinessStrategy();
this.currentTenantIdentifierResolver = determineCurrentTenantIdentifierResolver( null );
this.transactionEnvironment = new TransactionEnvironmentImpl( this );
this.observer.sessionFactoryCreated( this );
}
@SuppressWarnings( {"unchecked"} ) @SuppressWarnings( {"unchecked"} )
private static Properties createPropertiesFromMap(Map map) { private static Properties createPropertiesFromMap(Map map) {
Properties properties = new Properties(); Properties properties = new Properties();

View File

@ -22,7 +22,7 @@
* Boston, MA 02110-1301 USA * Boston, MA 02110-1301 USA
*/ */
package org.hibernate.metamodel.source; package org.hibernate.internal.util.xml;
import org.hibernate.HibernateException; import org.hibernate.HibernateException;

View File

@ -1,100 +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;
import java.util.Map;
import javax.persistence.SharedCacheMode;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.cache.spi.access.AccessType;
import org.hibernate.cfg.NamingStrategy;
import org.hibernate.engine.ResultSetMappingDefinition;
import org.hibernate.engine.spi.FilterDefinition;
import org.hibernate.engine.spi.NamedQueryDefinition;
import org.hibernate.engine.spi.NamedSQLQueryDefinition;
import org.hibernate.metamodel.binding.EntityBinding;
import org.hibernate.metamodel.binding.FetchProfile;
import org.hibernate.metamodel.binding.IdGenerator;
import org.hibernate.metamodel.binding.PluralAttributeBinding;
import org.hibernate.metamodel.binding.TypeDef;
/**
* @author Steve Ebersole
*/
public interface Metadata {
/**
* Exposes the options used to produce a {@link Metadata} instance.
*/
public static interface Options {
public StandardServiceRegistry getServiceRegistry();
public MetadataSourceProcessingOrder getMetadataSourceProcessingOrder();
public NamingStrategy getNamingStrategy();
public SharedCacheMode getSharedCacheMode();
public AccessType getDefaultAccessType();
public boolean useNewIdentifierGenerators();
public boolean isGloballyQuotedIdentifiers();
public String getDefaultSchemaName();
public String getDefaultCatalogName();
}
public Options getOptions();
public SessionFactoryBuilder getSessionFactoryBuilder();
public SessionFactory buildSessionFactory();
public Iterable<EntityBinding> getEntityBindings();
public EntityBinding getEntityBinding(String entityName);
/**
* Get the "root" entity binding
* @param entityName
* @return the "root entity binding; simply returns entityBinding if it is the root entity binding
*/
public EntityBinding getRootEntityBinding(String entityName);
public Iterable<PluralAttributeBinding> getCollectionBindings();
public TypeDef getTypeDefinition(String name);
public Iterable<TypeDef> getTypeDefinitions();
public Iterable<FilterDefinition> getFilterDefinitions();
public Iterable<NamedQueryDefinition> getNamedQueryDefinitions();
public Iterable<NamedSQLQueryDefinition> getNamedNativeQueryDefinitions();
public Iterable<ResultSetMappingDefinition> getResultSetMappingDefinitions();
public Iterable<Map.Entry<String, String>> getImports();
public Iterable<FetchProfile> getFetchProfiles();
public IdGenerator getIdGenerator(String name);
}

View File

@ -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;
import javax.persistence.SharedCacheMode;
import org.hibernate.cache.spi.access.AccessType;
import org.hibernate.cfg.NamingStrategy;
/**
* @author Steve Ebersole
* @author Hardy Ferentschik
*/
public interface MetadataBuilder {
public MetadataBuilder with(NamingStrategy namingStrategy);
public MetadataBuilder with(MetadataSourceProcessingOrder metadataSourceProcessingOrder);
public MetadataBuilder with(SharedCacheMode cacheMode);
public MetadataBuilder with(AccessType accessType);
public MetadataBuilder withNewIdentifierGeneratorsEnabled(boolean enabled);
public Metadata build();
}

View File

@ -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
}

View File

@ -1,425 +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;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.jar.JarFile;
import java.util.zip.ZipEntry;
import org.hibernate.boot.registry.BootstrapServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.classloading.spi.ClassLoaderService;
import org.hibernate.cfg.EJB3DTDEntityResolver;
import org.hibernate.cfg.EJB3NamingStrategy;
import org.hibernate.cfg.NamingStrategy;
import org.hibernate.internal.jaxb.JaxbRoot;
import org.hibernate.internal.jaxb.Origin;
import org.hibernate.internal.jaxb.SourceType;
import org.hibernate.metamodel.source.MappingException;
import org.hibernate.metamodel.source.MappingNotFoundException;
import org.hibernate.metamodel.source.internal.JaxbHelper;
import org.hibernate.metamodel.source.internal.MetadataBuilderImpl;
import org.hibernate.service.ServiceRegistry;
import org.jboss.logging.Logger;
import org.w3c.dom.Document;
import org.xml.sax.EntityResolver;
/**
* @author Steve Ebersole
*/
public class MetadataSources {
private static final Logger LOG = Logger.getLogger( MetadataSources.class );
private final ServiceRegistry serviceRegistry;
private List<JaxbRoot> jaxbRootList = new ArrayList<JaxbRoot>();
private LinkedHashSet<Class<?>> annotatedClasses = new LinkedHashSet<Class<?>>();
private LinkedHashSet<String> annotatedPackages = new LinkedHashSet<String>();
private final JaxbHelper jaxbHelper;
private final EntityResolver entityResolver;
private final NamingStrategy namingStrategy;
private final MetadataBuilderImpl metadataBuilder;
public MetadataSources(ServiceRegistry serviceRegistry) {
this( serviceRegistry, EJB3DTDEntityResolver.INSTANCE, EJB3NamingStrategy.INSTANCE );
}
public MetadataSources(ServiceRegistry serviceRegistry, EntityResolver entityResolver, NamingStrategy namingStrategy) {
this.serviceRegistry = serviceRegistry;
this.entityResolver = entityResolver;
this.namingStrategy = namingStrategy;
this.jaxbHelper = new JaxbHelper( this );
this.metadataBuilder = new MetadataBuilderImpl( this );
// service registry really should be either BootstrapServiceRegistry or StandardServiceRegistry type...
if ( ! isExpectedServiceRegistryType( serviceRegistry ) ) {
LOG.debugf(
"Unexpected ServiceRegistry type [%s] encountered during building of MetadataSources; may cause " +
"problems later attempting to construct MetadataBuilder",
serviceRegistry.getClass().getName()
);
}
}
protected static boolean isExpectedServiceRegistryType(ServiceRegistry serviceRegistry) {
return BootstrapServiceRegistry.class.isInstance( serviceRegistry )
|| StandardServiceRegistry.class.isInstance( serviceRegistry );
}
public List<JaxbRoot> getJaxbRootList() {
return jaxbRootList;
}
public Iterable<String> getAnnotatedPackages() {
return annotatedPackages;
}
public Iterable<Class<?>> getAnnotatedClasses() {
return annotatedClasses;
}
public ServiceRegistry getServiceRegistry() {
return serviceRegistry;
}
public NamingStrategy getNamingStrategy() {
return namingStrategy;
}
/**
* Get a builder for metadata where non-default options can be specified.
*
* @return The built metadata.
*/
public MetadataBuilder getMetadataBuilder() {
return new MetadataBuilderImpl( this );
}
/**
* Get a builder for metadata where non-default options can be specified.
*
* @return The built metadata.
*/
public MetadataBuilder getMetadataBuilder(StandardServiceRegistry serviceRegistry) {
return new MetadataBuilderImpl( this, serviceRegistry );
}
/**
* Short-hand form of calling {@link #getMetadataBuilder()} and using its
* {@link org.hibernate.metamodel.MetadataBuilder#build()} method in cases where the application wants
* to accept the defaults.
*
* @return The built metadata.
*/
public Metadata buildMetadata() {
return getMetadataBuilder().build();
}
public Metadata buildMetadata(StandardServiceRegistry serviceRegistry) {
return getMetadataBuilder( serviceRegistry ).build();
}
/**
* Read metadata from the annotations attached to the given class.
*
* @param annotatedClass The class containing annotations
*
* @return this (for method chaining)
*/
public MetadataSources addAnnotatedClass(Class annotatedClass) {
annotatedClasses.add( annotatedClass );
return this;
}
/**
* Read package-level metadata.
*
* @param packageName java package name without trailing '.', cannot be {@code null}
*
* @return this (for method chaining)
*/
public MetadataSources addPackage(String packageName) {
if ( packageName == null ) {
throw new IllegalArgumentException( "The specified package name cannot be null" );
}
if ( packageName.endsWith( "." ) ) {
packageName = packageName.substring( 0, packageName.length() - 1 );
}
annotatedPackages.add( packageName );
return this;
}
/**
* Read mappings as a application resourceName (i.e. classpath lookup).
*
* @param name The resource name
*
* @return this (for method chaining purposes)
*/
public MetadataSources addResource(String name) {
LOG.tracef( "reading mappings from resource : %s", name );
final Origin origin = new Origin( SourceType.RESOURCE, name );
InputStream resourceInputStream = classLoaderService().locateResourceStream( name );
if ( resourceInputStream == null ) {
throw new MappingNotFoundException( origin );
}
add( resourceInputStream, origin, true );
return this;
}
private ClassLoaderService classLoaderService() {
return serviceRegistry.getService( ClassLoaderService.class );
}
private JaxbRoot add(InputStream inputStream, Origin origin, boolean close) {
try {
JaxbRoot jaxbRoot = jaxbHelper.unmarshal( inputStream, origin );
jaxbRootList.add( jaxbRoot );
return jaxbRoot;
}
finally {
if ( close ) {
try {
inputStream.close();
}
catch ( IOException ignore ) {
LOG.trace( "Was unable to close input stream" );
}
}
}
}
/**
* Read a mapping as an application resource using the convention that a class named {@code foo.bar.Foo} is
* mapped by a file named {@code foo/bar/Foo.hbm.xml} which can be resolved as a classpath resource.
*
* @param entityClass The mapped class. Cannot be {@code null} null.
*
* @return this (for method chaining purposes)
*/
public MetadataSources addClass(Class entityClass) {
if ( entityClass == null ) {
throw new IllegalArgumentException( "The specified class cannot be null" );
}
LOG.debugf( "adding resource mappings from class convention : %s", entityClass.getName() );
final String mappingResourceName = entityClass.getName().replace( '.', '/' ) + ".hbm.xml";
addResource( mappingResourceName );
return this;
}
/**
* Read mappings from a particular XML file
*
* @param path The path to a file. Expected to be resolvable by {@link File#File(String)}
*
* @return this (for method chaining purposes)
*
* @see #addFile(java.io.File)
*/
public MetadataSources addFile(String path) {
return addFile( new File( path ) );
}
/**
* Read mappings from a particular XML file
*
* @param file The reference to the XML file
*
* @return this (for method chaining purposes)
*/
public MetadataSources addFile(File file) {
final String name = file.getAbsolutePath();
LOG.tracef( "reading mappings from file : %s", name );
final Origin origin = new Origin( SourceType.FILE, name );
try {
add( new FileInputStream( file ), origin, true );
}
catch ( FileNotFoundException e ) {
throw new MappingNotFoundException( e, origin );
}
return this;
}
/**
* See {@link #addCacheableFile(java.io.File)} for description
*
* @param path The path to a file. Expected to be resolvable by {@link File#File(String)}
*
* @return this (for method chaining purposes)
*
* @see #addCacheableFile(java.io.File)
*/
public MetadataSources addCacheableFile(String path) {
return this; // todo : implement method body
}
/**
* Add a cached mapping file. A cached file is a serialized representation of the DOM structure of a
* particular mapping. It is saved from a previous call as a file with the name {@code {xmlFile}.bin}
* where {@code {xmlFile}} is the name of the original mapping file.
* </p>
* If a cached {@code {xmlFile}.bin} exists and is newer than {@code {xmlFile}}, the {@code {xmlFile}.bin}
* file will be read directly. Otherwise {@code {xmlFile}} is read and then serialized to {@code {xmlFile}.bin} for
* use the next time.
*
* @param file The cacheable mapping file to be added, {@code {xmlFile}} in above discussion.
*
* @return this (for method chaining purposes)
*/
public MetadataSources addCacheableFile(File file) {
return this; // todo : implement method body
}
/**
* Read metadata from an {@link InputStream}.
*
* @param xmlInputStream The input stream containing a DOM.
*
* @return this (for method chaining purposes)
*/
public MetadataSources addInputStream(InputStream xmlInputStream) {
add( xmlInputStream, new Origin( SourceType.INPUT_STREAM, "<unknown>" ), false );
return this;
}
/**
* Read mappings from a {@link URL}
*
* @param url The url for the mapping document to be read.
*
* @return this (for method chaining purposes)
*/
public MetadataSources addURL(URL url) {
final String urlExternalForm = url.toExternalForm();
LOG.debugf( "Reading mapping document from URL : %s", urlExternalForm );
final Origin origin = new Origin( SourceType.URL, urlExternalForm );
try {
add( url.openStream(), origin, true );
}
catch ( IOException e ) {
throw new MappingNotFoundException( "Unable to open url stream [" + urlExternalForm + "]", e, origin );
}
return this;
}
/**
* Read mappings from a DOM {@link Document}
*
* @param document The DOM document
*
* @return this (for method chaining purposes)
*/
public MetadataSources addDocument(Document document) {
final Origin origin = new Origin( SourceType.DOM, "<unknown>" );
JaxbRoot jaxbRoot = jaxbHelper.unmarshal( document, origin );
jaxbRootList.add( jaxbRoot );
return this;
}
/**
* Read all mappings from a jar file.
* <p/>
* Assumes that any file named <tt>*.hbm.xml</tt> is a mapping document.
*
* @param jar a jar file
*
* @return this (for method chaining purposes)
*/
public MetadataSources addJar(File jar) {
LOG.debugf( "Seeking mapping documents in jar file : %s", jar.getName() );
final Origin origin = new Origin( SourceType.JAR, jar.getAbsolutePath() );
try {
JarFile jarFile = new JarFile( jar );
try {
Enumeration jarEntries = jarFile.entries();
while ( jarEntries.hasMoreElements() ) {
final ZipEntry zipEntry = (ZipEntry) jarEntries.nextElement();
if ( zipEntry.getName().endsWith( ".hbm.xml" ) ) {
LOG.tracef( "found mapping document : %s", zipEntry.getName() );
try {
add( jarFile.getInputStream( zipEntry ), origin, true );
}
catch ( Exception e ) {
throw new MappingException( "could not read mapping documents", e, origin );
}
}
}
}
finally {
try {
jarFile.close();
}
catch ( Exception ignore ) {
}
}
}
catch ( IOException e ) {
throw new MappingNotFoundException( e, origin );
}
return this;
}
/**
* Read all mapping documents from a directory tree.
* <p/>
* Assumes that any file named <tt>*.hbm.xml</tt> is a mapping document.
*
* @param dir The directory
*
* @return this (for method chaining purposes)
*
* @throws org.hibernate.MappingException Indicates problems reading the jar file or
* processing the contained mapping documents.
*/
public MetadataSources addDirectory(File dir) {
File[] files = dir.listFiles();
for ( File file : files ) {
if ( file.isDirectory() ) {
addDirectory( file );
}
else if ( file.getName().endsWith( ".hbm.xml" ) ) {
addFile( file );
}
}
return this;
}
}

View File

@ -1,44 +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;
import org.hibernate.Interceptor;
import org.hibernate.SessionFactory;
import org.hibernate.proxy.EntityNotFoundDelegate;
/**
* @author Gail Badner
*/
public interface SessionFactoryBuilder {
public SessionFactoryBuilder with(Interceptor interceptor);
public SessionFactoryBuilder with(EntityNotFoundDelegate entityNotFoundDelegate);
/**
* After all options have been set, build the SessionFactory.
*
* @return The built SessionFactory.
*/
public SessionFactory build();
}

View File

@ -1,41 +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;
import org.hibernate.HibernateException;
/**
* Indicates a problem validating the metamodel.
*
* @author Steve Ebersole
*/
public class ValidationException extends HibernateException {
public ValidationException(String s) {
super( s );
}
public ValidationException(String string, Throwable root) {
super( string, root );
}
}

View File

@ -1,138 +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.binding;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import org.hibernate.metamodel.domain.Attribute;
import org.hibernate.metamodel.source.MetaAttributeContext;
/**
* Basic support for {@link AttributeBinding} implementors
*
* @author Steve Ebersole
*/
public abstract class AbstractAttributeBinding implements AttributeBinding {
private final AttributeBindingContainer container;
private final Attribute attribute;
private final HibernateTypeDescriptor hibernateTypeDescriptor = new HibernateTypeDescriptor();
private final Set<SingularAssociationAttributeBinding> entityReferencingAttributeBindings = new HashSet<SingularAssociationAttributeBinding>();
private boolean includedInOptimisticLocking;
private boolean isLazy;
private String propertyAccessorName;
private boolean isAlternateUniqueKey;
private MetaAttributeContext metaAttributeContext;
protected AbstractAttributeBinding(AttributeBindingContainer container, Attribute attribute) {
this.container = container;
this.attribute = attribute;
}
@Override
public AttributeBindingContainer getContainer() {
return container;
}
@Override
public Attribute getAttribute() {
return attribute;
}
@Override
public HibernateTypeDescriptor getHibernateTypeDescriptor() {
return hibernateTypeDescriptor;
}
@Override
public boolean isBasicPropertyAccessor() {
return propertyAccessorName == null || "property".equals( propertyAccessorName );
}
@Override
public String getPropertyAccessorName() {
return propertyAccessorName;
}
public void setPropertyAccessorName(String propertyAccessorName) {
this.propertyAccessorName = propertyAccessorName;
}
@Override
public boolean isIncludedInOptimisticLocking() {
return includedInOptimisticLocking;
}
public void setIncludedInOptimisticLocking(boolean includedInOptimisticLocking) {
this.includedInOptimisticLocking = includedInOptimisticLocking;
}
@Override
public MetaAttributeContext getMetaAttributeContext() {
return metaAttributeContext;
}
public void setMetaAttributeContext(MetaAttributeContext metaAttributeContext) {
this.metaAttributeContext = metaAttributeContext;
}
@Override
public boolean isAlternateUniqueKey() {
return isAlternateUniqueKey;
}
public void setAlternateUniqueKey(boolean alternateUniqueKey) {
this.isAlternateUniqueKey = alternateUniqueKey;
}
@Override
public boolean isLazy() {
return isLazy;
}
public void setLazy(boolean isLazy) {
this.isLazy = isLazy;
}
public void addEntityReferencingAttributeBinding(SingularAssociationAttributeBinding referencingAttributeBinding) {
entityReferencingAttributeBindings.add( referencingAttributeBinding );
}
public Set<SingularAssociationAttributeBinding> getEntityReferencingAttributeBindings() {
return Collections.unmodifiableSet( entityReferencingAttributeBindings );
}
public void validate() {
if ( !entityReferencingAttributeBindings.isEmpty() ) {
// TODO; validate that this AttributeBinding can be a target of an entity reference
// (e.g., this attribute is the primary key or there is a unique-key)
// can a unique attribute be used as a target? if so, does it need to be non-null?
}
}
}

View File

@ -1,51 +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.binding;
import org.hibernate.metamodel.relational.Value;
/**
* Basic contract describing the commonality between the various types of collection element mappings.
*
* @author Steve Ebersole
*/
public abstract class AbstractCollectionElement {
private final AbstractPluralAttributeBinding collectionBinding;
private Value elementValue;
AbstractCollectionElement(AbstractPluralAttributeBinding collectionBinding) {
this.collectionBinding = collectionBinding;
}
public abstract CollectionElementNature getCollectionElementNature();
public AbstractPluralAttributeBinding getCollectionBinding() {
return collectionBinding;
}
public Value getElementValue() {
return elementValue;
}
}

View File

@ -1,394 +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.binding;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import org.hibernate.AssertionFailure;
import org.hibernate.FetchMode;
import org.hibernate.engine.FetchStyle;
import org.hibernate.engine.FetchTiming;
import org.hibernate.engine.spi.CascadeStyle;
import org.hibernate.engine.spi.CascadeStyles;
import org.hibernate.metamodel.domain.PluralAttribute;
import org.hibernate.metamodel.relational.Table;
import org.hibernate.metamodel.relational.TableSpecification;
import org.hibernate.persister.collection.CollectionPersister;
/**
* TODO : javadoc
*
* @author Steve Ebersole
*/
public abstract class AbstractPluralAttributeBinding extends AbstractAttributeBinding implements PluralAttributeBinding {
private final CollectionKey collectionKey;
private final AbstractCollectionElement collectionElement;
private Table collectionTable;
private FetchTiming fetchTiming;
private FetchStyle fetchStyle;
private int batchSize = -1;
private CascadeStyle cascadeStyle;
private boolean orphanDelete;
private Caching caching;
private boolean inverse;
private boolean mutable = true;
private Class<? extends CollectionPersister> collectionPersisterClass;
private String where;
private String orderBy;
private boolean sorted;
private Comparator comparator;
private String comparatorClassName;
private String customLoaderName;
private CustomSQL customSqlInsert;
private CustomSQL customSqlUpdate;
private CustomSQL customSqlDelete;
private CustomSQL customSqlDeleteAll;
private String referencedPropertyName;
private final java.util.Map filters = new HashMap();
private final java.util.Set<String> synchronizedTables = new HashSet<String>();
protected AbstractPluralAttributeBinding(
AttributeBindingContainer container,
PluralAttribute attribute,
CollectionElementNature collectionElementNature) {
super( container, attribute );
this.collectionKey = new CollectionKey( this );
this.collectionElement = interpretNature( collectionElementNature );
}
private AbstractCollectionElement interpretNature(CollectionElementNature collectionElementNature) {
switch ( collectionElementNature ) {
case BASIC: {
return new BasicCollectionElement( this );
}
case COMPOSITE: {
return new CompositeCollectionElement( this );
}
case ONE_TO_MANY: {
return new OneToManyCollectionElement( this );
}
case MANY_TO_MANY: {
return new ManyToManyCollectionElement( this );
}
case MANY_TO_ANY: {
return new ManyToAnyCollectionElement( this );
}
default: {
throw new AssertionFailure( "Unknown collection element nature : " + collectionElementNature );
}
}
}
// protected void initializeBinding(PluralAttributeBindingState state) {
// super.initialize( state );
// fetchMode = state.getFetchMode();
// extraLazy = state.isExtraLazy();
// collectionElement.setNodeName( state.getElementNodeName() );
// collectionElement.setTypeName( state.getElementTypeName() );
// inverse = state.isInverse();
// mutable = state.isMutable();
// subselectLoadable = state.isSubselectLoadable();
// if ( isSubselectLoadable() ) {
// getEntityBinding().setSubselectLoadableCollections( true );
// }
// cacheConcurrencyStrategy = state.getCacheConcurrencyStrategy();
// cacheRegionName = state.getCacheRegionName();
// orderBy = state.getOrderBy();
// where = state.getWhere();
// referencedPropertyName = state.getReferencedPropertyName();
// sorted = state.isSorted();
// comparator = state.getComparator();
// comparatorClassName = state.getComparatorClassName();
// orphanDelete = state.isOrphanDelete();
// batchSize = state.getBatchSize();
// embedded = state.isEmbedded();
// optimisticLocked = state.isOptimisticLocked();
// collectionPersisterClass = state.getCollectionPersisterClass();
// filters.putAll( state.getFilters() );
// synchronizedTables.addAll( state.getSynchronizedTables() );
// customSQLInsert = state.getCustomSQLInsert();
// customSQLUpdate = state.getCustomSQLUpdate();
// customSQLDelete = state.getCustomSQLDelete();
// customSQLDeleteAll = state.getCustomSQLDeleteAll();
// loaderName = state.getLoaderName();
// }
@Override
public PluralAttribute getAttribute() {
return (PluralAttribute) super.getAttribute();
}
@Override
public boolean isAssociation() {
return collectionElement.getCollectionElementNature() == CollectionElementNature.MANY_TO_ANY
|| collectionElement.getCollectionElementNature() == CollectionElementNature.MANY_TO_MANY
|| collectionElement.getCollectionElementNature() == CollectionElementNature.ONE_TO_MANY;
}
@Override
public TableSpecification getCollectionTable() {
return collectionTable;
}
public void setCollectionTable(Table collectionTable) {
this.collectionTable = collectionTable;
}
@Override
public CollectionKey getCollectionKey() {
return collectionKey;
}
@Override
public AbstractCollectionElement getCollectionElement() {
return collectionElement;
}
@Override
public CascadeStyle getCascadeStyle() {
return cascadeStyle;
}
@Override
public void setCascadeStyles(Iterable<CascadeStyle> cascadeStyles) {
List<CascadeStyle> cascadeStyleList = new ArrayList<CascadeStyle>();
for ( CascadeStyle style : cascadeStyles ) {
if ( style != CascadeStyles.NONE ) {
cascadeStyleList.add( style );
}
if ( style == CascadeStyles.DELETE_ORPHAN ||
style == CascadeStyles.ALL_DELETE_ORPHAN ) {
orphanDelete = true;
}
}
if ( cascadeStyleList.isEmpty() ) {
cascadeStyle = CascadeStyles.NONE;
}
else if ( cascadeStyleList.size() == 1 ) {
cascadeStyle = cascadeStyleList.get( 0 );
}
else {
cascadeStyle = new CascadeStyles.MultipleCascadeStyle(
cascadeStyleList.toArray( new CascadeStyle[ cascadeStyleList.size() ] )
);
}
}
@Override
public boolean isOrphanDelete() {
return orphanDelete;
}
@Override
public FetchMode getFetchMode() {
if ( getFetchStyle() == FetchStyle.JOIN ) {
return FetchMode.JOIN;
}
else {
return FetchMode.SELECT;
}
}
@Override
public FetchTiming getFetchTiming() {
return fetchTiming;
}
@Override
public void setFetchTiming(FetchTiming fetchTiming) {
this.fetchTiming = fetchTiming;
}
@Override
public FetchStyle getFetchStyle() {
return fetchStyle;
}
@Override
public void setFetchStyle(FetchStyle fetchStyle) {
this.fetchStyle = fetchStyle;
}
@Override
public String getCustomLoaderName() {
return customLoaderName;
}
public void setCustomLoaderName(String customLoaderName) {
this.customLoaderName = customLoaderName;
}
@Override
public CustomSQL getCustomSqlInsert() {
return customSqlInsert;
}
public void setCustomSqlInsert(CustomSQL customSqlInsert) {
this.customSqlInsert = customSqlInsert;
}
@Override
public CustomSQL getCustomSqlUpdate() {
return customSqlUpdate;
}
public void setCustomSqlUpdate(CustomSQL customSqlUpdate) {
this.customSqlUpdate = customSqlUpdate;
}
@Override
public CustomSQL getCustomSqlDelete() {
return customSqlDelete;
}
public void setCustomSqlDelete(CustomSQL customSqlDelete) {
this.customSqlDelete = customSqlDelete;
}
@Override
public CustomSQL getCustomSqlDeleteAll() {
return customSqlDeleteAll;
}
public void setCustomSqlDeleteAll(CustomSQL customSqlDeleteAll) {
this.customSqlDeleteAll = customSqlDeleteAll;
}
public Class<? extends CollectionPersister> getCollectionPersisterClass() {
return collectionPersisterClass;
}
public void setCollectionPersisterClass(Class<? extends CollectionPersister> collectionPersisterClass) {
this.collectionPersisterClass = collectionPersisterClass;
}
public Caching getCaching() {
return caching;
}
public void setCaching(Caching caching) {
this.caching = caching;
}
@Override
public String getOrderBy() {
return orderBy;
}
public void setOrderBy(String orderBy) {
this.orderBy = orderBy;
}
@Override
public String getWhere() {
return where;
}
public void setWhere(String where) {
this.where = where;
}
@Override
public boolean isInverse() {
return inverse;
}
public void setInverse(boolean inverse) {
this.inverse = inverse;
}
@Override
public boolean isMutable() {
return mutable;
}
public void setMutable(boolean mutable) {
this.mutable = mutable;
}
@Override
public int getBatchSize() {
return batchSize;
}
public void setBatchSize(int batchSize) {
this.batchSize = batchSize;
}
public String getReferencedPropertyName() {
return referencedPropertyName;
}
@Override
public boolean isSorted() {
return sorted;
}
@Override
public Comparator getComparator() {
return comparator;
}
public void setComparator(Comparator comparator) {
this.comparator = comparator;
}
public String getComparatorClassName() {
return comparatorClassName;
}
public void addFilter(String name, String condition) {
filters.put( name, condition );
}
@Override
public java.util.Map getFilterMap() {
return filters;
}
}

View File

@ -1,113 +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.binding;
import java.util.ArrayList;
import java.util.List;
import org.hibernate.AssertionFailure;
import org.hibernate.metamodel.domain.SingularAttribute;
import org.hibernate.metamodel.relational.SimpleValue;
import org.hibernate.metamodel.relational.Tuple;
import org.hibernate.metamodel.relational.Value;
/**
* @author Steve Ebersole
*/
public abstract class AbstractSingularAttributeBinding
extends AbstractAttributeBinding
implements SingularAttributeBinding {
private Value value;
private List<SimpleValueBinding> simpleValueBindings = new ArrayList<SimpleValueBinding>();
private boolean hasDerivedValue;
private boolean isNullable = true;
protected AbstractSingularAttributeBinding(AttributeBindingContainer container, SingularAttribute attribute) {
super( container, attribute );
}
@Override
public SingularAttribute getAttribute() {
return (SingularAttribute) super.getAttribute();
}
public Value getValue() {
return value;
}
public void setSimpleValueBindings(Iterable<SimpleValueBinding> simpleValueBindings) {
List<SimpleValue> values = new ArrayList<SimpleValue>();
for ( SimpleValueBinding simpleValueBinding : simpleValueBindings ) {
this.simpleValueBindings.add( simpleValueBinding );
values.add( simpleValueBinding.getSimpleValue() );
this.hasDerivedValue = this.hasDerivedValue || simpleValueBinding.isDerived();
this.isNullable = this.isNullable && simpleValueBinding.isNullable();
}
if ( values.size() == 1 ) {
this.value = values.get( 0 );
}
else {
final Tuple tuple = values.get( 0 ).getTable().createTuple( getRole() );
for ( SimpleValue value : values ) {
tuple.addValue( value );
}
this.value = tuple;
}
}
private String getRole() {
return getContainer().getPathBase() + '.' + getAttribute().getName();
}
@Override
public int getSimpleValueSpan() {
checkValueBinding();
return simpleValueBindings.size();
}
protected void checkValueBinding() {
if ( value == null ) {
throw new AssertionFailure( "No values yet bound!" );
}
}
@Override
public Iterable<SimpleValueBinding> getSimpleValueBindings() {
return simpleValueBindings;
}
@Override
public boolean hasDerivedValue() {
checkValueBinding();
return hasDerivedValue;
}
@Override
public boolean isNullable() {
checkValueBinding();
return isNullable;
}
}

View File

@ -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.binding;
import org.hibernate.FetchMode;
import org.hibernate.engine.FetchStyle;
import org.hibernate.engine.FetchTiming;
import org.hibernate.engine.spi.CascadeStyle;
/**
* Contract describing a binding for attributes which model associations.
*
* @author Steve Ebersole
*/
public interface AssociationAttributeBinding extends AttributeBinding {
/**
* Obtain the cascade style in effect for this association.
*
* @return The (potentially aggregated) cascade style.
*/
public CascadeStyle getCascadeStyle();
/**
* Set the cascade styles in effect for this association.
*
* @param cascadeStyles The cascade styles.
*/
public void setCascadeStyles(Iterable<CascadeStyle> cascadeStyles);
public FetchTiming getFetchTiming();
public void setFetchTiming(FetchTiming fetchTiming);
public FetchStyle getFetchStyle();
public void setFetchStyle(FetchStyle fetchStyle);
/**
* Temporary. Needed for integration with legacy org.hibernate.mapping configuration of persisters.
*
* @deprecated
*/
@Deprecated
@SuppressWarnings( {"JavaDoc"})
public FetchMode getFetchMode();
}

View File

@ -1,89 +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.binding;
import java.util.Set;
import org.hibernate.metamodel.domain.Attribute;
import org.hibernate.metamodel.source.MetaAttributeContext;
/**
* The basic contract for binding a {@link #getAttribute() attribute} from the domain model to the relational model.
*
* @author Steve Ebersole
*/
public interface AttributeBinding {
/**
* Obtain the entity binding to which this attribute binding exists.
*
* @return The entity binding.
*/
public AttributeBindingContainer getContainer();
/**
* Obtain the attribute bound.
*
* @return The attribute.
*/
public Attribute getAttribute();
/**
* Obtain the descriptor for the Hibernate {@link org.hibernate.type.Type} for this binding.
* <p/>
* For information about the Java type, query the {@link Attribute} obtained from {@link #getAttribute()}
* instead.
*
* @return The type descriptor
*/
public HibernateTypeDescriptor getHibernateTypeDescriptor();
public boolean isAssociation();
public boolean isBasicPropertyAccessor();
public String getPropertyAccessorName();
public void setPropertyAccessorName(String propertyAccessorName);
public boolean isIncludedInOptimisticLocking();
public void setIncludedInOptimisticLocking(boolean includedInOptimisticLocking);
/**
* Obtain the meta attributes associated with this binding
*
* @return The meta attributes
*/
public MetaAttributeContext getMetaAttributeContext();
public boolean isAlternateUniqueKey();
public boolean isLazy();
public void addEntityReferencingAttributeBinding(SingularAssociationAttributeBinding attributeBinding);
public Set<SingularAssociationAttributeBinding> getEntityReferencingAttributeBindings();
public void validate();
}

View File

@ -1,136 +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.binding;
import org.hibernate.metamodel.domain.AttributeContainer;
import org.hibernate.metamodel.domain.PluralAttribute;
import org.hibernate.metamodel.domain.SingularAttribute;
import org.hibernate.metamodel.source.MetaAttributeContext;
/**
* Common contract for {@link EntityBinding} and {@link ComponentAttributeBinding} in so far as they are both
* containers for {@link AttributeBinding} descriptors
*
* @author Steve Ebersole
*/
public interface AttributeBindingContainer {
/**
* Obtain the path base of this container. Intended to help uniquely identify each attribute binding.
*
* @return The path base for this container.
*/
public String getPathBase();
/**
* Obtain the underlying domain attribute container.
*
* @return The attribute container
*/
public AttributeContainer getAttributeContainer();
/**
* Obtain all attribute bindings
*
* @return All attribute bindings
*/
public Iterable<AttributeBinding> attributeBindings();
/**
* Locate a specific attribute binding, by its local name.
*
* @param name The name of the attribute, local to this container.
*
* @return The attribute binding.
*/
public AttributeBinding locateAttributeBinding(String name);
/**
* Factory method for basic attribute bindings.
*
* @param attribute The attribute for which to make a binding.
*
* @return The attribute binding instance.
*/
public BasicAttributeBinding makeBasicAttributeBinding(SingularAttribute attribute);
/**
* Factory method for component attribute bindings.
*
* @param attribute The attribute for which to make a binding.
*
* @return The attribute binding instance.
*/
public ComponentAttributeBinding makeComponentAttributeBinding(SingularAttribute attribute);
/**
* Factory method for many-to-one attribute bindings.
*
* @param attribute The attribute for which to make a binding.
*
* @return The attribute binding instance.
*/
public ManyToOneAttributeBinding makeManyToOneAttributeBinding(SingularAttribute attribute);
/**
* Factory method for bag attribute bindings.
*
* @param attribute The attribute for which to make a binding.
* @param nature The nature of the collection elements.
*
* @return The attribute binding instance.
*/
public BagBinding makeBagAttributeBinding(PluralAttribute attribute, CollectionElementNature nature);
/**
* Factory method for bag attribute bindings.
*
* @param attribute The attribute for which to make a binding.
* @param nature The nature of the collection elements.
*
* @return The attribute binding instance.
*/
public SetBinding makeSetAttributeBinding(PluralAttribute attribute, CollectionElementNature nature);
/**
* Seeks out the entity binding that is the root of this component path.
*
* @return The entity binding
*/
public EntityBinding seekEntityBinding();
/**
* Obtain the {@link Class} reference for this attribute container. Generally this is used to perform reflection
* on the attributes.
*
* @return The {@link Class} reference
*/
public Class<?> getClassReference();
/**
* Obtain the meta-attribute context for this container.
*
* @return The meta-attribute context.
*/
public MetaAttributeContext getMetaAttributeContext();
}

View File

@ -1,37 +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.binding;
import org.hibernate.metamodel.domain.PluralAttribute;
/**
* TODO : javadoc
*
* @author Steve Ebersole
*/
public class BagBinding extends AbstractPluralAttributeBinding {
protected BagBinding(AttributeBindingContainer container, PluralAttribute attribute, CollectionElementNature nature) {
super( container, attribute, nature );
}
}

View File

@ -1,197 +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.binding;
import java.util.Properties;
import org.hibernate.MappingException;
import org.hibernate.id.IdentifierGenerator;
import org.hibernate.id.PersistentIdentifierGenerator;
import org.hibernate.id.factory.IdentifierGeneratorFactory;
import org.hibernate.mapping.PropertyGeneration;
import org.hibernate.metamodel.domain.SingularAttribute;
import org.hibernate.metamodel.relational.Column;
import org.hibernate.metamodel.relational.Schema;
import org.hibernate.metamodel.relational.SimpleValue;
import org.hibernate.metamodel.source.MetaAttributeContext;
/**
* TODO : javadoc
*
* @author Steve Ebersole
*/
public class BasicAttributeBinding
extends AbstractSingularAttributeBinding
implements KeyValueBinding {
private String unsavedValue;
private PropertyGeneration generation;
private boolean includedInOptimisticLocking;
private boolean forceNonNullable;
private boolean forceUnique;
private boolean keyCascadeDeleteEnabled;
private MetaAttributeContext metaAttributeContext;
BasicAttributeBinding(
AttributeBindingContainer container,
SingularAttribute attribute,
boolean forceNonNullable,
boolean forceUnique) {
super( container, attribute );
this.forceNonNullable = forceNonNullable;
this.forceUnique = forceUnique;
}
@Override
public boolean isAssociation() {
return false;
}
@Override
public String getUnsavedValue() {
return unsavedValue;
}
public void setUnsavedValue(String unsavedValue) {
this.unsavedValue = unsavedValue;
}
@Override
public PropertyGeneration getGeneration() {
return generation;
}
public void setGeneration(PropertyGeneration generation) {
this.generation = generation;
}
public boolean isIncludedInOptimisticLocking() {
return includedInOptimisticLocking;
}
public void setIncludedInOptimisticLocking(boolean includedInOptimisticLocking) {
this.includedInOptimisticLocking = includedInOptimisticLocking;
}
@Override
public boolean isKeyCascadeDeleteEnabled() {
return keyCascadeDeleteEnabled;
}
public void setKeyCascadeDeleteEnabled(boolean keyCascadeDeleteEnabled) {
this.keyCascadeDeleteEnabled = keyCascadeDeleteEnabled;
}
public boolean forceNonNullable() {
return forceNonNullable;
}
public boolean forceUnique() {
return forceUnique;
}
public MetaAttributeContext getMetaAttributeContext() {
return metaAttributeContext;
}
public void setMetaAttributeContext(MetaAttributeContext metaAttributeContext) {
this.metaAttributeContext = metaAttributeContext;
}
IdentifierGenerator createIdentifierGenerator(
IdGenerator idGenerator,
IdentifierGeneratorFactory identifierGeneratorFactory,
Properties properties) {
Properties params = new Properties();
params.putAll( properties );
// use the schema/catalog specified by getValue().getTable() - but note that
// if the schema/catalog were specified as params, they will already be initialized and
//will override the values set here (they are in idGenerator.getParameters().)
Schema schema = getValue().getTable().getSchema();
if ( schema != null ) {
if ( schema.getName().getSchema() != null ) {
params.setProperty( PersistentIdentifierGenerator.SCHEMA, schema.getName().getSchema().getName() );
}
if ( schema.getName().getCatalog() != null ) {
params.setProperty( PersistentIdentifierGenerator.CATALOG, schema.getName().getCatalog().getName() );
}
}
// TODO: not sure how this works for collection IDs...
//pass the entity-name, if not a collection-id
//if ( rootClass!=null) {
params.setProperty( IdentifierGenerator.ENTITY_NAME, getContainer().seekEntityBinding().getEntity().getName() );
//}
//init the table here instead of earlier, so that we can get a quoted table name
//TODO: would it be better to simply pass the qualified table name, instead of
// splitting it up into schema/catalog/table names
String tableName = getValue().getTable().getQualifiedName( identifierGeneratorFactory.getDialect() );
params.setProperty( PersistentIdentifierGenerator.TABLE, tableName );
//pass the column name (a generated id almost always has a single column)
if ( getSimpleValueSpan() > 1 ) {
throw new MappingException(
"A SimpleAttributeBinding used for an identifier has more than 1 Value: " + getAttribute().getName()
);
}
SimpleValue simpleValue = (SimpleValue) getValue();
if ( !Column.class.isInstance( simpleValue ) ) {
throw new MappingException(
"Cannot create an IdentifierGenerator because the value is not a column: " +
simpleValue.toLoggableString()
);
}
params.setProperty(
PersistentIdentifierGenerator.PK,
( (Column) simpleValue ).getColumnName().encloseInQuotesIfQuoted(
identifierGeneratorFactory.getDialect()
)
);
// TODO: is this stuff necessary for SimpleValue???
//if (rootClass!=null) {
// StringBuffer tables = new StringBuffer();
// Iterator iter = rootClass.getIdentityTables().iterator();
// while ( iter.hasNext() ) {
// Table table= (Table) iter.next();
// tables.append( table.getQuotedName(dialect) );
// if ( iter.hasNext() ) tables.append(", ");
// }
// params.setProperty( PersistentIdentifierGenerator.TABLES, tables.toString() );
//}
//else {
params.setProperty( PersistentIdentifierGenerator.TABLES, tableName );
//}
params.putAll( idGenerator.getParameters() );
return identifierGeneratorFactory.createIdentifierGenerator(
idGenerator.getStrategy(), getHibernateTypeDescriptor().getResolvedTypeMapping(), params
);
}
}

View File

@ -1,44 +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.binding;
/**
* @author Steve Ebersole
* @author Gail Badner
*/
public class BasicCollectionElement extends AbstractCollectionElement {
private final HibernateTypeDescriptor hibernateTypeDescriptor = new HibernateTypeDescriptor();
public BasicCollectionElement(AbstractPluralAttributeBinding binding) {
super( binding );
}
public CollectionElementNature getCollectionElementNature() {
return CollectionElementNature.BASIC;
}
public HibernateTypeDescriptor getHibernateTypeDescriptor() {
return hibernateTypeDescriptor;
}
}

View File

@ -1,82 +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.binding;
import org.hibernate.cache.spi.access.AccessType;
/**
* Defines the caching settings for an entity.
*
* @author Steve Ebersole
* @author Hardy Ferentschik
*/
public class Caching {
private String region;
private AccessType accessType;
private boolean cacheLazyProperties;
public Caching() {
}
public Caching(String region, AccessType accessType, boolean cacheLazyProperties) {
this.region = region;
this.accessType = accessType;
this.cacheLazyProperties = cacheLazyProperties;
}
public String getRegion() {
return region;
}
public void setRegion(String region) {
this.region = region;
}
public AccessType getAccessType() {
return accessType;
}
public void setAccessType(AccessType accessType) {
this.accessType = accessType;
}
public boolean isCacheLazyProperties() {
return cacheLazyProperties;
}
public void setCacheLazyProperties(boolean cacheLazyProperties) {
this.cacheLazyProperties = cacheLazyProperties;
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder();
sb.append( "Caching" );
sb.append( "{region='" ).append( region ).append( '\'' );
sb.append( ", accessType=" ).append( accessType );
sb.append( ", cacheLazyProperties=" ).append( cacheLazyProperties );
sb.append( '}' );
return sb.toString();
}
}

View File

@ -1,173 +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.binding;
import java.util.HashMap;
import java.util.Map;
import org.hibernate.MappingException;
import org.hibernate.engine.spi.CascadeStyle;
import org.hibernate.engine.spi.CascadeStyles;
/**
* @author Hardy Ferentschik
* @todo integrate this w/ org.hibernate.engine.spi.CascadeStyle
*/
public enum CascadeType {
/**
* Cascades save, delete, update, evict, lock, replicate, merge, persist
*/
ALL,
/**
* Cascades save, delete, update, evict, lock, replicate, merge, persist + delete orphans
*/
ALL_DELETE_ORPHAN,
/**
* Cascades save and update
*/
UPDATE,
/**
* Cascades persist
*/
PERSIST,
/**
* Cascades merge
*/
MERGE,
/**
* Cascades lock
*/
LOCK,
/**
* Cascades refresh
*/
REFRESH,
/**
* Cascades replicate
*/
REPLICATE,
/**
* Cascades evict
*/
EVICT,
/**
* Cascade delete
*/
DELETE,
/**
* Cascade delete + delete orphans
*/
DELETE_ORPHAN,
/**
* No cascading
*/
NONE;
private static final Map<String, CascadeType> hbmOptionToCascadeType = new HashMap<String, CascadeType>();
static {
hbmOptionToCascadeType.put( "all", ALL );
hbmOptionToCascadeType.put( "all-delete-orphan", ALL_DELETE_ORPHAN );
hbmOptionToCascadeType.put( "save-update", UPDATE );
hbmOptionToCascadeType.put( "persist", PERSIST );
hbmOptionToCascadeType.put( "merge", MERGE );
hbmOptionToCascadeType.put( "lock", LOCK );
hbmOptionToCascadeType.put( "refresh", REFRESH );
hbmOptionToCascadeType.put( "replicate", REPLICATE );
hbmOptionToCascadeType.put( "evict", EVICT );
hbmOptionToCascadeType.put( "delete", DELETE );
hbmOptionToCascadeType.put( "remove", DELETE ); // adds remove as a sort-of alias for delete...
hbmOptionToCascadeType.put( "delete-orphan", DELETE_ORPHAN );
hbmOptionToCascadeType.put( "none", NONE );
}
private static final Map<javax.persistence.CascadeType, CascadeType> jpaCascadeTypeToHibernateCascadeType = new HashMap<javax.persistence.CascadeType, CascadeType>();
static {
jpaCascadeTypeToHibernateCascadeType.put( javax.persistence.CascadeType.ALL, ALL );
jpaCascadeTypeToHibernateCascadeType.put( javax.persistence.CascadeType.PERSIST, PERSIST );
jpaCascadeTypeToHibernateCascadeType.put( javax.persistence.CascadeType.MERGE, MERGE );
jpaCascadeTypeToHibernateCascadeType.put( javax.persistence.CascadeType.REFRESH, REFRESH );
jpaCascadeTypeToHibernateCascadeType.put( javax.persistence.CascadeType.DETACH, EVICT );
}
private static final Map<CascadeType, CascadeStyle> cascadeTypeToCascadeStyle = new HashMap<CascadeType, CascadeStyle>();
static {
cascadeTypeToCascadeStyle.put( ALL, CascadeStyles.ALL );
cascadeTypeToCascadeStyle.put( ALL_DELETE_ORPHAN, CascadeStyles.ALL_DELETE_ORPHAN );
cascadeTypeToCascadeStyle.put( UPDATE, CascadeStyles.UPDATE );
cascadeTypeToCascadeStyle.put( PERSIST, CascadeStyles.PERSIST );
cascadeTypeToCascadeStyle.put( MERGE, CascadeStyles.MERGE );
cascadeTypeToCascadeStyle.put( LOCK, CascadeStyles.LOCK );
cascadeTypeToCascadeStyle.put( REFRESH, CascadeStyles.REFRESH );
cascadeTypeToCascadeStyle.put( REPLICATE, CascadeStyles.REPLICATE );
cascadeTypeToCascadeStyle.put( EVICT, CascadeStyles.EVICT );
cascadeTypeToCascadeStyle.put( DELETE, CascadeStyles.DELETE );
cascadeTypeToCascadeStyle.put( DELETE_ORPHAN, CascadeStyles.DELETE_ORPHAN );
cascadeTypeToCascadeStyle.put( NONE, CascadeStyles.NONE );
}
/**
* @param hbmOptionName the cascading option as specified in the hbm mapping file
*
* @return Returns the {@code CascadeType} for a given hbm cascading option
*/
public static CascadeType getCascadeType(String hbmOptionName) {
return hbmOptionToCascadeType.get( hbmOptionName );
}
/**
* @param jpaCascade the jpa cascade type
*
* @return Returns the Hibernate {@code CascadeType} for a given jpa cascade type
*/
public static CascadeType getCascadeType(javax.persistence.CascadeType jpaCascade) {
return jpaCascadeTypeToHibernateCascadeType.get( jpaCascade );
}
/**
* @return Returns the {@code CascadeStyle} that corresponds to this {@code CascadeType}
*
* @throws MappingException if there is not corresponding {@code CascadeStyle}
*/
public CascadeStyle toCascadeStyle() {
CascadeStyle cascadeStyle = cascadeTypeToCascadeStyle.get( this );
if ( cascadeStyle == null ) {
throw new MappingException( "No CascadeStyle that corresponds with CascadeType=" + this.name() );
}
return cascadeStyle;
}
}

View File

@ -1,40 +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.binding;
/**
* Describes the nature of persistent collection elements.
*
* @author Steve Ebersole
* @author Gail Badner
*
* @todo Merge with {@link org.hibernate.metamodel.source.binder.PluralAttributeNature} ? package separation kept me from doing that initially
*/
public enum CollectionElementNature {
BASIC,
COMPOSITE,
ONE_TO_MANY,
MANY_TO_MANY,
MANY_TO_ANY
}

View File

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

View File

@ -1,33 +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.binding;
/**
* @author Steve Ebersole
*/
public enum CollectionLaziness {
LAZY,
NOT,
EXTRA
}

View File

@ -1,164 +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.binding;
import java.util.HashMap;
import java.util.Map;
import org.hibernate.mapping.PropertyGeneration;
import org.hibernate.metamodel.domain.AttributeContainer;
import org.hibernate.metamodel.domain.Component;
import org.hibernate.metamodel.domain.PluralAttribute;
import org.hibernate.metamodel.domain.PluralAttributeNature;
import org.hibernate.metamodel.domain.SingularAttribute;
import org.hibernate.metamodel.source.MetaAttributeContext;
/**
* @author Steve Ebersole
*/
public class ComponentAttributeBinding extends AbstractSingularAttributeBinding implements AttributeBindingContainer {
private final String path;
private Map<String, AttributeBinding> attributeBindingMap = new HashMap<String, AttributeBinding>();
private SingularAttribute parentReference;
private MetaAttributeContext metaAttributeContext;
public ComponentAttributeBinding(AttributeBindingContainer container, SingularAttribute attribute) {
super( container, attribute );
this.path = container.getPathBase() + '.' + attribute.getName();
}
@Override
public EntityBinding seekEntityBinding() {
return getContainer().seekEntityBinding();
}
@Override
public String getPathBase() {
return path;
}
@Override
public AttributeContainer getAttributeContainer() {
return getComponent();
}
public Component getComponent() {
return (Component) getAttribute().getSingularAttributeType();
}
@Override
public boolean isAssociation() {
return false;
}
@Override
public MetaAttributeContext getMetaAttributeContext() {
return metaAttributeContext;
}
public void setMetaAttributeContext(MetaAttributeContext metaAttributeContext) {
this.metaAttributeContext = metaAttributeContext;
}
@Override
public AttributeBinding locateAttributeBinding(String name) {
return attributeBindingMap.get( name );
}
@Override
public Iterable<AttributeBinding> attributeBindings() {
return attributeBindingMap.values();
}
@Override
protected void checkValueBinding() {
// do nothing here...
}
@Override
public BasicAttributeBinding makeBasicAttributeBinding(SingularAttribute attribute) {
final BasicAttributeBinding binding = new BasicAttributeBinding(
this,
attribute,
isNullable(),
isAlternateUniqueKey() // todo : is this accurate?
);
registerAttributeBinding( attribute.getName(), binding );
return binding;
}
protected void registerAttributeBinding(String name, AttributeBinding attributeBinding) {
// todo : hook this into the EntityBinding notion of "entity referencing attribute bindings"
attributeBindingMap.put( name, attributeBinding );
}
@Override
public ComponentAttributeBinding makeComponentAttributeBinding(SingularAttribute attribute) {
final ComponentAttributeBinding binding = new ComponentAttributeBinding( this, attribute );
registerAttributeBinding( attribute.getName(), binding );
return binding;
}
@Override
public ManyToOneAttributeBinding makeManyToOneAttributeBinding(SingularAttribute attribute) {
final ManyToOneAttributeBinding binding = new ManyToOneAttributeBinding( this, attribute );
registerAttributeBinding( attribute.getName(), binding );
return binding;
}
@Override
public BagBinding makeBagAttributeBinding(PluralAttribute attribute, CollectionElementNature nature) {
Helper.checkPluralAttributeNature( attribute, PluralAttributeNature.BAG );
final BagBinding binding = new BagBinding( this, attribute, nature );
registerAttributeBinding( attribute.getName(), binding );
return binding;
}
@Override
public SetBinding makeSetAttributeBinding(PluralAttribute attribute, CollectionElementNature nature) {
Helper.checkPluralAttributeNature( attribute, PluralAttributeNature.SET );
final SetBinding binding = new SetBinding( this, attribute, nature );
registerAttributeBinding( attribute.getName(), binding );
return binding;
}
@Override
public Class<?> getClassReference() {
return getComponent().getClassReference();
}
public SingularAttribute getParentReference() {
return parentReference;
}
public void setParentReference(SingularAttribute parentReference) {
this.parentReference = parentReference;
}
@Override
public PropertyGeneration getGeneration() {
// todo : not sure the correct thing to return here since it essentially relies on the simple sub-attributes.
return null;
}
}

View File

@ -1,39 +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.binding;
/**
* @author Steve Ebersole
* @author Gail Badner
*/
public class CompositeCollectionElement extends AbstractCollectionElement {
public CompositeCollectionElement(AbstractPluralAttributeBinding binding) {
super( binding );
}
@Override
public CollectionElementNature getCollectionElementNature() {
return CollectionElementNature.COMPOSITE;
}
}

View File

@ -1,55 +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.binding;
import org.hibernate.engine.spi.ExecuteUpdateResultCheckStyle;
/**
* Wraps the information for custom SQL execution
*
* @author Steve Ebersole
*/
public class CustomSQL {
private final String sql;
private final boolean isCallable;
private final ExecuteUpdateResultCheckStyle checkStyle;
public CustomSQL(String sql, boolean callable, ExecuteUpdateResultCheckStyle checkStyle) {
this.sql = sql;
isCallable = callable;
this.checkStyle = checkStyle;
}
public String getSql() {
return sql;
}
public boolean isCallable() {
return isCallable;
}
public ExecuteUpdateResultCheckStyle getCheckStyle() {
return checkStyle;
}
}

View File

@ -1,605 +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.binding;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.hibernate.AssertionFailure;
import org.hibernate.EntityMode;
import org.hibernate.engine.spi.FilterDefinition;
import org.hibernate.internal.util.ValueHolder;
import org.hibernate.internal.util.collections.JoinedIterable;
import org.hibernate.metamodel.domain.AttributeContainer;
import org.hibernate.metamodel.domain.Entity;
import org.hibernate.metamodel.domain.PluralAttribute;
import org.hibernate.metamodel.domain.PluralAttributeNature;
import org.hibernate.metamodel.domain.SingularAttribute;
import org.hibernate.metamodel.relational.TableSpecification;
import org.hibernate.metamodel.source.MetaAttributeContext;
import org.hibernate.metamodel.source.binder.JpaCallbackClass;
import org.hibernate.persister.entity.EntityPersister;
import org.hibernate.tuple.entity.EntityTuplizer;
/**
* Provides the link between the domain and the relational model for an entity.
*
* @author Steve Ebersole
* @author Hardy Ferentschik
* @author Gail Badner
*/
public class EntityBinding implements AttributeBindingContainer {
private static final String NULL_DISCRIMINATOR_MATCH_VALUE = "null";
private static final String NOT_NULL_DISCRIMINATOR_MATCH_VALUE = "not null";
private final EntityBinding superEntityBinding;
private final List<EntityBinding> subEntityBindings = new ArrayList<EntityBinding>();
private final HierarchyDetails hierarchyDetails;
private Entity entity;
private TableSpecification primaryTable;
private String primaryTableName;
private Map<String, TableSpecification> secondaryTables = new HashMap<String, TableSpecification>();
private ValueHolder<Class<?>> proxyInterfaceType;
private String jpaEntityName;
private Class<? extends EntityPersister> customEntityPersisterClass;
private Class<? extends EntityTuplizer> customEntityTuplizerClass;
private String discriminatorMatchValue;
private Set<FilterDefinition> filterDefinitions = new HashSet<FilterDefinition>();
private Set<SingularAssociationAttributeBinding> entityReferencingAttributeBindings = new HashSet<SingularAssociationAttributeBinding>();
private MetaAttributeContext metaAttributeContext;
private boolean lazy;
private boolean mutable;
private String whereFilter;
private String rowId;
private boolean dynamicUpdate;
private boolean dynamicInsert;
private int batchSize;
private boolean selectBeforeUpdate;
private boolean hasSubselectLoadableCollections;
private Boolean isAbstract;
private String customLoaderName;
private CustomSQL customInsert;
private CustomSQL customUpdate;
private CustomSQL customDelete;
private Set<String> synchronizedTableNames = new HashSet<String>();
private Map<String, AttributeBinding> attributeBindingMap = new HashMap<String, AttributeBinding>();
private List<JpaCallbackClass> jpaCallbackClasses = new ArrayList<JpaCallbackClass>();
/**
* Used to instantiate the EntityBinding for an entity that is the root of an inheritance hierarchy
*
* @param inheritanceType The inheritance type for the hierarchy
* @param entityMode The entity mode used in this hierarchy.
*/
public EntityBinding(InheritanceType inheritanceType, EntityMode entityMode) {
this.superEntityBinding = null;
this.hierarchyDetails = new HierarchyDetails( this, inheritanceType, entityMode );
}
/**
* Used to instantiate the EntityBinding for an entity that is a subclass (sub-entity) in an inheritance hierarchy
*
* @param superEntityBinding The entity binding of this binding's super
*/
public EntityBinding(EntityBinding superEntityBinding) {
this.superEntityBinding = superEntityBinding;
this.superEntityBinding.subEntityBindings.add( this );
this.hierarchyDetails = superEntityBinding.getHierarchyDetails();
}
public HierarchyDetails getHierarchyDetails() {
return hierarchyDetails;
}
public EntityBinding getSuperEntityBinding() {
return superEntityBinding;
}
public boolean isRoot() {
return superEntityBinding == null;
}
public boolean isPolymorphic() {
return superEntityBinding != null ||
hierarchyDetails.getEntityDiscriminator() != null ||
! subEntityBindings.isEmpty();
}
public boolean hasSubEntityBindings() {
return subEntityBindings.size() > 0;
}
public int getSubEntityBindingClosureSpan() {
int n = subEntityBindings.size();
for ( EntityBinding subEntityBinding : subEntityBindings ) {
n += subEntityBinding.getSubEntityBindingClosureSpan();
}
return n;
}
/* used for testing */
public Iterable<EntityBinding> getDirectSubEntityBindings() {
return subEntityBindings;
}
/**
* Returns sub-EntityBinding objects in a special 'order', most derived subclasses
* first. Specifically, the sub-entity bindings follow a depth-first,
* post-order traversal
*
* Note that the returned value excludes this entity binding.
*
* @return sub-entity bindings ordered by those entity bindings that are most derived.
*/
public Iterable<EntityBinding> getPostOrderSubEntityBindingClosure() {
// TODO: why this order?
List<Iterable<EntityBinding>> subclassIterables = new ArrayList<Iterable<EntityBinding>>( subEntityBindings.size() + 1 );
for ( EntityBinding subEntityBinding : subEntityBindings ) {
Iterable<EntityBinding> subSubEntityBindings = subEntityBinding.getPostOrderSubEntityBindingClosure();
if ( subSubEntityBindings.iterator().hasNext() ) {
subclassIterables.add( subSubEntityBindings );
}
}
if ( ! subEntityBindings.isEmpty() ) {
subclassIterables.add( subEntityBindings );
}
return new JoinedIterable<EntityBinding>( subclassIterables );
}
/**
* Returns sub-EntityBinding ordered as a depth-first,
* pre-order traversal (a subclass precedes its own subclasses).
*
* Note that the returned value specifically excludes this entity binding.
*
* @return sub-entity bindings ordered as a depth-first,
* pre-order traversal
*/
public Iterable<EntityBinding> getPreOrderSubEntityBindingClosure() {
return getPreOrderSubEntityBindingClosure( false );
}
private Iterable<EntityBinding> getPreOrderSubEntityBindingClosure(boolean includeThis) {
List<Iterable<EntityBinding>> iterables = new ArrayList<Iterable<EntityBinding>>();
if ( includeThis ) {
iterables.add( java.util.Collections.singletonList( this ) );
}
for ( EntityBinding subEntityBinding : subEntityBindings ) {
Iterable<EntityBinding> subSubEntityBindingClosure = subEntityBinding.getPreOrderSubEntityBindingClosure( true );
if ( subSubEntityBindingClosure.iterator().hasNext() ) {
iterables.add( subSubEntityBindingClosure );
}
}
return new JoinedIterable<EntityBinding>( iterables );
}
public Entity getEntity() {
return entity;
}
public void setEntity(Entity entity) {
this.entity = entity;
}
public TableSpecification getPrimaryTable() {
return primaryTable;
}
public void setPrimaryTable(TableSpecification primaryTable) {
this.primaryTable = primaryTable;
}
public TableSpecification locateTable(String tableName) {
if ( tableName == null || tableName.equals( getPrimaryTableName() ) ) {
return primaryTable;
}
TableSpecification tableSpec = secondaryTables.get( tableName );
if ( tableSpec == null ) {
throw new AssertionFailure(
String.format(
"Unable to find table %s amongst tables %s",
tableName,
secondaryTables.keySet()
)
);
}
return tableSpec;
}
public String getPrimaryTableName() {
return primaryTableName;
}
public void setPrimaryTableName(String primaryTableName) {
this.primaryTableName = primaryTableName;
}
public void addSecondaryTable(String tableName, TableSpecification table) {
secondaryTables.put( tableName, table );
}
public boolean isVersioned() {
return getHierarchyDetails().getVersioningAttributeBinding() != null;
}
public boolean isDiscriminatorMatchValueNull() {
return NULL_DISCRIMINATOR_MATCH_VALUE.equals( discriminatorMatchValue );
}
public boolean isDiscriminatorMatchValueNotNull() {
return NOT_NULL_DISCRIMINATOR_MATCH_VALUE.equals( discriminatorMatchValue );
}
public String getDiscriminatorMatchValue() {
return discriminatorMatchValue;
}
public void setDiscriminatorMatchValue(String discriminatorMatchValue) {
this.discriminatorMatchValue = discriminatorMatchValue;
}
public Iterable<FilterDefinition> getFilterDefinitions() {
return filterDefinitions;
}
public void addFilterDefinition(FilterDefinition filterDefinition) {
filterDefinitions.add( filterDefinition );
}
public Iterable<SingularAssociationAttributeBinding> getEntityReferencingAttributeBindings() {
return entityReferencingAttributeBindings;
}
@Override
public EntityBinding seekEntityBinding() {
return this;
}
@Override
public String getPathBase() {
return getEntity().getName();
}
@Override
public Class<?> getClassReference() {
return getEntity().getClassReference();
}
@Override
public AttributeContainer getAttributeContainer() {
return getEntity();
}
protected void registerAttributeBinding(String name, AttributeBinding attributeBinding) {
if ( SingularAssociationAttributeBinding.class.isInstance( attributeBinding ) ) {
entityReferencingAttributeBindings.add( (SingularAssociationAttributeBinding) attributeBinding );
}
attributeBindingMap.put( name, attributeBinding );
}
@Override
public MetaAttributeContext getMetaAttributeContext() {
return metaAttributeContext;
}
public void setMetaAttributeContext(MetaAttributeContext metaAttributeContext) {
this.metaAttributeContext = metaAttributeContext;
}
public boolean isMutable() {
return mutable;
}
public void setMutable(boolean mutable) {
this.mutable = mutable;
}
public boolean isLazy() {
return lazy;
}
public void setLazy(boolean lazy) {
this.lazy = lazy;
}
public ValueHolder<Class<?>> getProxyInterfaceType() {
return proxyInterfaceType;
}
public void setProxyInterfaceType(ValueHolder<Class<?>> proxyInterfaceType) {
this.proxyInterfaceType = proxyInterfaceType;
}
public String getWhereFilter() {
return whereFilter;
}
public void setWhereFilter(String whereFilter) {
this.whereFilter = whereFilter;
}
public String getRowId() {
return rowId;
}
public void setRowId(String rowId) {
this.rowId = rowId;
}
public boolean isDynamicUpdate() {
return dynamicUpdate;
}
public void setDynamicUpdate(boolean dynamicUpdate) {
this.dynamicUpdate = dynamicUpdate;
}
public boolean isDynamicInsert() {
return dynamicInsert;
}
public void setDynamicInsert(boolean dynamicInsert) {
this.dynamicInsert = dynamicInsert;
}
public int getBatchSize() {
return batchSize;
}
public void setBatchSize(int batchSize) {
this.batchSize = batchSize;
}
public boolean isSelectBeforeUpdate() {
return selectBeforeUpdate;
}
public void setSelectBeforeUpdate(boolean selectBeforeUpdate) {
this.selectBeforeUpdate = selectBeforeUpdate;
}
public boolean hasSubselectLoadableCollections() {
return hasSubselectLoadableCollections;
}
/* package-protected */
void setSubselectLoadableCollections(boolean hasSubselectLoadableCollections) {
this.hasSubselectLoadableCollections = hasSubselectLoadableCollections;
}
public Class<? extends EntityPersister> getCustomEntityPersisterClass() {
return customEntityPersisterClass;
}
public void setCustomEntityPersisterClass(Class<? extends EntityPersister> customEntityPersisterClass) {
this.customEntityPersisterClass = customEntityPersisterClass;
}
public Class<? extends EntityTuplizer> getCustomEntityTuplizerClass() {
return customEntityTuplizerClass;
}
public void setCustomEntityTuplizerClass(Class<? extends EntityTuplizer> customEntityTuplizerClass) {
this.customEntityTuplizerClass = customEntityTuplizerClass;
}
public Boolean isAbstract() {
return isAbstract;
}
public void setAbstract(Boolean isAbstract) {
this.isAbstract = isAbstract;
}
public Set<String> getSynchronizedTableNames() {
return synchronizedTableNames;
}
public void addSynchronizedTableNames(java.util.Collection<String> synchronizedTableNames) {
this.synchronizedTableNames.addAll( synchronizedTableNames );
}
public String getJpaEntityName() {
return jpaEntityName;
}
public void setJpaEntityName(String jpaEntityName) {
this.jpaEntityName = jpaEntityName;
}
public String getCustomLoaderName() {
return customLoaderName;
}
public void setCustomLoaderName(String customLoaderName) {
this.customLoaderName = customLoaderName;
}
public CustomSQL getCustomInsert() {
return customInsert;
}
public void setCustomInsert(CustomSQL customInsert) {
this.customInsert = customInsert;
}
public CustomSQL getCustomUpdate() {
return customUpdate;
}
public void setCustomUpdate(CustomSQL customUpdate) {
this.customUpdate = customUpdate;
}
public CustomSQL getCustomDelete() {
return customDelete;
}
public void setCustomDelete(CustomSQL customDelete) {
this.customDelete = customDelete;
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder();
sb.append( "EntityBinding" );
sb.append( "{entity=" ).append( entity != null ? entity.getName() : "not set" );
sb.append( '}' );
return sb.toString();
}
@Override
public BasicAttributeBinding makeBasicAttributeBinding(SingularAttribute attribute) {
return makeSimpleAttributeBinding( attribute, false, false );
}
private BasicAttributeBinding makeSimpleAttributeBinding(SingularAttribute attribute, boolean forceNonNullable, boolean forceUnique) {
final BasicAttributeBinding binding = new BasicAttributeBinding(
this,
attribute,
forceNonNullable,
forceUnique
);
registerAttributeBinding( attribute.getName(), binding );
return binding;
}
@Override
public ComponentAttributeBinding makeComponentAttributeBinding(SingularAttribute attribute) {
final ComponentAttributeBinding binding = new ComponentAttributeBinding( this, attribute );
registerAttributeBinding( attribute.getName(), binding );
return binding;
}
@Override
public ManyToOneAttributeBinding makeManyToOneAttributeBinding(SingularAttribute attribute) {
final ManyToOneAttributeBinding binding = new ManyToOneAttributeBinding( this, attribute );
registerAttributeBinding( attribute.getName(), binding );
return binding;
}
@Override
public BagBinding makeBagAttributeBinding(PluralAttribute attribute, CollectionElementNature nature) {
Helper.checkPluralAttributeNature( attribute, PluralAttributeNature.BAG );
final BagBinding binding = new BagBinding( this, attribute, nature );
registerAttributeBinding( attribute.getName(), binding );
return binding;
}
@Override
public SetBinding makeSetAttributeBinding(PluralAttribute attribute, CollectionElementNature nature) {
Helper.checkPluralAttributeNature( attribute, PluralAttributeNature.SET );
final SetBinding binding = new SetBinding( this, attribute, nature );
registerAttributeBinding( attribute.getName(), binding );
return binding;
}
@Override
public AttributeBinding locateAttributeBinding(String name) {
return attributeBindingMap.get( name );
}
@Override
public Iterable<AttributeBinding> attributeBindings() {
return attributeBindingMap.values();
}
/**
* Gets the number of attribute bindings defined on this class, including the
* identifier attribute binding and attribute bindings defined
* as part of a join.
*
* @return The number of attribute bindings
*/
public int getAttributeBindingClosureSpan() {
// TODO: update account for join attribute bindings
return superEntityBinding != null ?
superEntityBinding.getAttributeBindingClosureSpan() + attributeBindingMap.size() :
attributeBindingMap.size();
}
/**
* Gets the attribute bindings defined on this class, including the
* identifier attribute binding and attribute bindings defined
* as part of a join.
*
* @return The attribute bindings.
*/
public Iterable<AttributeBinding> getAttributeBindingClosure() {
// TODO: update size to account for joins
Iterable<AttributeBinding> iterable;
if ( superEntityBinding != null ) {
List<Iterable<AttributeBinding>> iterables = new ArrayList<Iterable<AttributeBinding>>( 2 );
iterables.add( superEntityBinding.getAttributeBindingClosure() );
iterables.add( attributeBindings() );
iterable = new JoinedIterable<AttributeBinding>( iterables );
}
else {
iterable = attributeBindings();
}
return iterable;
}
/**
* Gets the attribute bindings for this EntityBinding and all of its
* sub-EntityBinding, starting from the root of the hierarchy; includes
* the identifier and attribute bindings defined as part of a join.
* @return
*/
public Iterable<AttributeBinding> getSubEntityAttributeBindingClosure() {
List<Iterable<AttributeBinding>> iterables = new ArrayList<Iterable<AttributeBinding>>();
iterables.add( getAttributeBindingClosure() );
for ( EntityBinding subEntityBinding : getPreOrderSubEntityBindingClosure() ) {
// only add attribute bindings declared for the subEntityBinding
iterables.add( subEntityBinding.attributeBindings() );
// TODO: if EntityBinding.attributeBindings() excludes joined attributes, then they need to be added here
}
return new JoinedIterable<AttributeBinding>( iterables );
}
public void setJpaCallbackClasses( List<JpaCallbackClass> jpaCallbackClasses ) {
this.jpaCallbackClasses = jpaCallbackClasses;
}
public Iterable<JpaCallbackClass> getJpaCallbackClasses() {
return jpaCallbackClasses;
}
}

View File

@ -1,82 +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.binding;
import org.hibernate.metamodel.relational.SimpleValue;
/**
* Binding of the discriminator in a entity hierarchy
*
* @author Steve Ebersole
* @author Hardy Ferentschik
*/
public class EntityDiscriminator {
private final HibernateTypeDescriptor explicitHibernateTypeDescriptor = new HibernateTypeDescriptor();
private SimpleValue boundValue;
private boolean forced;
private boolean inserted = true;
public EntityDiscriminator() {
}
public SimpleValue getBoundValue() {
return boundValue;
}
public void setBoundValue(SimpleValue boundValue) {
this.boundValue = boundValue;
}
public HibernateTypeDescriptor getExplicitHibernateTypeDescriptor() {
return explicitHibernateTypeDescriptor;
}
public boolean isForced() {
return forced;
}
public void setForced(boolean forced) {
this.forced = forced;
}
public boolean isInserted() {
return inserted;
}
public void setInserted(boolean inserted) {
this.inserted = inserted;
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder();
sb.append( "EntityDiscriminator" );
sb.append( "{boundValue=" ).append( boundValue );
sb.append( ", forced=" ).append( forced );
sb.append( ", inserted=" ).append( inserted );
sb.append( '}' );
return sb.toString();
}
}

View File

@ -1,95 +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.binding;
import java.util.Properties;
import org.hibernate.AssertionFailure;
import org.hibernate.id.IdentifierGenerator;
import org.hibernate.id.factory.IdentifierGeneratorFactory;
/**
* Binds the entity identifier.
*
* @author Steve Ebersole
* @author Hardy Ferentschik
*/
public class EntityIdentifier {
private final EntityBinding entityBinding;
private BasicAttributeBinding attributeBinding;
private IdentifierGenerator identifierGenerator;
private IdGenerator idGenerator;
private boolean isIdentifierMapper = false;
// todo : mappers, etc
/**
* Create an identifier
*
* @param entityBinding the entity binding for which this instance is the id
*/
public EntityIdentifier(EntityBinding entityBinding) {
this.entityBinding = entityBinding;
}
public BasicAttributeBinding getValueBinding() {
return attributeBinding;
}
public void setValueBinding(BasicAttributeBinding attributeBinding) {
if ( this.attributeBinding != null ) {
throw new AssertionFailure(
String.format(
"Identifier value binding already existed for %s",
entityBinding.getEntity().getName()
)
);
}
this.attributeBinding = attributeBinding;
}
public void setIdGenerator(IdGenerator idGenerator) {
this.idGenerator = idGenerator;
}
public boolean isEmbedded() {
return attributeBinding.getSimpleValueSpan() > 1;
}
public boolean isIdentifierMapper() {
return isIdentifierMapper;
}
// todo do we really need this createIdentifierGenerator and how do we make sure the getter is not called too early
// maybe some sort of visitor pattern here!? (HF)
public IdentifierGenerator createIdentifierGenerator(IdentifierGeneratorFactory factory, Properties properties) {
if ( idGenerator != null ) {
identifierGenerator = attributeBinding.createIdentifierGenerator( idGenerator, factory, properties );
}
return identifierGenerator;
}
public IdentifierGenerator getIdentifierGenerator() {
return identifierGenerator;
}
}

View File

@ -1,114 +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.binding;
import java.util.Collections;
import java.util.Set;
/**
* A fetch profile allows a user to dynamically modify the fetching strategy used for particular associations at runtime, whereas
* that information was historically only statically defined in the metadata.
* <p/>
* This class represent the data as it is defined in their metadata.
*
* @author Steve Ebersole
* @see org.hibernate.engine.profile.FetchProfile
*/
public class FetchProfile {
private final String name;
private final Set<Fetch> fetches;
/**
* Create a fetch profile representation.
*
* @param name The name of the fetch profile.
* @param fetches
*/
public FetchProfile( String name,
Set<Fetch> fetches ) {
this.name = name;
this.fetches = fetches;
}
/**
* Retrieve the name of the fetch profile.
*
* @return The profile name
*/
public String getName() {
return name;
}
/**
* Retrieve the fetches associated with this profile
*
* @return The fetches associated with this profile.
*/
public Set<Fetch> getFetches() {
return Collections.unmodifiableSet(fetches);
}
/**
* Adds a fetch to this profile.
*
* @param entity The entity which contains the association to be fetched
* @param association The association to fetch
* @param style The style of fetch t apply
*/
public void addFetch( String entity,
String association,
String style ) {
fetches.add(new Fetch(entity, association, style));
}
/**
* Defines an individual association fetch within the given profile.
*/
public static class Fetch {
private final String entity;
private final String association;
private final String style;
public Fetch( String entity,
String association,
String style ) {
this.entity = entity;
this.association = association;
this.style = style;
}
public String getEntity() {
return entity;
}
public String getAssociation() {
return association;
}
public String getStyle() {
return style;
}
}
}

View File

@ -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.binding;
import org.hibernate.AssertionFailure;
import org.hibernate.metamodel.domain.PluralAttribute;
import org.hibernate.metamodel.domain.PluralAttributeNature;
/**
* Helper utilities specific to the binding package.
*
* @author Steve Ebersole
*/
public class Helper {
public static void checkPluralAttributeNature(PluralAttribute attribute, PluralAttributeNature expected) {
if ( attribute.getNature() != expected ) {
throw new AssertionFailure(
String.format(
"Mismatched collection natures; expecting %s, but found %s",
expected.getName(),
attribute.getNature().getName()
)
);
}
}
}

View File

@ -1,83 +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.binding;
import java.util.HashMap;
import java.util.Map;
import org.hibernate.type.Type;
/**
* TODO : javadoc
*
* @author Steve Ebersole
*/
public class HibernateTypeDescriptor {
private String explicitTypeName;
private String javaTypeName;
private boolean isToOne;
private Map<String, String> typeParameters = new HashMap<String, String>( );
private Type resolvedTypeMapping;
public String getExplicitTypeName() {
return explicitTypeName;
}
public void setExplicitTypeName(String explicitTypeName) {
this.explicitTypeName = explicitTypeName;
}
public String getJavaTypeName() {
return javaTypeName;
}
public void setJavaTypeName(String javaTypeName) {
this.javaTypeName = javaTypeName;
}
public boolean isToOne() {
return isToOne;
}
public void setToOne(boolean toOne) {
isToOne = toOne;
}
public Map<String, String> getTypeParameters() {
return typeParameters;
}
public void setTypeParameters(Map<String, String> typeParameters) {
this.typeParameters = typeParameters;
}
public Type getResolvedTypeMapping() {
return resolvedTypeMapping;
}
public void setResolvedTypeMapping(Type resolvedTypeMapping) {
this.resolvedTypeMapping = resolvedTypeMapping;
}
}

View File

@ -1,110 +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.binding;
import org.hibernate.EntityMode;
import org.hibernate.engine.OptimisticLockStyle;
/**
* @author Steve Ebersole
*/
public class HierarchyDetails {
private final EntityBinding rootEntityBinding;
private final InheritanceType inheritanceType;
private final EntityMode entityMode;
private final EntityIdentifier entityIdentifier;
private EntityDiscriminator entityDiscriminator;
private OptimisticLockStyle optimisticLockStyle;
private BasicAttributeBinding versioningAttributeBinding;
private Caching caching;
private boolean explicitPolymorphism;
public HierarchyDetails(EntityBinding rootEntityBinding, InheritanceType inheritanceType, EntityMode entityMode) {
this.rootEntityBinding = rootEntityBinding;
this.inheritanceType = inheritanceType;
this.entityMode = entityMode;
this.entityIdentifier = new EntityIdentifier( rootEntityBinding );
}
public EntityBinding getRootEntityBinding() {
return rootEntityBinding;
}
public InheritanceType getInheritanceType() {
return inheritanceType;
}
public EntityMode getEntityMode() {
return entityMode;
}
public EntityIdentifier getEntityIdentifier() {
return entityIdentifier;
}
public EntityDiscriminator getEntityDiscriminator() {
return entityDiscriminator;
}
public OptimisticLockStyle getOptimisticLockStyle() {
return optimisticLockStyle;
}
public void setOptimisticLockStyle(OptimisticLockStyle optimisticLockStyle) {
this.optimisticLockStyle = optimisticLockStyle;
}
public void setEntityDiscriminator(EntityDiscriminator entityDiscriminator) {
this.entityDiscriminator = entityDiscriminator;
}
public BasicAttributeBinding getVersioningAttributeBinding() {
return versioningAttributeBinding;
}
public void setVersioningAttributeBinding(BasicAttributeBinding versioningAttributeBinding) {
this.versioningAttributeBinding = versioningAttributeBinding;
}
public Caching getCaching() {
return caching;
}
public void setCaching(Caching caching) {
this.caching = caching;
}
public boolean isExplicitPolymorphism() {
return explicitPolymorphism;
}
public void setExplicitPolymorphism(boolean explicitPolymorphism) {
this.explicitPolymorphism = explicitPolymorphism;
}
}

View File

@ -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.binding;
import java.io.Serializable;
import java.util.Collections;
import java.util.Map;
import org.hibernate.internal.util.collections.CollectionHelper;
/**
* Identifier generator container, Useful to keep named generator in annotations
*
* @author Emmanuel Bernard
*/
public class IdGenerator implements Serializable {
private final String name;
private final String strategy;
private final Map<String, String> parameters;
public IdGenerator( String name,
String strategy,
Map<String, String> parameters ) {
this.name = name;
this.strategy = strategy;
if ( CollectionHelper.isEmpty( parameters ) ) {
this.parameters = Collections.emptyMap();
}
else {
this.parameters = Collections.unmodifiableMap( parameters );
}
}
/**
* @return identifier generator strategy
*/
public String getStrategy() {
return strategy;
}
/**
* @return generator name
*/
public String getName() {
return name;
}
/**
* @return generator configuration parameters
*/
public Map<String, String> getParameters() {
return parameters;
}
}

View File

@ -1,63 +0,0 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* Copyright (c) 2008, Red Hat Middleware LLC 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 Middleware LLC.
*
* 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.binding;
import org.hibernate.MappingException;
/**
* The inheritance type for a given entity.
* <p>
* Note, we are not using the JPA enum, because we need the ability to extend the types if we need to.
*
* @author Hardy Ferentschik
*/
public enum InheritanceType {
JOINED,
SINGLE_TABLE,
TABLE_PER_CLASS,
NO_INHERITANCE;
/**
* @param jpaType The JPA inheritance type
*
* @return The inheritance type of this class.
*/
public static InheritanceType get(javax.persistence.InheritanceType jpaType) {
switch ( jpaType ) {
case SINGLE_TABLE: {
return InheritanceType.SINGLE_TABLE;
}
case JOINED: {
return InheritanceType.JOINED;
}
case TABLE_PER_CLASS: {
return InheritanceType.TABLE_PER_CLASS;
}
default: {
throw new MappingException( "Unknown jpa inheritance type:" + jpaType.name() );
}
}
}
}

View File

@ -1,35 +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.binding;
/**
* TODO : javadoc
*
* @author Steve Ebersole
*/
public interface KeyValueBinding extends AttributeBinding {
public boolean isKeyCascadeDeleteEnabled();
public String getUnsavedValue();
}

View File

@ -1,39 +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.binding;
/**
* @author Steve Ebersole
* @author Gail Badner
*/
public class ManyToAnyCollectionElement extends AbstractCollectionElement {
ManyToAnyCollectionElement(AbstractPluralAttributeBinding binding) {
super( binding );
}
@Override
public CollectionElementNature getCollectionElementNature() {
return CollectionElementNature.MANY_TO_ANY;
}
}

View File

@ -1,86 +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.binding;
import java.util.HashMap;
import org.dom4j.Element;
/**
* @author Steve Ebersole
* @author Gail Badner
*/
public class ManyToManyCollectionElement extends AbstractCollectionElement {
private final java.util.Map manyToManyFilters = new HashMap();
private String manyToManyWhere;
private String manyToManyOrderBy;
ManyToManyCollectionElement(AbstractPluralAttributeBinding binding) {
super( binding );
}
@Override
public CollectionElementNature getCollectionElementNature() {
return CollectionElementNature.MANY_TO_MANY;
}
public void fromHbmXml(Element node){
/*
<!ELEMENT many-to-many (meta*,(column|formula)*,filter*)>
<!ATTLIST many-to-many class CDATA #IMPLIED>
<!ATTLIST many-to-many node CDATA #IMPLIED>
<!ATTLIST many-to-many embed-xml (true|false) "true">
<!ATTLIST many-to-many entity-name CDATA #IMPLIED>
<!ATTLIST many-to-many column CDATA #IMPLIED>
<!ATTLIST many-to-many formula CDATA #IMPLIED>
<!ATTLIST many-to-many not-found (exception|ignore) "exception">
<!ATTLIST many-to-many outer-join (true|false|auto) #IMPLIED>
<!ATTLIST many-to-many fetch (join|select) #IMPLIED>
<!ATTLIST many-to-many lazy (false|proxy) #IMPLIED>
<!ATTLIST many-to-many foreign-key CDATA #IMPLIED>
<!ATTLIST many-to-many unique (true|false) "false">
<!ATTLIST many-to-many where CDATA #IMPLIED>
<!ATTLIST many-to-many order-by CDATA #IMPLIED>
<!ATTLIST many-to-many property-ref CDATA #IMPLIED>
*/
}
public String getManyToManyWhere() {
return manyToManyWhere;
}
public void setManyToManyWhere(String manyToManyWhere) {
this.manyToManyWhere = manyToManyWhere;
}
public String getManyToManyOrderBy() {
return manyToManyOrderBy;
}
public void setManyToManyOrderBy(String manyToManyOrderBy) {
this.manyToManyOrderBy = manyToManyOrderBy;
}
}

View File

@ -1,241 +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.binding;
import java.util.ArrayList;
import java.util.List;
import org.hibernate.AssertionFailure;
import org.hibernate.FetchMode;
import org.hibernate.engine.FetchStyle;
import org.hibernate.engine.FetchTiming;
import org.hibernate.engine.spi.CascadeStyle;
import org.hibernate.engine.spi.CascadeStyles;
import org.hibernate.metamodel.domain.SingularAttribute;
/**
* TODO : javadoc
*
* @author Gail Badner
* @author Steve Ebersole
*/
public class ManyToOneAttributeBinding extends BasicAttributeBinding implements SingularAssociationAttributeBinding {
private String referencedEntityName;
private String referencedAttributeName;
private AttributeBinding referencedAttributeBinding;
private boolean isLogicalOneToOne;
private String foreignKeyName;
private CascadeStyle cascadeStyle;
private FetchTiming fetchTiming;
private FetchStyle fetchStyle;
ManyToOneAttributeBinding(AttributeBindingContainer container, SingularAttribute attribute) {
super( container, attribute, false, false );
}
@Override
public boolean isAssociation() {
return true;
}
@Override
public final boolean isPropertyReference() {
return referencedAttributeName != null;
}
@Override
public final String getReferencedEntityName() {
return referencedEntityName;
}
@Override
public void setReferencedEntityName(String referencedEntityName) {
this.referencedEntityName = referencedEntityName;
}
@Override
public final String getReferencedAttributeName() {
return referencedAttributeName;
}
@Override
public void setReferencedAttributeName(String referencedEntityAttributeName) {
this.referencedAttributeName = referencedEntityAttributeName;
}
@Override
public CascadeStyle getCascadeStyle() {
return cascadeStyle;
}
@Override
public void setCascadeStyles(Iterable<CascadeStyle> cascadeStyles) {
List<CascadeStyle> cascadeStyleList = new ArrayList<CascadeStyle>();
for ( CascadeStyle style : cascadeStyles ) {
if ( style != CascadeStyles.NONE ) {
cascadeStyleList.add( style );
}
}
if ( cascadeStyleList.isEmpty() ) {
cascadeStyle = CascadeStyles.NONE;
}
else if ( cascadeStyleList.size() == 1 ) {
cascadeStyle = cascadeStyleList.get( 0 );
}
else {
cascadeStyle = new CascadeStyles.MultipleCascadeStyle(
cascadeStyleList.toArray( new CascadeStyle[ cascadeStyleList.size() ] )
);
}
}
@Override
public FetchTiming getFetchTiming() {
return fetchTiming;
}
@Override
public void setFetchTiming(FetchTiming fetchTiming) {
this.fetchTiming = fetchTiming;
}
@Override
public FetchStyle getFetchStyle() {
return fetchStyle;
}
@Override
public void setFetchStyle(FetchStyle fetchStyle) {
if ( fetchStyle == FetchStyle.SUBSELECT ) {
throw new AssertionFailure( "Subselect fetching not yet supported for singular associations" );
}
this.fetchStyle = fetchStyle;
}
@Override
public FetchMode getFetchMode() {
if ( fetchStyle == FetchStyle.JOIN ) {
return FetchMode.JOIN;
}
else if ( fetchStyle == FetchStyle.SELECT ) {
return FetchMode.SELECT;
}
else if ( fetchStyle == FetchStyle.BATCH ) {
// we need the subsequent select...
return FetchMode.SELECT;
}
throw new AssertionFailure( "Unexpected fetch style : " + fetchStyle.name() );
}
@Override
public final boolean isReferenceResolved() {
return referencedAttributeBinding != null;
}
@Override
public final void resolveReference(AttributeBinding referencedAttributeBinding) {
if ( ! EntityBinding.class.isInstance( referencedAttributeBinding.getContainer() ) ) {
throw new AssertionFailure( "Illegal attempt to resolve many-to-one reference based on non-entity attribute" );
}
final EntityBinding entityBinding = (EntityBinding) referencedAttributeBinding.getContainer();
if ( !referencedEntityName.equals( entityBinding.getEntity().getName() ) ) {
throw new IllegalStateException(
"attempt to set EntityBinding with name: [" +
entityBinding.getEntity().getName() +
"; entity name should be: " + referencedEntityName
);
}
if ( referencedAttributeName == null ) {
referencedAttributeName = referencedAttributeBinding.getAttribute().getName();
}
else if ( !referencedAttributeName.equals( referencedAttributeBinding.getAttribute().getName() ) ) {
throw new IllegalStateException(
"Inconsistent attribute name; expected: " + referencedAttributeName +
"actual: " + referencedAttributeBinding.getAttribute().getName()
);
}
this.referencedAttributeBinding = referencedAttributeBinding;
// buildForeignKey();
}
@Override
public AttributeBinding getReferencedAttributeBinding() {
if ( !isReferenceResolved() ) {
throw new IllegalStateException( "Referenced AttributeBiding has not been resolved." );
}
return referencedAttributeBinding;
}
@Override
public final EntityBinding getReferencedEntityBinding() {
return (EntityBinding) referencedAttributeBinding.getContainer();
}
// private void buildForeignKey() {
// // TODO: move this stuff to relational model
// ForeignKey foreignKey = getValue().getTable()
// .createForeignKey( referencedAttributeBinding.getValue().getTable(), foreignKeyName );
// Iterator<SimpleValue> referencingValueIterator = getSimpleValues().iterator();
// Iterator<SimpleValue> targetValueIterator = referencedAttributeBinding.getSimpleValues().iterator();
// while ( referencingValueIterator.hasNext() ) {
// if ( !targetValueIterator.hasNext() ) {
// // TODO: improve this message
// throw new MappingException(
// "number of values in many-to-one reference is greater than number of values in target"
// );
// }
// SimpleValue referencingValue = referencingValueIterator.next();
// SimpleValue targetValue = targetValueIterator.next();
// if ( Column.class.isInstance( referencingValue ) ) {
// if ( !Column.class.isInstance( targetValue ) ) {
// // TODO improve this message
// throw new MappingException( "referencing value is a column, but target is not a column" );
// }
// foreignKey.addColumnMapping( Column.class.cast( referencingValue ), Column.class.cast( targetValue ) );
// }
// else if ( Column.class.isInstance( targetValue ) ) {
// // TODO: improve this message
// throw new MappingException( "referencing value is not a column, but target is a column." );
// }
// }
// if ( targetValueIterator.hasNext() ) {
// throw new MappingException( "target value has more simple values than referencing value" );
// }
// }
//
// public void validate() {
// // can't check this until both the domain and relational states are initialized...
// if ( getCascadeTypes().contains( CascadeType.DELETE_ORPHAN ) ) {
// if ( !isLogicalOneToOne ) {
// throw new MappingException(
// "many-to-one attribute [" + locateAttribute().getName() + "] does not support orphan delete as it is not unique"
// );
// }
// }
// //TODO: validate that the entity reference is resolved
// }
}

View File

@ -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.binding;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* A meta attribute is a named value or values.
*
* @author Gavin King
*/
public class MetaAttribute implements Serializable {
private final String name;
private List<String> values = new ArrayList<String>();
public MetaAttribute(String name) {
this.name = name;
}
public String getName() {
return name;
}
public List<String> getValues() {
return Collections.unmodifiableList(values);
}
public void addValue(String value) {
values.add( value );
}
public String getValue() {
if ( values.size() != 1 ) {
throw new IllegalStateException( "no unique value" );
}
return values.get( 0 );
}
public boolean isMultiValued() {
return values.size()>1;
}
public String toString() {
return "[" + name + "=" + values + "]";
}
}

View File

@ -1,40 +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.binding;
/**
* @author Steve Ebersole
* @author Gail Badner
*/
public class OneToManyCollectionElement extends AbstractCollectionElement {
OneToManyCollectionElement(AbstractPluralAttributeBinding binding) {
super( binding );
}
@Override
public CollectionElementNature getCollectionElementNature() {
return CollectionElementNature.ONE_TO_MANY;
}
}

View File

@ -1,78 +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.binding;
import java.util.Comparator;
import org.hibernate.metamodel.domain.PluralAttribute;
import org.hibernate.metamodel.relational.TableSpecification;
import org.hibernate.persister.collection.CollectionPersister;
/**
* @author Steve Ebersole
*/
public interface PluralAttributeBinding extends AssociationAttributeBinding {
// todo : really it is the element (and/or index) that can be associative not the collection itself...
@Override
public PluralAttribute getAttribute();
public CollectionKey getCollectionKey();
public AbstractCollectionElement getCollectionElement();
public TableSpecification getCollectionTable();
public boolean isMutable();
public Caching getCaching();
public Class<? extends CollectionPersister> getCollectionPersisterClass();
public String getCustomLoaderName();
public CustomSQL getCustomSqlInsert();
public CustomSQL getCustomSqlUpdate();
public CustomSQL getCustomSqlDelete();
public CustomSQL getCustomSqlDeleteAll();
public boolean isOrphanDelete();
String getWhere();
boolean isSorted();
Comparator getComparator();
int getBatchSize();
java.util.Map getFilterMap();
boolean isInverse();
String getOrderBy();
}

View File

@ -1,50 +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.binding;
import java.util.Comparator;
import org.hibernate.metamodel.domain.PluralAttribute;
/**
* @author Steve Ebersole
*/
public class SetBinding extends AbstractPluralAttributeBinding {
private Comparator comparator;
protected SetBinding(
AttributeBindingContainer container,
PluralAttribute attribute,
CollectionElementNature collectionElementNature) {
super( container, attribute, collectionElementNature );
}
public Comparator getComparator() {
return comparator;
}
public void setComparator(Comparator comparator) {
this.comparator = comparator;
}
}

View File

@ -1,100 +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.binding;
import org.hibernate.metamodel.relational.Column;
import org.hibernate.metamodel.relational.DerivedValue;
import org.hibernate.metamodel.relational.SimpleValue;
/**
* @author Steve Ebersole
*/
public class SimpleValueBinding {
private SimpleValue simpleValue;
private boolean includeInInsert;
private boolean includeInUpdate;
public SimpleValueBinding() {
this( true, true );
}
public SimpleValueBinding(SimpleValue simpleValue) {
this();
setSimpleValue( simpleValue );
}
public SimpleValueBinding(SimpleValue simpleValue, boolean includeInInsert, boolean includeInUpdate) {
this( includeInInsert, includeInUpdate );
setSimpleValue( simpleValue );
}
public SimpleValueBinding(boolean includeInInsert, boolean includeInUpdate) {
this.includeInInsert = includeInInsert;
this.includeInUpdate = includeInUpdate;
}
public SimpleValue getSimpleValue() {
return simpleValue;
}
public void setSimpleValue(SimpleValue simpleValue) {
this.simpleValue = simpleValue;
if ( DerivedValue.class.isInstance( simpleValue ) ) {
includeInInsert = false;
includeInUpdate = false;
}
}
public boolean isDerived() {
return DerivedValue.class.isInstance( simpleValue );
}
public boolean isNullable() {
return isDerived() || Column.class.cast( simpleValue ).isNullable();
}
/**
* Is the value to be inserted as part of its binding here?
* <p/>
* <b>NOTE</b> that a column may be bound to multiple attributes. The purpose of this value is to track this
* notion of "insertability" for this particular binding.
*
* @return {@code true} indicates the value should be included; {@code false} indicates it should not
*/
public boolean isIncludeInInsert() {
return includeInInsert;
}
public void setIncludeInInsert(boolean includeInInsert) {
this.includeInInsert = includeInInsert;
}
public boolean isIncludeInUpdate() {
return includeInUpdate;
}
public void setIncludeInUpdate(boolean includeInUpdate) {
this.includeInUpdate = includeInUpdate;
}
}

View File

@ -1,65 +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.binding;
/**
* Contract describing the attribute binding for singular associations ({@code many-to-one}, {@code one-to-one}).
*
* @author Gail Badner
* @author Steve Ebersole
*/
@SuppressWarnings( {"JavaDoc", "UnusedDeclaration"})
public interface SingularAssociationAttributeBinding extends SingularAttributeBinding, AssociationAttributeBinding {
/**
* Is this association based on a property reference (non PK column(s) as target of FK)?
* <p/>
* Convenience form of checking {@link #getReferencedAttributeName()} for {@code null}.
*
* @return
*/
public boolean isPropertyReference();
/**
* Obtain the name of the referenced entity.
*
* @return The referenced entity name
*/
public String getReferencedEntityName();
/**
* Set the name of the
* @param referencedEntityName
*/
public void setReferencedEntityName(String referencedEntityName);
public String getReferencedAttributeName();
public void setReferencedAttributeName(String referencedAttributeName);
// "resolvable"
public void resolveReference(AttributeBinding attributeBinding);
public boolean isReferenceResolved();
public EntityBinding getReferencedEntityBinding();
public AttributeBinding getReferencedAttributeBinding();
}

View File

@ -1,81 +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.binding;
import org.hibernate.mapping.PropertyGeneration;
import org.hibernate.metamodel.relational.Value;
/**
* Specialized binding contract for singular (non-collection) attributes
*
* @author Steve Ebersole
*/
public interface SingularAttributeBinding extends AttributeBinding {
/**
* Obtain the value bound here. This could potentially be a {@link org.hibernate.metamodel.relational.Tuple}
* indicating multiple database values are bound, in which case access to the individual values can be achieved by
* either casting this return to {@link org.hibernate.metamodel.relational.Tuple} and using its
* {@link org.hibernate.metamodel.relational.Tuple#values()} method or using the {@link #getSimpleValueBindings()}
* method here and accessing each bindings {@link SimpleValueBinding#getSimpleValue simple value}
*
* @return The bound value
*/
public Value getValue();
/**
* Returns the number of {@link SimpleValueBinding} objects that will be returned by
* {@link #getSimpleValueBindings()}
*
* @return the number of {@link SimpleValueBinding simple value bindings}
*
* @see #getSimpleValueBindings()
*/
public int getSimpleValueSpan();
public Iterable<SimpleValueBinding> getSimpleValueBindings();
public void setSimpleValueBindings(Iterable<SimpleValueBinding> simpleValueBindings);
/**
* Convenience method to determine if any {@link SimpleValueBinding simple value bindings} are derived values
* (formula mappings).
*
* @return {@code true} indicates that the binding contains a derived value; {@code false} indicates it does not.
*/
public boolean hasDerivedValue();
/**
* Convenience method to determine if all {@link SimpleValueBinding simple value bindings} allow nulls.
*
* @return {@code true} indicates that all values allow {@code null}; {@code false} indicates one or more do not
*/
public boolean isNullable();
/**
* Obtain the generation strategy for this attribute/value.
*
* @return The generation strategy
*/
public PropertyGeneration getGeneration();
}

View File

@ -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.binding;
import java.io.Serializable;
import java.util.Collections;
import java.util.Map;
/**
* Represents the metamodel view of a typedef (type definition).
*
* @author John Verhaeg
*/
public class TypeDef implements Serializable {
private final String name;
private final String typeClass;
private final Map<String, String> parameters;
public TypeDef(String name, String typeClass, Map<String, String> parameters) {
this.name = name;
this.typeClass = typeClass;
this.parameters = parameters;
}
public String getName() {
return name;
}
public String getTypeClass() {
return typeClass;
}
public Map<String, String> getParameters() {
return Collections.unmodifiableMap(parameters);
}
}

View File

@ -1,308 +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.domain;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedHashSet;
import java.util.Set;
import org.hibernate.cfg.NotYetImplementedException;
import org.hibernate.internal.util.StringHelper;
import org.hibernate.internal.util.ValueHolder;
/**
* Convenient base class for {@link AttributeContainer}. Because in our model all
* {@link AttributeContainer AttributeContainers} are also {@link Hierarchical} we also implement that here
* as well.
*
* @author Steve Ebersole
*/
public abstract class AbstractAttributeContainer implements AttributeContainer, Hierarchical {
private final String name;
private final String className;
private final ValueHolder<Class<?>> classReference;
private final Hierarchical superType;
private LinkedHashSet<Attribute> attributeSet = new LinkedHashSet<Attribute>();
private HashMap<String, Attribute> attributeMap = new HashMap<String, Attribute>();
public AbstractAttributeContainer(String name, String className, ValueHolder<Class<?>> classReference, Hierarchical superType) {
this.name = name;
this.className = className;
this.classReference = classReference;
this.superType = superType;
}
@Override
public String getName() {
return name;
}
@Override
public String getClassName() {
return className;
}
@Override
public Class<?> getClassReference() {
return classReference.getValue();
}
@Override
public ValueHolder<Class<?>> getClassReferenceUnresolved() {
return classReference;
}
@Override
public Hierarchical getSuperType() {
return superType;
}
@Override
public Set<Attribute> attributes() {
return Collections.unmodifiableSet( attributeSet );
}
@Override
public String getRoleBaseName() {
return getClassName();
}
@Override
public Attribute locateAttribute(String name) {
return attributeMap.get( name );
}
@Override
public SingularAttribute locateSingularAttribute(String name) {
return (SingularAttribute) locateAttribute( name );
}
@Override
public SingularAttribute createSingularAttribute(String name) {
SingularAttribute attribute = new SingularAttributeImpl( name, this );
addAttribute( attribute );
return attribute;
}
@Override
public SingularAttribute createVirtualSingularAttribute(String name) {
throw new NotYetImplementedException();
}
@Override
public SingularAttribute locateComponentAttribute(String name) {
return (SingularAttributeImpl) locateAttribute( name );
}
@Override
public SingularAttribute createComponentAttribute(String name, Component component) {
SingularAttributeImpl attribute = new SingularAttributeImpl( name, this );
attribute.resolveType( component );
addAttribute( attribute );
return attribute;
}
@Override
public PluralAttribute locatePluralAttribute(String name) {
return (PluralAttribute) locateAttribute( name );
}
protected PluralAttribute createPluralAttribute(String name, PluralAttributeNature nature) {
PluralAttribute attribute = nature.isIndexed()
? new IndexedPluralAttributeImpl( name, nature, this )
: new PluralAttributeImpl( name, nature, this );
addAttribute( attribute );
return attribute;
}
@Override
public PluralAttribute locateBag(String name) {
return locatePluralAttribute( name );
}
@Override
public PluralAttribute createBag(String name) {
return createPluralAttribute( name, PluralAttributeNature.BAG );
}
@Override
public PluralAttribute locateSet(String name) {
return locatePluralAttribute( name );
}
@Override
public PluralAttribute createSet(String name) {
return createPluralAttribute( name, PluralAttributeNature.SET );
}
@Override
public IndexedPluralAttribute locateList(String name) {
return (IndexedPluralAttribute) locatePluralAttribute( name );
}
@Override
public IndexedPluralAttribute createList(String name) {
return (IndexedPluralAttribute) createPluralAttribute( name, PluralAttributeNature.LIST );
}
@Override
public IndexedPluralAttribute locateMap(String name) {
return (IndexedPluralAttribute) locatePluralAttribute( name );
}
@Override
public IndexedPluralAttribute createMap(String name) {
return (IndexedPluralAttribute) createPluralAttribute( name, PluralAttributeNature.MAP );
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder();
sb.append( "AbstractAttributeContainer" );
sb.append( "{name='" ).append( name ).append( '\'' );
sb.append( ", superType=" ).append( superType );
sb.append( '}' );
return sb.toString();
}
protected void addAttribute(Attribute attribute) {
// todo : how to best "secure" this?
if ( attributeMap.put( attribute.getName(), attribute ) != null ) {
throw new IllegalArgumentException( "Attribute with name [" + attribute.getName() + "] already registered" );
}
attributeSet.add( attribute );
}
// todo : inner classes for now..
public static class SingularAttributeImpl implements SingularAttribute {
private final AttributeContainer attributeContainer;
private final String name;
private Type type;
public SingularAttributeImpl(String name, AttributeContainer attributeContainer) {
this.name = name;
this.attributeContainer = attributeContainer;
}
public boolean isTypeResolved() {
return type != null;
}
public void resolveType(Type type) {
if ( type == null ) {
throw new IllegalArgumentException( "Attempt to resolve with null type" );
}
this.type = type;
}
@Override
public Type getSingularAttributeType() {
return type;
}
@Override
public String getName() {
return name;
}
@Override
public AttributeContainer getAttributeContainer() {
return attributeContainer;
}
@Override
public boolean isSingular() {
return true;
}
}
public static class PluralAttributeImpl implements PluralAttribute {
private final AttributeContainer attributeContainer;
private final PluralAttributeNature nature;
private final String name;
private Type elementType;
public PluralAttributeImpl(String name, PluralAttributeNature nature, AttributeContainer attributeContainer) {
this.name = name;
this.nature = nature;
this.attributeContainer = attributeContainer;
}
@Override
public AttributeContainer getAttributeContainer() {
return attributeContainer;
}
@Override
public boolean isSingular() {
return false;
}
@Override
public PluralAttributeNature getNature() {
return nature;
}
@Override
public String getName() {
return name;
}
@Override
public String getRole() {
return StringHelper.qualify( attributeContainer.getRoleBaseName(), name );
}
@Override
public Type getElementType() {
return elementType;
}
@Override
public void setElementType(Type elementType) {
this.elementType = elementType;
}
}
public static class IndexedPluralAttributeImpl extends PluralAttributeImpl implements IndexedPluralAttribute {
private Type indexType;
public IndexedPluralAttributeImpl(String name, PluralAttributeNature nature, AttributeContainer attributeContainer) {
super( name, nature, attributeContainer );
}
@Override
public Type getIndexType() {
return indexType;
}
@Override
public void setIndexType(Type indexType) {
this.indexType = indexType;
}
}
}

View File

@ -1,55 +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.domain;
/**
* Describes an attribute.
*
* @author Steve Ebersole
*/
public interface Attribute {
/**
* Retrieve the attribute name.
*
* @return The attribute name.
*/
public String getName();
/**
* Retrieve the declaring container for this attribute (entity/component).
*
* @return The attribute container.
*/
public AttributeContainer getAttributeContainer();
/**
* An attribute can be either:<ul>
* <li>singular - castable to {@link SingularAttribute}</li>
* <li>plural - castable to {@link PluralAttribute}
* </ul>
*
* @return True if attribute is singular; false if plural.
*/
public boolean isSingular();
}

View File

@ -1,82 +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.domain;
import java.util.Set;
/**
* Basic contract for any container holding attributes. This allows polymorphic handling of both
* components and entities in terms of the attributes they hold.
*
* @author Steve Ebersole
*/
public interface AttributeContainer extends Type {
/**
* Obtain the name of this container in terms of creating attribute role names.
* <p/>
* NOTE : A role uniquely names each attribute. The role name is the name of the attribute prefixed by the "path"
* to its container.
*
* @return The container base name for role construction.
*/
public String getRoleBaseName();
/**
* Retrieve an attribute by name.
*
* @param name The name of the attribute to retrieve.
*
* @return The attribute matching the given name, or null.
*/
public Attribute locateAttribute(String name);
/**
* Retrieve the attributes contained in this container.
*
* @return The contained attributes
*/
public Set<Attribute> attributes();
public SingularAttribute locateSingularAttribute(String name);
public SingularAttribute createSingularAttribute(String name);
public SingularAttribute createVirtualSingularAttribute(String name);
public SingularAttribute locateComponentAttribute(String name);
public SingularAttribute createComponentAttribute(String name, Component component);
public PluralAttribute locatePluralAttribute(String name);
public PluralAttribute locateBag(String name);
public PluralAttribute createBag(String name);
public PluralAttribute locateSet(String name);
public PluralAttribute createSet(String name);
public IndexedPluralAttribute locateList(String name);
public IndexedPluralAttribute createList(String name);
public IndexedPluralAttribute locateMap(String name);
public IndexedPluralAttribute createMap(String name);
}

View File

@ -1,71 +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.domain;
import org.hibernate.internal.util.ValueHolder;
/**
* Models a basic type.
*
* @author Steve Ebersole
*/
public class BasicType implements Type {
private final String name;
private final ValueHolder<Class<?>> classReference;
public BasicType(String name, ValueHolder<Class<?>> classReference) {
this.name = name;
this.classReference = classReference;
}
@Override
public String getName() {
return name;
}
@Override
public String getClassName() {
return name;
}
@Override
public Class<?> getClassReference() {
return classReference.getValue();
}
@Override
public ValueHolder<Class<?>> getClassReferenceUnresolved() {
return classReference;
}
@Override
public boolean isAssociation() {
return false;
}
@Override
public boolean isComponent() {
return false;
}
}

View File

@ -1,56 +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.domain;
import org.hibernate.internal.util.ValueHolder;
/**
* Models the notion of a component (what JPA calls an Embeddable).
* <p/>
* NOTE : Components are not currently really hierarchical. But that is a feature I want to add.
*
* @author Steve Ebersole
*/
public class Component extends AbstractAttributeContainer {
public Component(String name, String className, ValueHolder<Class<?>> classReference, Hierarchical superType) {
super( name, className, classReference, superType );
}
@Override
public boolean isAssociation() {
return false;
}
@Override
public boolean isComponent() {
return true;
}
@Override
public String getRoleBaseName() {
// todo : this is not really completely accurate atm
// the role base here should really be the role of the component attribute.
return getClassName();
}
}

View File

@ -1,56 +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.domain;
import org.hibernate.internal.util.ValueHolder;
/**
* Models the notion of an entity
*
* @author Steve Ebersole
* @author Hardy Ferentschik
*/
public class Entity extends AbstractAttributeContainer {
/**
* Constructor for the entity
*
* @param entityName The name of the entity
* @param className The name of this entity's java class
* @param classReference The reference to this entity's {@link Class}
* @param superType The super type for this entity. If there is not super type {@code null} needs to be passed.
*/
public Entity(String entityName, String className, ValueHolder<Class<?>> classReference, Hierarchical superType) {
super( entityName, className, classReference, superType );
}
@Override
public boolean isAssociation() {
return true;
}
@Override
public boolean isComponent() {
return false;
}
}

View File

@ -1,39 +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.domain;
/**
* Additional contract for things that can occur in an inheritance hierarchy (specifically ones we would
* need to traverse).
*
* @author Steve Ebersole
*/
public interface Hierarchical extends AttributeContainer {
/**
* Retrieve the super type.
*
* @return The super type, or null if no super type.
*/
public Hierarchical getSuperType();
}

View File

@ -1,34 +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.domain;
/**
* TODO : javadoc
*
* @author Steve Ebersole
*/
public interface IndexedPluralAttribute extends PluralAttribute {
public Type getIndexType();
public void setIndexType(Type indexType);
}

View File

@ -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.domain;
import org.hibernate.boot.registry.classloading.spi.ClassLoaderService;
import org.hibernate.internal.util.ValueHolder;
/**
* Models the naming of a Java type where we may not have access to that type's {@link Class} reference. Generally
* speaking this is the case in various hibernate-tools and reverse-engineering use cases.
*
* @author Steve Ebersole
*/
public class JavaType {
private final String name;
private final ValueHolder<Class<?>> classReference;
public JavaType(final String name, final ClassLoaderService classLoaderService) {
this.name = name;
this.classReference = new ValueHolder<Class<?>>(
new ValueHolder.DeferredInitializer<Class<?>>() {
@Override
public Class<?> initialize() {
return classLoaderService.classForName( name );
}
}
);
}
public JavaType(Class<?> theClass) {
this.name = theClass.getName();
this.classReference = new ValueHolder<Class<?>>( theClass );
}
public String getName() {
return name;
}
public Class<?> getClassReference() {
return classReference.getValue();
}
@Override
public String toString() {
return new StringBuilder( super.toString() )
.append( "[name=" ).append( name ).append( "]" )
.toString();
}
}

View File

@ -1,55 +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.domain;
import org.hibernate.internal.util.ValueHolder;
/**
* Models the concept class in the hierarchy with no persistent attributes.
*
* @author Hardy Ferentschik
*/
public class NonEntity extends AbstractAttributeContainer {
/**
* Constructor for the non-entity
*
* @param entityName The name of the non-entity
* @param className The name of this non-entity's java class
* @param classReference The reference to this non-entity's {@link Class}
* @param superType The super type for this non-entity. If there is not super type {@code null} needs to be passed.
*/
public NonEntity(String entityName, String className, ValueHolder<Class<?>> classReference, Hierarchical superType) {
super( entityName, className, classReference, superType );
}
@Override
public boolean isAssociation() {
return true;
}
@Override
public boolean isComponent() {
return false;
}
}

View File

@ -1,36 +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.domain;
/**
* TODO : javadoc
*
* @author Steve Ebersole
*/
public interface PluralAttribute extends Attribute {
public String getRole();
public PluralAttributeNature getNature();
public Type getElementType();
public void setElementType(Type elementType);
}

View File

@ -1,64 +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.domain;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* Identifies the specific semantic of a plural valued attribute.
*
* @author Steve Ebersole
*/
public enum PluralAttributeNature {
BAG( "bag", Collection.class ),
IDBAG( "idbag", Collection.class ),
SET( "set", Set.class ),
LIST( "list", List.class ),
MAP( "map", Map.class );
private final String name;
private final Class javaContract;
private final boolean indexed;
PluralAttributeNature(String name, Class javaContract) {
this.name = name;
this.javaContract = javaContract;
this.indexed = Map.class.isAssignableFrom( javaContract ) || List.class.isAssignableFrom( javaContract );
}
public String getName() {
return name;
}
public Class getJavaContract() {
return javaContract;
}
public boolean isIndexed() {
return indexed;
}
}

View File

@ -1,42 +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.domain;
/**
* A single valued (non-collection) attribute
*
* @author Steve Ebersole
*/
public interface SingularAttribute extends Attribute {
/**
* Retrieve the attribute type descriptor.
*
* @return THe attribute type.
*/
public Type getSingularAttributeType();
public boolean isTypeResolved();
public void resolveType(Type type);
}

View File

@ -1,55 +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.domain;
import org.hibernate.internal.util.ValueHolder;
/**
* Models the concept of a (intermediate) superclass
*
* @author Steve Ebersole
*/
public class Superclass extends AbstractAttributeContainer {
/**
* Constructor for the entity
*
* @param entityName The name of the entity
* @param className The name of this entity's java class
* @param classReference The reference to this entity's {@link Class}
* @param superType The super type for this entity. If there is not super type {@code null} needs to be passed.
*/
public Superclass(String entityName, String className, ValueHolder<Class<?>> classReference, Hierarchical superType) {
super( entityName, className, classReference, superType );
}
@Override
public boolean isAssociation() {
return true;
}
@Override
public boolean isComponent() {
return false;
}
}

View File

@ -1,64 +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.domain;
import org.hibernate.internal.util.ValueHolder;
/**
* Basic information about a Java type, in regards to its role in particular set of mappings.
*
* @author Steve Ebersole
*/
public interface Type {
/**
* Obtain the name of the type.
*
* @return The name
*/
public String getName();
/**
* Obtain the java class name for this type.
*
* @return The class name
*/
public String getClassName();
/**
* Obtain the java {@link Class} reference for this type
*
* @return The {@link Class} reference
*
* @throws org.hibernate.boot.registry.classloading.spi.ClassLoadingException Indicates the class reference
* could not be determined. Generally this is the case in reverse-engineering scenarios where the specified
* domain model classes do not yet exist.
*/
public Class<?> getClassReference();
public ValueHolder<Class<?>> getClassReferenceUnresolved();
public boolean isAssociation();
public boolean isComponent();
}

View File

@ -1,51 +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.domain;
/**
* Describes the type of a type :/
*
* @author Steve Ebersole
*/
public enum TypeNature {
BASIC( "basic" ),
COMPONENT( "component" ),
ENTITY( "entity" ),
SUPERCLASS( "superclass" ),
NON_ENTITY( "non-entity" );
private final String name;
private TypeNature(String name) {
this.name = name;
}
public String getName() {
return name;
}
public String toString() {
return super.toString() + "[" + getName() + "]";
}
}

View File

@ -1,34 +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
-->
<html>
<body>
<p>
This package defines metadata modeling of a logical domain model. Specifically note that
this package does not in any way attempt to encapsulate data modeling information such
cardinality or associations. Also note that the top-level logical model is represetation (entity-mode)
agnostic.
</p>
</body>
</html>

View File

@ -1,36 +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
-->
<html>
<head></head>
<body>
<p>
<i>NOTE: This package is currently unfinished and therefore considered experimental and unsupported.</i>
</p>
<p>
This package defines the new Hibernate metamodel as well as the code used to build that metamodel from user sources
(HBM mapping files, annotations, etc).
</p>
</body>
</html>

View File

@ -1,76 +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.relational;
import java.util.HashSet;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.atomic.AtomicInteger;
import org.hibernate.dialect.Dialect;
/**
* Convenience base class for {@link org.hibernate.mapping.AuxiliaryDatabaseObject}s.
* <p/>
* This implementation performs dialect scoping checks strictly based on
* dialect name comparisons. Custom implementations might want to do
* instanceof-type checks.
*
* @author Steve Ebersole
*/
public abstract class AbstractAuxiliaryDatabaseObject implements AuxiliaryDatabaseObject {
// Use a UUID in identifier prefix because this object is not qualified by a schema/catalog
// (not sure this matters...)
private static final String EXPORT_IDENTIFIER_PREFIX = "auxiliary-object-" + UUID.randomUUID();
private static final AtomicInteger counter = new AtomicInteger( 0 );
private final String exportIdentifier;
private final Set<String> dialectScopes;
protected AbstractAuxiliaryDatabaseObject(Set<String> dialectScopes) {
this.dialectScopes = dialectScopes == null ? new HashSet<String>() : dialectScopes;
this.exportIdentifier =
new StringBuilder( EXPORT_IDENTIFIER_PREFIX )
.append( '.' )
.append( counter.getAndIncrement() )
.toString();
}
public void addDialectScope(String dialectName) {
dialectScopes.add( dialectName );
}
public Iterable<String> getDialectScopes() {
return dialectScopes;
}
public boolean appliesToDialect(Dialect dialect) {
// empty means no scoping
return dialectScopes.isEmpty() || dialectScopes.contains( dialect.getClass().getName() );
}
@Override
public String getExportIdentifier() {
return exportIdentifier;
}
}

View File

@ -1,122 +0,0 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* Copyright (c) 2010 by Red Hat Inc and/or its affiliates or by
* third-party contributors as indicated by either @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.relational;
import java.util.ArrayList;
import java.util.List;
import org.hibernate.AssertionFailure;
import org.hibernate.dialect.Dialect;
/**
* Support for writing {@link Constraint} implementations
*
* @todo do we need to support defining these on particular schemas/catalogs?
*
* @author Steve Ebersole
* @author Gail Badner
*/
public abstract class AbstractConstraint implements Constraint {
private final TableSpecification table;
private final String name;
private List<Column> columns = new ArrayList<Column>();
protected AbstractConstraint(TableSpecification table, String name) {
this.table = table;
this.name = name;
}
public TableSpecification getTable() {
return table;
}
public String getName() {
return name;
}
public Iterable<Column> getColumns() {
return columns;
}
protected int getColumnSpan() {
return columns.size();
}
protected List<Column> internalColumnAccess() {
return columns;
}
public void addColumn(Column column) {
internalAddColumn( column );
}
protected void internalAddColumn(Column column) {
if ( column.getTable() != getTable() ) {
throw new AssertionFailure(
String.format(
"Unable to add column to constraint; tables [%s, %s] did not match",
column.getTable().toLoggableString(),
getTable().toLoggableString()
)
);
}
columns.add( column );
}
protected boolean isCreationVetoed(Dialect dialect) {
return false;
}
protected abstract String sqlConstraintStringInAlterTable(Dialect dialect);
public String[] sqlDropStrings(Dialect dialect) {
if ( isCreationVetoed( dialect ) ) {
return null;
}
else {
return new String[] {
new StringBuilder()
.append( "alter table " )
.append( getTable().getQualifiedName( dialect ) )
.append( " drop constraint " )
.append( dialect.quote( getName() ) )
.toString()
};
}
}
public String[] sqlCreateStrings(Dialect dialect) {
if ( isCreationVetoed( dialect ) ) {
return null;
}
else {
return new String[] {
new StringBuilder( "alter table " )
.append( getTable().getQualifiedName( dialect ) )
.append( sqlConstraintStringInAlterTable( dialect ) )
.toString()
};
}
}
}

View File

@ -1,79 +0,0 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* Copyright (c) 2010 by Red Hat Inc and/or its affiliates or by
* third-party contributors as indicated by either @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.relational;
import org.hibernate.internal.CoreMessageLogger;
import org.hibernate.metamodel.ValidationException;
import org.jboss.logging.Logger;
/**
* Basic support for {@link SimpleValue} implementations.
*
* @author Steve Ebersole
*/
public abstract class AbstractSimpleValue implements SimpleValue {
private static final CoreMessageLogger LOG = Logger.getMessageLogger(CoreMessageLogger.class, AbstractSimpleValue.class.getName());
private final TableSpecification table;
private final int position;
private Datatype datatype;
protected AbstractSimpleValue(TableSpecification table, int position) {
this.table = table;
this.position = position;
}
@Override
public TableSpecification getTable() {
return table;
}
public int getPosition() {
return position;
}
@Override
public Datatype getDatatype() {
return datatype;
}
@Override
public void setDatatype(Datatype datatype) {
LOG.debugf( "setting datatype for column %s : %s", toLoggableString(), datatype );
if ( this.datatype != null && ! this.datatype.equals( datatype ) ) {
LOG.debugf( "overriding previous datatype : %s", this.datatype );
}
this.datatype = datatype;
}
@Override
public void validateJdbcTypes(JdbcCodes typeCodes) {
// todo : better compatibility testing...
if ( datatype.getTypeCode() != typeCodes.nextJdbcCde() ) {
throw new ValidationException( "Mismatched types" );
}
}
}

View File

@ -1,101 +0,0 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* Copyright (c) 2010 by Red Hat Inc and/or its affiliates or by
* third-party contributors as indicated by either @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.relational;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
/**
* Convenience base class for implementing the {@link ValueContainer} contract centralizing commonality
* between modeling tables, views and inline views.
*
* @author Steve Ebersole
*/
public abstract class AbstractTableSpecification implements TableSpecification {
private final static AtomicInteger tableCounter = new AtomicInteger( 0 );
private final int tableNumber;
private final LinkedHashMap<String, SimpleValue> values = new LinkedHashMap<String, SimpleValue>();
private final PrimaryKey primaryKey = new PrimaryKey( this );
private final List<ForeignKey> foreignKeys = new ArrayList<ForeignKey>();
public AbstractTableSpecification() {
this.tableNumber = tableCounter.getAndIncrement();
}
@Override
public int getTableNumber() {
return tableNumber;
}
@Override
public Iterable<SimpleValue> values() {
return values.values();
}
@Override
public Column locateOrCreateColumn(String name) {
if(values.containsKey( name )){
return (Column) values.get( name );
}
final Column column = new Column( this, values.size(), name );
values.put( name, column );
return column;
}
@Override
public DerivedValue locateOrCreateDerivedValue(String fragment) {
if(values.containsKey( fragment )){
return (DerivedValue) values.get( fragment );
}
final DerivedValue value = new DerivedValue( this, values.size(), fragment );
values.put( fragment, value );
return value;
}
@Override
public Tuple createTuple(String name) {
return new Tuple( this, name );
}
@Override
public Iterable<ForeignKey> getForeignKeys() {
return foreignKeys;
}
@Override
public ForeignKey createForeignKey(TableSpecification targetTable, String name) {
ForeignKey fk = new ForeignKey( this, targetTable, name );
foreignKeys.add( fk );
return fk;
}
@Override
public PrimaryKey getPrimaryKey() {
return primaryKey;
}
}

View File

@ -1,45 +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.relational;
import java.io.Serializable;
import org.hibernate.dialect.Dialect;
/**
* Auxiliary database objects (i.e., triggers, stored procedures, etc) defined
* in the mappings. Allows Hibernate to manage their lifecycle as part of
* creating/dropping the schema.
*
* @author Steve Ebersole
*/
public interface AuxiliaryDatabaseObject extends Exportable, Serializable {
/**
* Does this database object apply to the given dialect?
*
* @param dialect The dialect to check against.
* @return True if this database object does apply to the given dialect.
*/
boolean appliesToDialect(Dialect dialect);
}

View File

@ -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.relational;
import java.util.Set;
import org.hibernate.dialect.Dialect;
import org.hibernate.internal.util.StringHelper;
/**
* @author Steve Ebersole
* @author Gail Badner
*/
public class BasicAuxiliaryDatabaseObjectImpl extends AbstractAuxiliaryDatabaseObject {
private static final String CATALOG_NAME_PLACEHOLDER = "${catalog}";
private static final String SCHEMA_NAME_PLACEHOLDER = "${schema}";
private final Schema defaultSchema;
private final String createString;
private final String dropString;
public BasicAuxiliaryDatabaseObjectImpl(
Schema defaultSchema,
String createString,
String dropString,
Set<String> dialectScopes) {
super( dialectScopes );
// keep track of the default schema and the raw create/drop strings;
// we may want to allow copying into a database with a different default schema in the future;
this.defaultSchema = defaultSchema;
this.createString = createString;
this.dropString = dropString;
}
@Override
public String[] sqlCreateStrings(Dialect dialect) {
return new String[] { injectCatalogAndSchema( createString, defaultSchema ) };
}
@Override
public String[] sqlDropStrings(Dialect dialect) {
return new String[] { injectCatalogAndSchema( dropString, defaultSchema ) };
}
private static String injectCatalogAndSchema(String ddlString, Schema schema) {
String rtn = StringHelper.replace( ddlString, CATALOG_NAME_PLACEHOLDER, schema.getName().getCatalog().getName() );
rtn = StringHelper.replace( rtn, SCHEMA_NAME_PLACEHOLDER, schema.getName().getSchema().getName() );
return rtn;
}
}

View File

@ -1,71 +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.relational;
/**
* TODO : javadoc
*
* @author Steve Ebersole
*/
public class CheckConstraint {
private final Table table;
private String name;
private String condition;
public CheckConstraint(Table table) {
this.table = table;
}
public CheckConstraint(Table table, String name, String condition) {
this.table = table;
this.name = name;
this.condition = condition;
}
public String getCondition() {
return condition;
}
public void setCondition(String condition) {
this.condition = condition;
}
/**
* Obtain the table to which this constraint applies.
*
* @return The constrained table.
*/
public Table getTable() {
return table;
}
/**
* Obtain the constraint name.
*
* @return the name.
*/
public String getName() {
return name;
}
}

View File

@ -1,195 +0,0 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* Copyright (c) 2010 by Red Hat Inc and/or its affiliates or by
* third-party contributors as indicated by either @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.relational;
import org.hibernate.MappingException;
import org.hibernate.dialect.Dialect;
import org.hibernate.internal.util.StringHelper;
import org.hibernate.metamodel.relational.state.ColumnRelationalState;
/**
* Models a physical column
*
* @author Gavin King
* @author Steve Ebersole
*/
public class Column extends AbstractSimpleValue {
private final Identifier columnName;
private boolean nullable;
private boolean unique;
private String defaultValue;
private String checkCondition;
private String sqlType;
private String readFragment;
private String writeFragment;
private String comment;
private Size size = new Size();
protected Column(TableSpecification table, int position, String name) {
this( table, position, Identifier.toIdentifier( name ) );
}
protected Column(TableSpecification table, int position, Identifier name) {
super( table, position );
this.columnName = name;
}
public void initialize(ColumnRelationalState state, boolean forceNonNullable, boolean forceUnique) {
size.initialize( state.getSize() );
nullable = ! forceNonNullable && state.isNullable();
unique = ! forceUnique && state.isUnique();
checkCondition = state.getCheckCondition();
defaultValue = state.getDefault();
sqlType = state.getSqlType();
// TODO: this should go into binding instead (I think???)
writeFragment = state.getCustomWriteFragment();
readFragment = state.getCustomReadFragment();
comment = state.getComment();
for ( String uniqueKey : state.getUniqueKeys() ) {
getTable().getOrCreateUniqueKey( uniqueKey ).addColumn( this );
}
for ( String index : state.getIndexes() ) {
getTable().getOrCreateIndex( index ).addColumn( this );
}
}
public Identifier getColumnName() {
return columnName;
}
public boolean isNullable() {
return nullable;
}
public void setNullable(boolean nullable) {
this.nullable = nullable;
}
public boolean isUnique() {
return unique;
}
public void setUnique(boolean unique) {
this.unique = unique;
}
public String getDefaultValue() {
return defaultValue;
}
public void setDefaultValue(String defaultValue) {
this.defaultValue = defaultValue;
}
public String getCheckCondition() {
return checkCondition;
}
public void setCheckCondition(String checkCondition) {
this.checkCondition = checkCondition;
}
public String getSqlType() {
return sqlType;
}
public void setSqlType(String sqlType) {
this.sqlType = sqlType;
}
public String getReadFragment() {
return readFragment;
}
public void setReadFragment(String readFragment) {
this.readFragment = readFragment;
}
public String getWriteFragment() {
return writeFragment;
}
public void setWriteFragment(String writeFragment) {
this.writeFragment = writeFragment;
}
public String getComment() {
return comment;
}
public void setComment(String comment) {
this.comment = comment;
}
public Size getSize() {
return size;
}
public void setSize(Size size) {
this.size = size;
}
@Override
public String toLoggableString() {
return getTable().getLoggableValueQualifier() + '.' + getColumnName();
}
@Override
public String getAlias(Dialect dialect) {
String alias = columnName.getName();
int lastLetter = StringHelper.lastIndexOfLetter( columnName.getName() );
if ( lastLetter == -1 ) {
alias = "column";
}
boolean useRawName =
columnName.getName().equals( alias ) &&
alias.length() <= dialect.getMaxAliasLength() &&
! columnName.isQuoted() &&
! columnName.getName().toLowerCase().equals( "rowid" );
if ( ! useRawName ) {
String unique =
new StringBuilder()
.append( getPosition() )
.append( '_' )
.append( getTable().getTableNumber() )
.append( '_' )
.toString();
if ( unique.length() >= dialect.getMaxAliasLength() ) {
throw new MappingException(
"Unique suffix [" + unique + "] length must be less than maximum [" + dialect.getMaxAliasLength() + "]"
);
}
if ( alias.length() + unique.length() > dialect.getMaxAliasLength()) {
alias = alias.substring( 0, dialect.getMaxAliasLength() - unique.length() );
}
alias = alias + unique;
}
return alias;
}
}

View File

@ -1,56 +0,0 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* Copyright (c) 2010 by Red Hat Inc and/or its affiliates or by
* third-party contributors as indicated by either @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.relational;
/**
* Basic contract for the types of constraints we fully support as metadata constructs:<ul>
* <li>primary key</li>
* <li>foreign key</li>
* <li>unique constraint</li>
* </ul>
*
* @author Steve Ebersole
*/
public interface Constraint extends Exportable {
/**
* Obtain the table to which this constraint applies.
*
* @return The constrained table.
*/
public TableSpecification getTable();
/**
* Obtain the constraint name.
*
* @return the name.
*/
public String getName();
/**
* Obtain the columns that are part of this constraint.
*
* @return The constrained columns.
*/
public Iterable<Column> getColumns();
}

View File

@ -1,224 +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.relational;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.hibernate.MappingException;
import org.hibernate.dialect.Dialect;
import org.hibernate.internal.util.StringHelper;
import org.hibernate.internal.util.collections.ArrayHelper;
import org.hibernate.metamodel.Metadata;
/**
* Represents a database and manages the named schema/catalog pairs defined within.
*
* @author Steve Ebersole
* @author Gail Badner
*/
public class Database {
private final Schema.Name implicitSchemaName;
private final Map<Schema.Name,Schema> schemaMap = new HashMap<Schema.Name, Schema>();
private final List<AuxiliaryDatabaseObject> auxiliaryDatabaseObjects = new ArrayList<AuxiliaryDatabaseObject>();
public Database(Metadata.Options options) {
String schemaName = options.getDefaultSchemaName();
String catalogName = options.getDefaultCatalogName();
if ( options.isGloballyQuotedIdentifiers() ) {
schemaName = StringHelper.quote( schemaName );
catalogName = StringHelper.quote( catalogName );
}
implicitSchemaName = new Schema.Name( schemaName, catalogName );
makeSchema( implicitSchemaName );
}
public Schema getDefaultSchema() {
return schemaMap.get( implicitSchemaName );
}
public Schema locateSchema(Schema.Name name) {
if ( name.getSchema() == null && name.getCatalog() == null ) {
return getDefaultSchema();
}
Schema schema = schemaMap.get( name );
if ( schema == null ) {
schema = makeSchema( name );
}
return schema;
}
private Schema makeSchema(Schema.Name name) {
Schema schema;
schema = new Schema( name );
schemaMap.put( name, schema );
return schema;
}
public Schema getSchema(Identifier schema, Identifier catalog) {
return locateSchema( new Schema.Name( schema, catalog ) );
}
public Schema getSchema(String schema, String catalog) {
return locateSchema( new Schema.Name( Identifier.toIdentifier( schema ), Identifier.toIdentifier( catalog ) ) );
}
public void addAuxiliaryDatabaseObject(AuxiliaryDatabaseObject auxiliaryDatabaseObject) {
if ( auxiliaryDatabaseObject == null ) {
throw new IllegalArgumentException( "Auxiliary database object is null." );
}
auxiliaryDatabaseObjects.add( auxiliaryDatabaseObject );
}
public Iterable<AuxiliaryDatabaseObject> getAuxiliaryDatabaseObjects() {
return auxiliaryDatabaseObjects;
}
public String[] generateSchemaCreationScript(Dialect dialect) {
Set<String> exportIdentifiers = new HashSet<String>( 50 );
List<String> script = new ArrayList<String>( 50 );
for ( Schema schema : schemaMap.values() ) {
// TODO: create schema/catalog???
for ( Table table : schema.getTables() ) {
addSqlCreateStrings( dialect, exportIdentifiers, script, table );
}
}
for ( Schema schema : schemaMap.values() ) {
for ( Table table : schema.getTables() ) {
for ( UniqueKey uniqueKey : table.getUniqueKeys() ) {
addSqlCreateStrings( dialect, exportIdentifiers, script, uniqueKey );
}
for ( Index index : table.getIndexes() ) {
addSqlCreateStrings( dialect, exportIdentifiers, script, index );
}
if ( dialect.hasAlterTable() ) {
for ( ForeignKey foreignKey : table.getForeignKeys() ) {
// only add the foreign key if its target is a physical table
if ( Table.class.isInstance( foreignKey.getTargetTable() ) ) {
addSqlCreateStrings( dialect, exportIdentifiers, script, foreignKey );
}
}
}
}
}
// TODO: add sql create strings from PersistentIdentifierGenerator.sqlCreateStrings()
for ( AuxiliaryDatabaseObject auxiliaryDatabaseObject : auxiliaryDatabaseObjects ) {
if ( auxiliaryDatabaseObject.appliesToDialect( dialect ) ) {
addSqlCreateStrings( dialect, exportIdentifiers, script, auxiliaryDatabaseObject );
}
}
return ArrayHelper.toStringArray( script );
}
public String[] generateDropSchemaScript(Dialect dialect) {
Set<String> exportIdentifiers = new HashSet<String>( 50 );
List<String> script = new ArrayList<String>( 50 );
// drop them in reverse order in case db needs it done that way...
for ( int i = auxiliaryDatabaseObjects.size() - 1 ; i >= 0 ; i-- ) {
AuxiliaryDatabaseObject object = auxiliaryDatabaseObjects.get( i );
if ( object.appliesToDialect( dialect ) ) {
addSqlDropStrings( dialect, exportIdentifiers, script, object );
}
}
if ( dialect.dropConstraints() ) {
for ( Schema schema : schemaMap.values() ) {
for ( Table table : schema.getTables() ) {
for ( ForeignKey foreignKey : table.getForeignKeys() ) {
// only include foreign key if the target table is physical
if ( foreignKey.getTargetTable() instanceof Table ) {
addSqlDropStrings( dialect, exportIdentifiers, script, foreignKey );
}
}
}
}
}
for ( Schema schema : schemaMap.values() ) {
for ( Table table : schema.getTables() ) {
addSqlDropStrings( dialect, exportIdentifiers, script, table );
}
}
// TODO: add sql drop strings from PersistentIdentifierGenerator.sqlCreateStrings()
// TODO: drop schemas/catalogs???
return ArrayHelper.toStringArray( script );
}
private static void addSqlDropStrings(
Dialect dialect,
Set<String> exportIdentifiers,
List<String> script,
Exportable exportable) {
addSqlStrings(
exportIdentifiers, script, exportable.getExportIdentifier(), exportable.sqlDropStrings( dialect )
);
}
private static void addSqlCreateStrings(
Dialect dialect,
Set<String> exportIdentifiers,
List<String> script,
Exportable exportable) {
addSqlStrings(
exportIdentifiers, script, exportable.getExportIdentifier(), exportable.sqlCreateStrings( dialect )
);
}
private static void addSqlStrings(
Set<String> exportIdentifiers,
List<String> script,
String exportIdentifier,
String[] sqlStrings) {
if ( sqlStrings == null ) {
return;
}
if ( exportIdentifiers.contains( exportIdentifier ) ) {
throw new MappingException(
"SQL strings added more than once for: " + exportIdentifier
);
}
exportIdentifiers.add( exportIdentifier );
script.addAll( Arrays.asList( sqlStrings ) );
}
}

View File

@ -1,95 +0,0 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* Copyright (c) 2010 by Red Hat Inc and/or its affiliates or by
* third-party contributors as indicated by either @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.relational;
/**
* Models a JDBC {@link java.sql.Types DATATYPE}
*
* @todo Do we somehow link this in with {@link org.hibernate.internal.util.jdbc.TypeInfo} ?
*
* @author Steve Ebersole
*/
public class Datatype {
private final int typeCode;
private final String typeName;
private final Class javaType;
private final int hashCode;
public Datatype(int typeCode, String typeName, Class javaType) {
this.typeCode = typeCode;
this.typeName = typeName;
this.javaType = javaType;
this.hashCode = generateHashCode();
}
private int generateHashCode() {
int result = typeCode;
if ( typeName != null ) {
result = 31 * result + typeName.hashCode();
}
if ( javaType != null ) {
result = 31 * result + javaType.hashCode();
}
return result;
}
public int getTypeCode() {
return typeCode;
}
public String getTypeName() {
return typeName;
}
public Class getJavaType() {
return javaType;
}
@Override
public boolean equals(Object o) {
if ( this == o ) {
return true;
}
if ( o == null || getClass() != o.getClass() ) {
return false;
}
Datatype datatype = (Datatype) o;
return typeCode == datatype.typeCode
&& javaType.equals( datatype.javaType )
&& typeName.equals( datatype.typeName );
}
@Override
public int hashCode() {
return hashCode;
}
@Override
public String toString() {
return super.toString() + "[code=" + typeCode + ", name=" + typeName + ", javaClass=" + javaType.getName() + "]";
}
}

View File

@ -1,58 +0,0 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* Copyright (c) 2010 by Red Hat Inc and/or its affiliates or by
* third-party contributors as indicated by either @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.relational;
import org.hibernate.dialect.Dialect;
/**
* Models a value expression. It is the result of a <tt>formula</tt> mapping.
*
* @author Steve Ebersole
*/
public class DerivedValue extends AbstractSimpleValue {
private final String expression;
public DerivedValue(TableSpecification table, int position, String expression) {
super( table, position );
this.expression = expression;
}
@Override
public String toLoggableString() {
return getTable().toLoggableString() + ".{derived-column}";
}
@Override
public String getAlias(Dialect dialect) {
return "formula" + Integer.toString( getPosition() ) + '_';
}
/**
* Get the value expression.
* @return the value expression
*/
public String getExpression() {
return expression;
}
}

View File

@ -1,59 +0,0 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* Copyright (c) 2010 by Red Hat Inc and/or its affiliates or by
* third-party contributors as indicated by either @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.relational;
import org.hibernate.dialect.Dialect;
/**
* Contract for entities (in the ERD sense) which can be exported via {@code CREATE}, {@code ALTER}, etc
*
* @author Steve Ebersole
*/
public interface Exportable {
/**
* Get a unique identifier to make sure we are not exporting the same database structure multiple times.
*
* @return The exporting identifier.
*/
public String getExportIdentifier();
/**
* Gets the SQL strings for creating the database object.
*
* @param dialect The dialect for which to generate the SQL creation strings
*
* @return the SQL strings for creating the database object.
*/
public String[] sqlCreateStrings(Dialect dialect);
/**
* Gets the SQL strings for dropping the database object.
*
* @param dialect The dialect for which to generate the SQL drop strings
*
* @return the SQL strings for dropping the database object.
*/
public String[] sqlDropStrings(Dialect dialect);
}

View File

@ -1,216 +0,0 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* Copyright (c) 2010 by Red Hat Inc and/or its affiliates or by
* third-party contributors as indicated by either @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.relational;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.hibernate.AssertionFailure;
import org.hibernate.MappingException;
import org.hibernate.dialect.Dialect;
import org.jboss.logging.Logger;
/**
* Models the notion of a foreign key.
* <p/>
* Note that this need not mean a physical foreign key; we just mean a relationship between 2 table
* specifications.
*
* @author Gavin King
* @author Steve Ebersole
*/
public class ForeignKey extends AbstractConstraint implements Constraint, Exportable {
private static final Logger LOG = Logger.getLogger( ForeignKey.class );
private static final String ON_DELETE = " on delete ";
private static final String ON_UPDATE = " on update ";
private final TableSpecification targetTable;
private List<Column> targetColumns;
private ReferentialAction deleteRule = ReferentialAction.NO_ACTION;
private ReferentialAction updateRule = ReferentialAction.NO_ACTION;
protected ForeignKey(TableSpecification sourceTable, TableSpecification targetTable, String name) {
super( sourceTable, name );
this.targetTable = targetTable;
}
protected ForeignKey(TableSpecification sourceTable, TableSpecification targetTable) {
this( sourceTable, targetTable, null );
}
public TableSpecification getSourceTable() {
return getTable();
}
public TableSpecification getTargetTable() {
return targetTable;
}
public Iterable<Column> getSourceColumns() {
return getColumns();
}
public Iterable<Column> getTargetColumns() {
return targetColumns == null
? getTargetTable().getPrimaryKey().getColumns()
: targetColumns;
}
@Override
public void addColumn(Column column) {
addColumnMapping( column, null );
}
public void addColumnMapping(Column sourceColumn, Column targetColumn) {
if ( targetColumn == null ) {
if ( targetColumns != null ) {
LOG.debugf(
"Attempt to map column [%s] to no target column after explicit target column(s) named for FK [name=%s]",
sourceColumn.toLoggableString(),
getName()
);
}
}
else {
checkTargetTable( targetColumn );
if ( targetColumns == null ) {
if (!internalColumnAccess().isEmpty()) {
LOG.debugf(
"Value mapping mismatch as part of FK [table=%s, name=%s] while adding source column [%s]",
getTable().toLoggableString(),
getName(),
sourceColumn.toLoggableString()
);
}
targetColumns = new ArrayList<Column>();
}
targetColumns.add( targetColumn );
}
internalAddColumn( sourceColumn );
}
private void checkTargetTable(Column targetColumn) {
if ( targetColumn.getTable() != getTargetTable() ) {
throw new AssertionFailure(
String.format(
"Unable to add column to constraint; tables [%s, %s] did not match",
targetColumn.getTable().toLoggableString(),
getTargetTable().toLoggableString()
)
);
}
}
@Override
public String getExportIdentifier() {
return getSourceTable().getLoggableValueQualifier() + ".FK-" + getName();
}
public ReferentialAction getDeleteRule() {
return deleteRule;
}
public void setDeleteRule(ReferentialAction deleteRule) {
this.deleteRule = deleteRule;
}
public ReferentialAction getUpdateRule() {
return updateRule;
}
public void setUpdateRule(ReferentialAction updateRule) {
this.updateRule = updateRule;
}
@Override
public String[] sqlDropStrings(Dialect dialect) {
return new String[] {
"alter table " +
getTable().getQualifiedName( dialect ) +
dialect.getDropForeignKeyString() +
getName()
};
}
public String sqlConstraintStringInAlterTable(Dialect dialect) {
String[] columnNames = new String[ getColumnSpan() ];
String[] targetColumnNames = new String[ getColumnSpan() ];
int i=0;
Iterator<Column> itTargetColumn = getTargetColumns().iterator();
for ( Column column : getColumns() ) {
if ( ! itTargetColumn.hasNext() ) {
throw new MappingException( "More constraint columns that foreign key target columns." );
}
columnNames[i] = column.getColumnName().encloseInQuotesIfQuoted( dialect );
targetColumnNames[i] = ( itTargetColumn.next() ).getColumnName().encloseInQuotesIfQuoted( dialect );
i++;
}
if ( itTargetColumn.hasNext() ) {
throw new MappingException( "More foreign key target columns than constraint columns." );
}
StringBuilder sb =
new StringBuilder(
dialect.getAddForeignKeyConstraintString(
getName(),
columnNames,
targetTable.getQualifiedName( dialect ),
targetColumnNames,
this.targetColumns == null
)
);
// TODO: If a dialect does not support cascade-delete, can it support other actions? (HHH-6428)
// For now, assume not.
if ( dialect.supportsCascadeDelete() ) {
if ( deleteRule != ReferentialAction.NO_ACTION ) {
sb.append( ON_DELETE ).append( deleteRule.getActionString() );
}
if ( updateRule != ReferentialAction.NO_ACTION ) {
sb.append( ON_UPDATE ).append( updateRule.getActionString() );
}
}
return sb.toString();
}
public static enum ReferentialAction {
NO_ACTION( "no action" ),
CASCADE( "cascade" ),
SET_NULL( "set null" ),
SET_DEFAULT( "set default" ),
RESTRICT( "restrict" );
private final String actionString;
private ReferentialAction(String actionString) {
this.actionString = actionString;
}
public String getActionString() {
return actionString;
}
}
}

View File

@ -1,144 +0,0 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* Copyright (c) 2010 by Red Hat Inc and/or its affiliates or by
* third-party contributors as indicated by either @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.relational;
import org.hibernate.dialect.Dialect;
import org.hibernate.internal.util.StringHelper;
/**
* Models an identifier (name).
*
* @author Steve Ebersole
*/
public class Identifier {
private final String name;
private final boolean isQuoted;
/**
* Means to generate an {@link Identifier} instance from its simple name
*
* @param name The name
*
* @return The identifier form of the name.
*/
public static Identifier toIdentifier(String name) {
if ( StringHelper.isEmpty( name ) ) {
return null;
}
final String trimmedName = name.trim();
if ( isQuoted( trimmedName ) ) {
final String bareName = trimmedName.substring( 1, trimmedName.length() - 1 );
return new Identifier( bareName, true );
}
else {
return new Identifier( trimmedName, false );
}
}
public static boolean isQuoted(String name) {
return name.startsWith( "`" ) && name.endsWith( "`" );
}
/**
* Constructs an identifier instance.
*
* @param name The identifier text.
* @param quoted Is this a quoted identifier?
*/
public Identifier(String name, boolean quoted) {
if ( StringHelper.isEmpty( name ) ) {
throw new IllegalIdentifierException( "Identifier text cannot be null" );
}
if ( isQuoted( name ) ) {
throw new IllegalIdentifierException( "Identifier text should not contain quote markers (`)" );
}
this.name = name;
this.isQuoted = quoted;
}
/**
* Get the identifiers name (text)
*
* @return The name
*/
public String getName() {
return name;
}
/**
* Is this a quoted identifier>
*
* @return True if this is a quote identifier; false otherwise.
*/
public boolean isQuoted() {
return isQuoted;
}
/**
* If this is a quoted identifier, then return the identifier name
* enclosed in dialect-specific open- and end-quotes; otherwise,
* simply return the identifier name.
*
* @param dialect The dialect whose dialect-specific quoting should be used.
* @return if quoted, identifier name enclosed in dialect-specific open- and end-quotes; otherwise, the
* identifier name.
*/
public String encloseInQuotesIfQuoted(Dialect dialect) {
return isQuoted ?
new StringBuilder( name.length() + 2 )
.append( dialect.openQuote() )
.append( name )
.append( dialect.closeQuote() )
.toString() :
name;
}
@Override
public String toString() {
return isQuoted
? '`' + getName() + '`'
: getName();
}
@Override
public boolean equals(Object o) {
if ( this == o ) {
return true;
}
if ( o == null || getClass() != o.getClass() ) {
return false;
}
Identifier that = (Identifier) o;
return isQuoted == that.isQuoted
&& name.equals( that.name );
}
@Override
public int hashCode() {
return name.hashCode();
}
}

Some files were not shown because too many files have changed in this diff Show More