org.hibernate.tool.internal.metadata.JdbcMetadataDescriptor Maven / Gradle / Ivy
package org.hibernate.tool.internal.metadata;
import java.util.Properties;
import org.hibernate.MappingException;
import org.hibernate.boot.Metadata;
import org.hibernate.boot.internal.BootstrapContextImpl;
import org.hibernate.boot.internal.InFlightMetadataCollectorImpl;
import org.hibernate.boot.internal.MetadataBuilderImpl.MetadataBuildingOptionsImpl;
import org.hibernate.boot.internal.MetadataBuildingContextRootImpl;
import org.hibernate.boot.internal.MetadataImpl;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.boot.spi.BootstrapContext;
import org.hibernate.boot.spi.MetadataBuildingContext;
import org.hibernate.boot.spi.MetadataBuildingOptions;
import org.hibernate.cfg.Environment;
import org.hibernate.cfg.JDBCBinder;
import org.hibernate.cfg.reveng.DefaultReverseEngineeringStrategy;
import org.hibernate.cfg.reveng.ReverseEngineeringStrategy;
import org.hibernate.engine.spi.Mapping;
import org.hibernate.id.factory.IdentifierGeneratorFactory;
import org.hibernate.mapping.PersistentClass;
import org.hibernate.mapping.Property;
import org.hibernate.tool.api.metadata.MetadataDescriptor;
import org.hibernate.type.Type;
public class JdbcMetadataDescriptor implements MetadataDescriptor {
private ReverseEngineeringStrategy reverseEngineeringStrategy = new DefaultReverseEngineeringStrategy();
private boolean preferBasicCompositeIds = true;
private Properties properties = new Properties();
public JdbcMetadataDescriptor(
ReverseEngineeringStrategy reverseEngineeringStrategy,
Properties properties,
boolean preferBasicCompositeIds) {
this.properties.putAll(Environment.getProperties());
if (properties != null) {
this.properties.putAll(properties);
}
if (reverseEngineeringStrategy != null) {
this.reverseEngineeringStrategy = reverseEngineeringStrategy;
}
this.preferBasicCompositeIds = preferBasicCompositeIds;
}
public Properties getProperties() {
Properties result = new Properties();
result.putAll(properties);
return result;
}
public Metadata createMetadata() {
StandardServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
.applySettings(getProperties())
.build();
MetadataBuildingOptionsImpl metadataBuildingOptions =
new MetadataBuildingOptionsImpl( serviceRegistry );
BootstrapContextImpl bootstrapContext = new BootstrapContextImpl(
serviceRegistry,
metadataBuildingOptions);
metadataBuildingOptions.setBootstrapContext(bootstrapContext);
InFlightMetadataCollectorImpl metadataCollector =
getMetadataCollector(
bootstrapContext,
metadataBuildingOptions);
MetadataBuildingContext metadataBuildingContext =
new MetadataBuildingContextRootImpl(
bootstrapContext,
metadataBuildingOptions,
metadataCollector);
MetadataImpl metadata = metadataCollector
.buildMetadataInstance(metadataBuildingContext);
metadata.getTypeConfiguration().scope(metadataBuildingContext);
JDBCBinder binder = new JDBCBinder(
serviceRegistry,
getProperties(),
metadataBuildingContext,
reverseEngineeringStrategy,
preferBasicCompositeIds);
binder.readFromDatabase(
null,
null,
buildMapping(metadata));
return metadata;
}
private InFlightMetadataCollectorImpl getMetadataCollector(
BootstrapContext bootstrapContext,
MetadataBuildingOptions metadataBuildingOptions) {
return new InFlightMetadataCollectorImpl(
bootstrapContext,
metadataBuildingOptions);
}
private Mapping buildMapping(final Metadata metadata) {
return new Mapping() {
/**
* Returns the identifier type of a mapped class
*/
public Type getIdentifierType(String persistentClass) throws MappingException {
final PersistentClass pc = metadata.getEntityBinding(persistentClass);
if (pc==null) throw new MappingException("persistent class not known: " + persistentClass);
return pc.getIdentifier().getType();
}
public String getIdentifierPropertyName(String persistentClass) throws MappingException {
final PersistentClass pc = metadata.getEntityBinding(persistentClass);
if (pc==null) throw new MappingException("persistent class not known: " + persistentClass);
if ( !pc.hasIdentifierProperty() ) return null;
return pc.getIdentifierProperty().getName();
}
public Type getReferencedPropertyType(String persistentClass, String propertyName) throws MappingException
{
final PersistentClass pc = metadata.getEntityBinding(persistentClass);
if (pc==null) throw new MappingException("persistent class not known: " + persistentClass);
Property prop = pc.getProperty(propertyName);
if (prop==null) throw new MappingException("property not known: " + persistentClass + '.' + propertyName);
return prop.getType();
}
public IdentifierGeneratorFactory getIdentifierGeneratorFactory() {
return null;
}
};
}
}