HHH-6217 : Create EntityBindingState and implement for HBM XML
This commit is contained in:
parent
c93ce70f9d
commit
6d52bcff6b
|
@ -32,19 +32,10 @@ import java.util.Set;
|
||||||
|
|
||||||
import org.hibernate.AssertionFailure;
|
import org.hibernate.AssertionFailure;
|
||||||
import org.hibernate.MappingException;
|
import org.hibernate.MappingException;
|
||||||
import org.hibernate.engine.internal.Versioning;
|
import org.hibernate.metamodel.binding.state.EntityBindingState;
|
||||||
import org.hibernate.internal.util.ReflectHelper;
|
|
||||||
import org.hibernate.metamodel.domain.Entity;
|
import org.hibernate.metamodel.domain.Entity;
|
||||||
import org.hibernate.metamodel.relational.Column;
|
import org.hibernate.metamodel.relational.Column;
|
||||||
import org.hibernate.metamodel.relational.TableSpecification;
|
import org.hibernate.metamodel.relational.TableSpecification;
|
||||||
import org.hibernate.metamodel.source.hbm.HbmBindingContext;
|
|
||||||
import org.hibernate.metamodel.source.hbm.HbmHelper;
|
|
||||||
import org.hibernate.metamodel.source.hbm.util.MappingHelper;
|
|
||||||
import org.hibernate.metamodel.source.hbm.xml.mapping.XMLHibernateMapping.XMLClass;
|
|
||||||
import org.hibernate.metamodel.source.hbm.xml.mapping.XMLSqlDeleteElement;
|
|
||||||
import org.hibernate.metamodel.source.hbm.xml.mapping.XMLSqlInsertElement;
|
|
||||||
import org.hibernate.metamodel.source.hbm.xml.mapping.XMLSqlUpdateElement;
|
|
||||||
import org.hibernate.metamodel.source.hbm.xml.mapping.XMLSynchronizeElement;
|
|
||||||
import org.hibernate.metamodel.source.spi.MetaAttributeContext;
|
import org.hibernate.metamodel.source.spi.MetaAttributeContext;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -56,7 +47,8 @@ import org.hibernate.metamodel.source.spi.MetaAttributeContext;
|
||||||
*/
|
*/
|
||||||
public class EntityBinding {
|
public class EntityBinding {
|
||||||
private final EntityIdentifier entityIdentifier = new EntityIdentifier( this );
|
private final EntityIdentifier entityIdentifier = new EntityIdentifier( this );
|
||||||
private final boolean isRoot;
|
|
||||||
|
private boolean isRoot;
|
||||||
|
|
||||||
private InheritanceType entityInheritanceType;
|
private InheritanceType entityInheritanceType;
|
||||||
private EntityDiscriminator entityDiscriminator;
|
private EntityDiscriminator entityDiscriminator;
|
||||||
|
@ -96,97 +88,43 @@ public class EntityBinding {
|
||||||
|
|
||||||
private List<String> synchronizedTableNames;
|
private List<String> synchronizedTableNames;
|
||||||
|
|
||||||
public EntityBinding(boolean isRoot) {
|
public EntityBinding initialize(EntityBindingState state) {
|
||||||
this.isRoot = isRoot;
|
this.isRoot = state.isRoot();
|
||||||
}
|
this.entityInheritanceType = state.getEntityInheritanceType();
|
||||||
|
this.caching = state.getCaching();
|
||||||
// TODO: change to intialize from Doimain
|
this.metaAttributeContext = state.getMetaAttributeContext();
|
||||||
public void fromHbmXml(HbmBindingContext bindingContext, XMLClass entityClazz, Entity entity) {
|
this.proxyInterfaceName = state.getProxyInterfaceName();
|
||||||
this.entity = entity;
|
this.lazy = state.isLazy();
|
||||||
metaAttributeContext = HbmHelper.extractMetaAttributeContext( entityClazz.getMeta(), true, bindingContext.getMetaAttributeContext() );
|
this.mutable = state.isMutable();
|
||||||
|
this.explicitPolymorphism = state.isExplicitPolymorphism();
|
||||||
// go ahead and set the lazy here, since pojo.proxy can override it.
|
this.whereFilter = state.getWhereFilter();
|
||||||
lazy = MappingHelper.getBooleanValue(
|
this.rowId = state.getRowId();
|
||||||
entityClazz.isLazy(), bindingContext.getMappingDefaults().isDefaultLazy()
|
this.dynamicInsert = state.isDynamicUpdate();
|
||||||
);
|
this.dynamicInsert = state.isDynamicInsert();
|
||||||
proxyInterfaceName = entityClazz.getProxy();
|
this.batchSize = state.getBatchSize();
|
||||||
dynamicUpdate = entityClazz.isDynamicUpdate();
|
this.selectBeforeUpdate = state.isSelectBeforeUpdate();
|
||||||
dynamicInsert = entityClazz.isDynamicInsert();
|
this.optimisticLockMode = state.getOptimisticLockMode();
|
||||||
batchSize = MappingHelper.getIntValue( entityClazz.getBatchSize(), 0 );
|
this.entityPersisterClass = state.getEntityPersisterClass();
|
||||||
selectBeforeUpdate = entityClazz.isSelectBeforeUpdate();
|
this.isAbstract = state.isAbstract();
|
||||||
|
this.customInsert = state.getCustomInsert();
|
||||||
// OPTIMISTIC LOCK MODE
|
this.customUpdate = state.getCustomUpdate();
|
||||||
String optimisticLockModeString = MappingHelper.getStringValue( entityClazz.getOptimisticLock(), "version" );
|
this.customDelete = state.getCustomDelete();
|
||||||
if ( "version".equals( optimisticLockModeString ) ) {
|
if ( state.getSynchronizedTableNames() != null ) {
|
||||||
optimisticLockMode = Versioning.OPTIMISTIC_LOCK_VERSION;
|
for ( String synchronizedTableName : state.getSynchronizedTableNames() ) {
|
||||||
}
|
addSynchronizedTable( synchronizedTableName );
|
||||||
else if ( "dirty".equals( optimisticLockModeString ) ) {
|
|
||||||
optimisticLockMode = Versioning.OPTIMISTIC_LOCK_DIRTY;
|
|
||||||
}
|
|
||||||
else if ( "all".equals( optimisticLockModeString ) ) {
|
|
||||||
optimisticLockMode = Versioning.OPTIMISTIC_LOCK_ALL;
|
|
||||||
}
|
|
||||||
else if ( "none".equals( optimisticLockModeString ) ) {
|
|
||||||
optimisticLockMode = Versioning.OPTIMISTIC_LOCK_NONE;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
throw new MappingException( "Unsupported optimistic-lock style: " + optimisticLockModeString );
|
|
||||||
}
|
|
||||||
|
|
||||||
// PERSISTER
|
|
||||||
if ( entityClazz.getPersister() != null ) {
|
|
||||||
try {
|
|
||||||
entityPersisterClass = ReflectHelper.classForName( entityClazz.getPersister() );
|
|
||||||
}
|
|
||||||
catch ( ClassNotFoundException cnfe ) {
|
|
||||||
throw new MappingException(
|
|
||||||
"Could not find persister class: "
|
|
||||||
+ entityClazz.getPersister()
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return this;
|
||||||
// CUSTOM SQL
|
|
||||||
XMLSqlInsertElement sqlInsert = entityClazz.getSqlInsert();
|
|
||||||
if ( sqlInsert != null ) {
|
|
||||||
customInsert = HbmHelper.getCustomSql(
|
|
||||||
sqlInsert.getValue(),
|
|
||||||
sqlInsert.isCallable(),
|
|
||||||
sqlInsert.getCheck().value()
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
XMLSqlDeleteElement sqlDelete = entityClazz.getSqlDelete();
|
|
||||||
if ( sqlDelete != null ) {
|
|
||||||
customDelete = HbmHelper.getCustomSql(
|
|
||||||
sqlDelete.getValue(),
|
|
||||||
sqlDelete.isCallable(),
|
|
||||||
sqlDelete.getCheck().value()
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
XMLSqlUpdateElement sqlUpdate = entityClazz.getSqlUpdate();
|
|
||||||
if ( sqlUpdate != null ) {
|
|
||||||
customUpdate = HbmHelper.getCustomSql(
|
|
||||||
sqlUpdate.getValue(),
|
|
||||||
sqlUpdate.isCallable(),
|
|
||||||
sqlUpdate.getCheck().value()
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( entityClazz.getSynchronize() != null ) {
|
|
||||||
for ( XMLSynchronizeElement synchronize : entityClazz.getSynchronize() ) {
|
|
||||||
addSynchronizedTable( synchronize.getTable() );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
isAbstract = entityClazz.isAbstract();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isRoot() {
|
public boolean isRoot() {
|
||||||
return isRoot;
|
return isRoot;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setRoot(boolean isRoot) {
|
||||||
|
this.isRoot = isRoot;
|
||||||
|
}
|
||||||
|
|
||||||
public Entity getEntity() {
|
public Entity getEntity() {
|
||||||
return entity;
|
return entity;
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,78 @@
|
||||||
|
/*
|
||||||
|
* 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.state;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.hibernate.metamodel.binding.Caching;
|
||||||
|
import org.hibernate.metamodel.binding.CustomSQL;
|
||||||
|
import org.hibernate.metamodel.binding.InheritanceType;
|
||||||
|
import org.hibernate.metamodel.source.spi.MetaAttributeContext;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Gail Badner
|
||||||
|
*/
|
||||||
|
public interface EntityBindingState {
|
||||||
|
boolean isRoot();
|
||||||
|
|
||||||
|
InheritanceType getEntityInheritanceType();
|
||||||
|
|
||||||
|
Caching getCaching();
|
||||||
|
|
||||||
|
MetaAttributeContext getMetaAttributeContext();
|
||||||
|
|
||||||
|
String getProxyInterfaceName();
|
||||||
|
|
||||||
|
boolean isLazy();
|
||||||
|
|
||||||
|
boolean isMutable();
|
||||||
|
|
||||||
|
boolean isExplicitPolymorphism();
|
||||||
|
|
||||||
|
String getWhereFilter();
|
||||||
|
|
||||||
|
String getRowId();
|
||||||
|
|
||||||
|
boolean isDynamicUpdate();
|
||||||
|
|
||||||
|
boolean isDynamicInsert();
|
||||||
|
|
||||||
|
int getBatchSize();
|
||||||
|
|
||||||
|
boolean isSelectBeforeUpdate();
|
||||||
|
|
||||||
|
int getOptimisticLockMode();
|
||||||
|
|
||||||
|
Class getEntityPersisterClass();
|
||||||
|
|
||||||
|
Boolean isAbstract();
|
||||||
|
|
||||||
|
CustomSQL getCustomInsert();
|
||||||
|
|
||||||
|
CustomSQL getCustomUpdate();
|
||||||
|
|
||||||
|
CustomSQL getCustomDelete();
|
||||||
|
|
||||||
|
List<String> getSynchronizedTableNames();
|
||||||
|
}
|
|
@ -85,7 +85,7 @@ public class EntityBinder {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void bind() {
|
public void bind() {
|
||||||
EntityBinding entityBinding = new EntityBinding( configuredClass.isRoot() );
|
EntityBinding entityBinding = new EntityBinding();
|
||||||
|
|
||||||
bindJpaEntityAnnotation( entityBinding );
|
bindJpaEntityAnnotation( entityBinding );
|
||||||
bindHibernateEntityAnnotation( entityBinding ); // optional hibernate specific @org.hibernate.annotations.Entity
|
bindHibernateEntityAnnotation( entityBinding ); // optional hibernate specific @org.hibernate.annotations.Entity
|
||||||
|
@ -300,6 +300,7 @@ public class EntityBinder {
|
||||||
}
|
}
|
||||||
|
|
||||||
private void bindId(EntityBinding entityBinding) {
|
private void bindId(EntityBinding entityBinding) {
|
||||||
|
entityBinding.setRoot( true );
|
||||||
switch ( configuredClass.getIdType() ) {
|
switch ( configuredClass.getIdType() ) {
|
||||||
case SIMPLE: {
|
case SIMPLE: {
|
||||||
bindSingleIdAnnotation( entityBinding );
|
bindSingleIdAnnotation( entityBinding );
|
||||||
|
|
|
@ -35,6 +35,7 @@ import org.hibernate.metamodel.binding.AttributeBinding;
|
||||||
import org.hibernate.metamodel.binding.BagBinding;
|
import org.hibernate.metamodel.binding.BagBinding;
|
||||||
import org.hibernate.metamodel.binding.CollectionElementType;
|
import org.hibernate.metamodel.binding.CollectionElementType;
|
||||||
import org.hibernate.metamodel.binding.EntityBinding;
|
import org.hibernate.metamodel.binding.EntityBinding;
|
||||||
|
import org.hibernate.metamodel.binding.InheritanceType;
|
||||||
import org.hibernate.metamodel.binding.ManyToOneAttributeBinding;
|
import org.hibernate.metamodel.binding.ManyToOneAttributeBinding;
|
||||||
import org.hibernate.metamodel.binding.SimpleAttributeBinding;
|
import org.hibernate.metamodel.binding.SimpleAttributeBinding;
|
||||||
import org.hibernate.metamodel.binding.state.ManyToOneAttributeBindingState;
|
import org.hibernate.metamodel.binding.state.ManyToOneAttributeBindingState;
|
||||||
|
@ -45,6 +46,7 @@ import org.hibernate.metamodel.relational.Table;
|
||||||
import org.hibernate.metamodel.relational.TableSpecification;
|
import org.hibernate.metamodel.relational.TableSpecification;
|
||||||
import org.hibernate.metamodel.relational.UniqueKey;
|
import org.hibernate.metamodel.relational.UniqueKey;
|
||||||
import org.hibernate.metamodel.relational.state.ManyToOneRelationalState;
|
import org.hibernate.metamodel.relational.state.ManyToOneRelationalState;
|
||||||
|
import org.hibernate.metamodel.source.hbm.state.binding.HbmEntityBindingState;
|
||||||
import org.hibernate.metamodel.source.hbm.state.binding.HbmManyToOneAttributeBindingState;
|
import org.hibernate.metamodel.source.hbm.state.binding.HbmManyToOneAttributeBindingState;
|
||||||
import org.hibernate.metamodel.source.hbm.state.binding.HbmPluralAttributeBindingState;
|
import org.hibernate.metamodel.source.hbm.state.binding.HbmPluralAttributeBindingState;
|
||||||
import org.hibernate.metamodel.source.hbm.state.binding.HbmSimpleAttributeBindingState;
|
import org.hibernate.metamodel.source.hbm.state.binding.HbmSimpleAttributeBindingState;
|
||||||
|
@ -100,6 +102,12 @@ abstract class AbstractEntityBinder {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isRoot() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract InheritanceType getInheritanceType();
|
||||||
|
|
||||||
public HbmBindingContext getBindingContext() {
|
public HbmBindingContext getBindingContext() {
|
||||||
return bindingContext;
|
return bindingContext;
|
||||||
}
|
}
|
||||||
|
@ -120,11 +128,9 @@ abstract class AbstractEntityBinder {
|
||||||
XMLHibernateMapping.XMLClass entityClazz,
|
XMLHibernateMapping.XMLClass entityClazz,
|
||||||
EntityBinding entityBinding,
|
EntityBinding entityBinding,
|
||||||
Hierarchical superType) {
|
Hierarchical superType) {
|
||||||
entityBinding.fromHbmXml(
|
entityBinding.setEntity( new Entity( bindingContext.extractEntityName( entityClazz ), superType ) );
|
||||||
bindingContext,
|
entityBinding.initialize( new HbmEntityBindingState( isRoot(), getInheritanceType(), bindingContext, entityClazz ) );
|
||||||
entityClazz,
|
|
||||||
new Entity( bindingContext.extractEntityName( entityClazz ), superType )
|
|
||||||
);
|
|
||||||
// TODO: move this stuff out
|
// TODO: move this stuff out
|
||||||
// transfer an explicitly defined lazy attribute
|
// transfer an explicitly defined lazy attribute
|
||||||
bindPojoRepresentation( entityClazz, entityBinding );
|
bindPojoRepresentation( entityClazz, entityBinding );
|
||||||
|
@ -210,28 +216,6 @@ abstract class AbstractEntityBinder {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
int getOptimisticLockMode(Attribute olAtt) throws MappingException {
|
|
||||||
if ( olAtt == null ) {
|
|
||||||
return Versioning.OPTIMISTIC_LOCK_VERSION;
|
|
||||||
}
|
|
||||||
String olMode = olAtt.getValue();
|
|
||||||
if ( olMode == null || "version".equals( olMode ) ) {
|
|
||||||
return Versioning.OPTIMISTIC_LOCK_VERSION;
|
|
||||||
}
|
|
||||||
else if ( "dirty".equals( olMode ) ) {
|
|
||||||
return Versioning.OPTIMISTIC_LOCK_DIRTY;
|
|
||||||
}
|
|
||||||
else if ( "all".equals( olMode ) ) {
|
|
||||||
return Versioning.OPTIMISTIC_LOCK_ALL;
|
|
||||||
}
|
|
||||||
else if ( "none".equals( olMode ) ) {
|
|
||||||
return Versioning.OPTIMISTIC_LOCK_NONE;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
throw new MappingException( "Unsupported optimistic-lock style: " + olMode );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected String getClassTableName(
|
protected String getClassTableName(
|
||||||
XMLHibernateMapping.XMLClass entityClazz,
|
XMLHibernateMapping.XMLClass entityClazz,
|
||||||
EntityBinding entityBinding,
|
EntityBinding entityBinding,
|
||||||
|
|
|
@ -25,9 +25,8 @@ package org.hibernate.metamodel.source.hbm;
|
||||||
|
|
||||||
import org.hibernate.InvalidMappingException;
|
import org.hibernate.InvalidMappingException;
|
||||||
import org.hibernate.MappingException;
|
import org.hibernate.MappingException;
|
||||||
import org.hibernate.cache.spi.access.AccessType;
|
|
||||||
import org.hibernate.metamodel.binding.Caching;
|
|
||||||
import org.hibernate.metamodel.binding.EntityBinding;
|
import org.hibernate.metamodel.binding.EntityBinding;
|
||||||
|
import org.hibernate.metamodel.binding.InheritanceType;
|
||||||
import org.hibernate.metamodel.binding.state.SimpleAttributeBindingState;
|
import org.hibernate.metamodel.binding.state.SimpleAttributeBindingState;
|
||||||
import org.hibernate.metamodel.relational.Identifier;
|
import org.hibernate.metamodel.relational.Identifier;
|
||||||
import org.hibernate.metamodel.relational.InLineView;
|
import org.hibernate.metamodel.relational.InLineView;
|
||||||
|
@ -36,7 +35,6 @@ import org.hibernate.metamodel.relational.state.ValueRelationalState;
|
||||||
import org.hibernate.metamodel.source.hbm.state.binding.HbmDiscriminatorBindingState;
|
import org.hibernate.metamodel.source.hbm.state.binding.HbmDiscriminatorBindingState;
|
||||||
import org.hibernate.metamodel.source.hbm.state.binding.HbmSimpleAttributeBindingState;
|
import org.hibernate.metamodel.source.hbm.state.binding.HbmSimpleAttributeBindingState;
|
||||||
import org.hibernate.metamodel.source.hbm.state.relational.HbmSimpleValueRelationalStateContainer;
|
import org.hibernate.metamodel.source.hbm.state.relational.HbmSimpleValueRelationalStateContainer;
|
||||||
import org.hibernate.metamodel.source.hbm.xml.mapping.XMLCacheElement;
|
|
||||||
import org.hibernate.metamodel.source.hbm.xml.mapping.XMLHibernateMapping;
|
import org.hibernate.metamodel.source.hbm.xml.mapping.XMLHibernateMapping;
|
||||||
import org.hibernate.metamodel.source.hbm.xml.mapping.XMLHibernateMapping.XMLClass;
|
import org.hibernate.metamodel.source.hbm.xml.mapping.XMLHibernateMapping.XMLClass;
|
||||||
import org.hibernate.metamodel.source.hbm.xml.mapping.XMLHibernateMapping.XMLClass.XMLCompositeId;
|
import org.hibernate.metamodel.source.hbm.xml.mapping.XMLHibernateMapping.XMLClass.XMLCompositeId;
|
||||||
|
@ -54,34 +52,27 @@ class RootEntityBinder extends AbstractEntityBinder {
|
||||||
super( bindingContext, xmlClazz );
|
super( bindingContext, xmlClazz );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isRoot() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public InheritanceType getInheritanceType() {
|
||||||
|
return InheritanceType.SINGLE_TABLE;
|
||||||
|
}
|
||||||
|
|
||||||
public void process(XMLClass xmlClazz) {
|
public void process(XMLClass xmlClazz) {
|
||||||
String entityName = getBindingContext().extractEntityName( xmlClazz );
|
String entityName = getBindingContext().extractEntityName( xmlClazz );
|
||||||
if ( entityName == null ) {
|
if ( entityName == null ) {
|
||||||
throw new MappingException( "Unable to determine entity name" );
|
throw new MappingException( "Unable to determine entity name" );
|
||||||
}
|
}
|
||||||
|
|
||||||
EntityBinding entityBinding = new EntityBinding( true );
|
EntityBinding entityBinding = new EntityBinding();
|
||||||
basicEntityBinding( xmlClazz, entityBinding, null );
|
basicEntityBinding( xmlClazz, entityBinding, null );
|
||||||
basicTableBinding( xmlClazz, entityBinding );
|
basicTableBinding( xmlClazz, entityBinding );
|
||||||
|
|
||||||
entityBinding.setMutable( xmlClazz.isMutable() );
|
|
||||||
|
|
||||||
if ( xmlClazz.getWhere() != null ) {
|
|
||||||
entityBinding.setWhereFilter( xmlClazz.getWhere() );
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( xmlClazz.getPolymorphism() != null ) {
|
|
||||||
entityBinding.setExplicitPolymorphism( "explicit".equals( xmlClazz.getPolymorphism() ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( xmlClazz.getRowid() != null ) {
|
|
||||||
entityBinding.setRowId( xmlClazz.getRowid() );
|
|
||||||
}
|
|
||||||
|
|
||||||
bindIdentifier( xmlClazz, entityBinding );
|
bindIdentifier( xmlClazz, entityBinding );
|
||||||
bindDiscriminator( xmlClazz, entityBinding );
|
bindDiscriminator( xmlClazz, entityBinding );
|
||||||
bindVersionOrTimestamp( xmlClazz, entityBinding );
|
bindVersionOrTimestamp( xmlClazz, entityBinding );
|
||||||
bindCaching( xmlClazz, entityBinding );
|
|
||||||
|
|
||||||
// called createClassProperties in HBMBinder...
|
// called createClassProperties in HBMBinder...
|
||||||
buildAttributeBindings( xmlClazz, entityBinding );
|
buildAttributeBindings( xmlClazz, entityBinding );
|
||||||
|
@ -335,16 +326,4 @@ class RootEntityBinder extends AbstractEntityBinder {
|
||||||
.initialize( bindingState )
|
.initialize( bindingState )
|
||||||
.initialize( relationalState );
|
.initialize( relationalState );
|
||||||
}
|
}
|
||||||
|
|
||||||
private void bindCaching(XMLClass xmlClazz,
|
|
||||||
EntityBinding entityBinding) {
|
|
||||||
XMLCacheElement cache = xmlClazz.getCache();
|
|
||||||
if ( cache == null ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
final String region = cache.getRegion() != null ? cache.getRegion() : entityBinding.getEntity().getName();
|
|
||||||
final AccessType accessType = Enum.valueOf( AccessType.class, cache.getUsage() );
|
|
||||||
final boolean cacheLazyProps = !"non-lazy".equals( cache.getInclude() );
|
|
||||||
entityBinding.setCaching( new Caching( region, accessType, cacheLazyProps ) );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,301 @@
|
||||||
|
/*
|
||||||
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* Copyright (c) 2011, Red Hat Inc. or third-party contributors as
|
||||||
|
* indicated by the @author tags or express copyright attribution
|
||||||
|
* statements applied by the authors. All third-party contributions are
|
||||||
|
* distributed under license by Red Hat Inc.
|
||||||
|
*
|
||||||
|
* This copyrighted material is made available to anyone wishing to use, modify,
|
||||||
|
* copy, or redistribute it subject to the terms and conditions of the GNU
|
||||||
|
* Lesser General Public License, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||||
|
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
|
||||||
|
* for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with this distribution; if not, write to:
|
||||||
|
* Free Software Foundation, Inc.
|
||||||
|
* 51 Franklin Street, Fifth Floor
|
||||||
|
* Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
package org.hibernate.metamodel.source.hbm.state.binding;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.hibernate.MappingException;
|
||||||
|
import org.hibernate.cache.spi.access.AccessType;
|
||||||
|
import org.hibernate.engine.internal.Versioning;
|
||||||
|
import org.hibernate.metamodel.binding.Caching;
|
||||||
|
import org.hibernate.metamodel.binding.CustomSQL;
|
||||||
|
import org.hibernate.metamodel.binding.InheritanceType;
|
||||||
|
import org.hibernate.metamodel.binding.state.EntityBindingState;
|
||||||
|
import org.hibernate.metamodel.source.hbm.HbmBindingContext;
|
||||||
|
import org.hibernate.metamodel.source.hbm.HbmHelper;
|
||||||
|
import org.hibernate.metamodel.source.hbm.util.MappingHelper;
|
||||||
|
import org.hibernate.metamodel.source.hbm.xml.mapping.XMLCacheElement;
|
||||||
|
import org.hibernate.metamodel.source.hbm.xml.mapping.XMLHibernateMapping;
|
||||||
|
import org.hibernate.metamodel.source.hbm.xml.mapping.XMLSqlDeleteElement;
|
||||||
|
import org.hibernate.metamodel.source.hbm.xml.mapping.XMLSqlInsertElement;
|
||||||
|
import org.hibernate.metamodel.source.hbm.xml.mapping.XMLSqlUpdateElement;
|
||||||
|
import org.hibernate.metamodel.source.hbm.xml.mapping.XMLSynchronizeElement;
|
||||||
|
import org.hibernate.metamodel.source.spi.MetaAttributeContext;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Gail Badner
|
||||||
|
*/
|
||||||
|
public class HbmEntityBindingState implements EntityBindingState {
|
||||||
|
private final boolean isRoot;
|
||||||
|
private final InheritanceType entityInheritanceType;
|
||||||
|
private final Caching caching;
|
||||||
|
private final MetaAttributeContext metaAttributeContext;
|
||||||
|
private final String proxyInterfaceName;
|
||||||
|
|
||||||
|
private final boolean lazy;
|
||||||
|
private final boolean mutable;
|
||||||
|
private final boolean explicitPolymorphism;
|
||||||
|
private final String whereFilter;
|
||||||
|
private final String rowId;
|
||||||
|
|
||||||
|
private final boolean dynamicUpdate;
|
||||||
|
private final boolean dynamicInsert;
|
||||||
|
|
||||||
|
private final int batchSize;
|
||||||
|
private final boolean selectBeforeUpdate;
|
||||||
|
private final int optimisticLockMode;
|
||||||
|
|
||||||
|
private final Class entityPersisterClass;
|
||||||
|
private final Boolean isAbstract;
|
||||||
|
|
||||||
|
private final CustomSQL customInsert;
|
||||||
|
private final CustomSQL customUpdate;
|
||||||
|
private final CustomSQL customDelete;
|
||||||
|
|
||||||
|
private final List<String> synchronizedTableNames;
|
||||||
|
|
||||||
|
public HbmEntityBindingState(
|
||||||
|
boolean isRoot,
|
||||||
|
InheritanceType inheritanceType,
|
||||||
|
HbmBindingContext bindingContext,
|
||||||
|
XMLHibernateMapping.XMLClass entityClazz) {
|
||||||
|
this.isRoot = isRoot;
|
||||||
|
this.entityInheritanceType = inheritanceType;
|
||||||
|
|
||||||
|
this.caching = createCaching( entityClazz, bindingContext.extractEntityName( entityClazz ) );
|
||||||
|
|
||||||
|
metaAttributeContext = HbmHelper.extractMetaAttributeContext(
|
||||||
|
entityClazz.getMeta(), true, bindingContext.getMetaAttributeContext()
|
||||||
|
);
|
||||||
|
|
||||||
|
// go ahead and set the lazy here, since pojo.proxy can override it.
|
||||||
|
lazy = MappingHelper.getBooleanValue(
|
||||||
|
entityClazz.isLazy(), bindingContext.getMappingDefaults().isDefaultLazy()
|
||||||
|
);
|
||||||
|
mutable = entityClazz.isMutable();
|
||||||
|
|
||||||
|
explicitPolymorphism = "explicit".equals( entityClazz.getPolymorphism() );
|
||||||
|
whereFilter = entityClazz.getWhere();
|
||||||
|
rowId = entityClazz.getRowid();
|
||||||
|
proxyInterfaceName = entityClazz.getProxy();
|
||||||
|
dynamicUpdate = entityClazz.isDynamicUpdate();
|
||||||
|
dynamicInsert = entityClazz.isDynamicInsert();
|
||||||
|
batchSize = MappingHelper.getIntValue( entityClazz.getBatchSize(), 0 );
|
||||||
|
selectBeforeUpdate = entityClazz.isSelectBeforeUpdate();
|
||||||
|
optimisticLockMode = getOptimisticLockMode();
|
||||||
|
|
||||||
|
// PERSISTER
|
||||||
|
entityPersisterClass =
|
||||||
|
entityClazz.getPersister() == null ?
|
||||||
|
null :
|
||||||
|
MappingHelper.classForName( entityClazz.getPersister(), bindingContext.getServiceRegistry() );
|
||||||
|
|
||||||
|
// CUSTOM SQL
|
||||||
|
XMLSqlInsertElement sqlInsert = entityClazz.getSqlInsert();
|
||||||
|
if ( sqlInsert != null ) {
|
||||||
|
customInsert = HbmHelper.getCustomSql(
|
||||||
|
sqlInsert.getValue(),
|
||||||
|
sqlInsert.isCallable(),
|
||||||
|
sqlInsert.getCheck().value()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
customInsert = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
XMLSqlDeleteElement sqlDelete = entityClazz.getSqlDelete();
|
||||||
|
if ( sqlDelete != null ) {
|
||||||
|
customDelete = HbmHelper.getCustomSql(
|
||||||
|
sqlDelete.getValue(),
|
||||||
|
sqlDelete.isCallable(),
|
||||||
|
sqlDelete.getCheck().value()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
customDelete = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
XMLSqlUpdateElement sqlUpdate = entityClazz.getSqlUpdate();
|
||||||
|
if ( sqlUpdate != null ) {
|
||||||
|
customUpdate = HbmHelper.getCustomSql(
|
||||||
|
sqlUpdate.getValue(),
|
||||||
|
sqlUpdate.isCallable(),
|
||||||
|
sqlUpdate.getCheck().value()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
customUpdate = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( entityClazz.getSynchronize() != null ) {
|
||||||
|
synchronizedTableNames = new ArrayList<String>( entityClazz.getSynchronize().size() );
|
||||||
|
for ( XMLSynchronizeElement synchronize : entityClazz.getSynchronize() ) {
|
||||||
|
synchronizedTableNames.add( synchronize.getTable() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
synchronizedTableNames = null;
|
||||||
|
}
|
||||||
|
isAbstract = entityClazz.isAbstract();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Caching createCaching(XMLHibernateMapping.XMLClass entityClazz, String entityName) {
|
||||||
|
XMLCacheElement cache = entityClazz.getCache();
|
||||||
|
if ( cache == null ) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
final String region = cache.getRegion() != null ? cache.getRegion() : entityName;
|
||||||
|
final AccessType accessType = Enum.valueOf( AccessType.class, cache.getUsage() );
|
||||||
|
final boolean cacheLazyProps = !"non-lazy".equals( cache.getInclude() );
|
||||||
|
return new Caching( region, accessType, cacheLazyProps );
|
||||||
|
}
|
||||||
|
|
||||||
|
private static int createOptimisticLockMode(XMLHibernateMapping.XMLClass entityClazz) {
|
||||||
|
String optimisticLockModeString = MappingHelper.getStringValue( entityClazz.getOptimisticLock(), "version" );
|
||||||
|
int optimisticLockMode;
|
||||||
|
if ( "version".equals( optimisticLockModeString ) ) {
|
||||||
|
optimisticLockMode = Versioning.OPTIMISTIC_LOCK_VERSION;
|
||||||
|
}
|
||||||
|
else if ( "dirty".equals( optimisticLockModeString ) ) {
|
||||||
|
optimisticLockMode = Versioning.OPTIMISTIC_LOCK_DIRTY;
|
||||||
|
}
|
||||||
|
else if ( "all".equals( optimisticLockModeString ) ) {
|
||||||
|
optimisticLockMode = Versioning.OPTIMISTIC_LOCK_ALL;
|
||||||
|
}
|
||||||
|
else if ( "none".equals( optimisticLockModeString ) ) {
|
||||||
|
optimisticLockMode = Versioning.OPTIMISTIC_LOCK_NONE;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
throw new MappingException( "Unsupported optimistic-lock style: " + optimisticLockModeString );
|
||||||
|
}
|
||||||
|
return optimisticLockMode;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isRoot() {
|
||||||
|
return isRoot;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public InheritanceType getEntityInheritanceType() {
|
||||||
|
return entityInheritanceType;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Caching getCaching() {
|
||||||
|
return caching;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MetaAttributeContext getMetaAttributeContext() {
|
||||||
|
return metaAttributeContext;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getProxyInterfaceName() {
|
||||||
|
return proxyInterfaceName;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isLazy() {
|
||||||
|
return lazy;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isMutable() {
|
||||||
|
return mutable;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isExplicitPolymorphism() {
|
||||||
|
return explicitPolymorphism;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getWhereFilter() {
|
||||||
|
return whereFilter;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getRowId() {
|
||||||
|
return rowId;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isDynamicUpdate() {
|
||||||
|
return dynamicUpdate;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isDynamicInsert() {
|
||||||
|
return dynamicInsert;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getBatchSize() {
|
||||||
|
return batchSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isSelectBeforeUpdate() {
|
||||||
|
return selectBeforeUpdate;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getOptimisticLockMode() {
|
||||||
|
return optimisticLockMode;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Class getEntityPersisterClass() {
|
||||||
|
return entityPersisterClass;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Boolean isAbstract() {
|
||||||
|
return isAbstract;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CustomSQL getCustomInsert() {
|
||||||
|
return customInsert;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CustomSQL getCustomUpdate() {
|
||||||
|
return customUpdate;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CustomSQL getCustomDelete() {
|
||||||
|
return customDelete;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<String> getSynchronizedTableNames() {
|
||||||
|
return synchronizedTableNames;
|
||||||
|
}
|
||||||
|
}
|
|
@ -52,7 +52,8 @@ public class SimpleValueBindingTests extends BaseUnitTestCase {
|
||||||
public void testBasicMiddleOutBuilding() {
|
public void testBasicMiddleOutBuilding() {
|
||||||
Table table = new Table( new Schema( null, null ), "the_table" );
|
Table table = new Table( new Schema( null, null ), "the_table" );
|
||||||
Entity entity = new Entity( "TheEntity", null );
|
Entity entity = new Entity( "TheEntity", null );
|
||||||
EntityBinding entityBinding = new EntityBinding( true );
|
EntityBinding entityBinding = new EntityBinding();
|
||||||
|
entityBinding.setRoot( true );
|
||||||
entityBinding.setEntity( entity );
|
entityBinding.setEntity( entity );
|
||||||
entityBinding.setBaseTable( table );
|
entityBinding.setBaseTable( table );
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue