HHH-6172 Introducing CascadeType enum as a replacement for the string 'cascade'
This commit is contained in:
parent
8ff2f9d192
commit
2570685399
|
@ -37,7 +37,6 @@ import org.hibernate.metamodel.domain.MetaAttribute;
|
|||
import org.hibernate.metamodel.relational.Column;
|
||||
import org.hibernate.metamodel.relational.DerivedValue;
|
||||
import org.hibernate.metamodel.relational.SimpleValue;
|
||||
import org.hibernate.metamodel.relational.TableSpecification;
|
||||
import org.hibernate.metamodel.relational.Tuple;
|
||||
import org.hibernate.metamodel.relational.Value;
|
||||
import org.hibernate.metamodel.relational.state.SimpleValueRelationalState;
|
||||
|
@ -61,7 +60,7 @@ public abstract class AbstractAttributeBinding implements AttributeBinding {
|
|||
private boolean isLazy;
|
||||
private String propertyAccessorName;
|
||||
private boolean isAlternateUniqueKey;
|
||||
private String cascade;
|
||||
private Set<CascadeType> cascadeTypes;
|
||||
private boolean optimisticLockable;
|
||||
|
||||
// DOM4J specific...
|
||||
|
@ -79,7 +78,7 @@ public abstract class AbstractAttributeBinding implements AttributeBinding {
|
|||
isLazy = state.isLazy();
|
||||
propertyAccessorName = state.getPropertyAccessorName();
|
||||
isAlternateUniqueKey = state.isAlternateUniqueKey();
|
||||
cascade = state.getCascade();
|
||||
cascadeTypes = state.getCascadeTypes();
|
||||
optimisticLockable = state.isOptimisticLockable();
|
||||
nodeName = state.getNodeName();
|
||||
metaAttributes = state.getMetaAttributes();
|
||||
|
@ -150,8 +149,8 @@ public abstract class AbstractAttributeBinding implements AttributeBinding {
|
|||
return hibernateTypeDescriptor;
|
||||
}
|
||||
|
||||
public String getCascade() {
|
||||
return cascade;
|
||||
public Set<CascadeType> getCascadeTypes() {
|
||||
return cascadeTypes;
|
||||
}
|
||||
|
||||
public boolean isOptimisticLockable() {
|
||||
|
|
|
@ -29,7 +29,6 @@ import java.util.Set;
|
|||
import org.hibernate.metamodel.domain.Attribute;
|
||||
import org.hibernate.metamodel.domain.MetaAttribute;
|
||||
import org.hibernate.metamodel.relational.SimpleValue;
|
||||
import org.hibernate.metamodel.relational.TableSpecification;
|
||||
import org.hibernate.metamodel.relational.Value;
|
||||
|
||||
/**
|
||||
|
@ -75,8 +74,8 @@ public interface AttributeBinding {
|
|||
|
||||
/**
|
||||
* @return In the case that {@link #getValue()} represents a {@link org.hibernate.metamodel.relational.Tuple} this method
|
||||
* gives access to its compound values. In the case of {@link org.hibernate.metamodel.relational.SimpleValue},
|
||||
* we return an Iterable over that single simple value.
|
||||
* gives access to its compound values. In the case of {@link org.hibernate.metamodel.relational.SimpleValue},
|
||||
* we return an Iterable over that single simple value.
|
||||
*/
|
||||
public Iterable<SimpleValue> getValues();
|
||||
|
||||
|
|
|
@ -0,0 +1,120 @@
|
|||
/*
|
||||
* 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;
|
||||
|
||||
|
||||
/**
|
||||
* @author Hardy Ferentschik
|
||||
*/
|
||||
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> hbmOptionToEnum = new HashMap<String, CascadeType>();
|
||||
|
||||
static {
|
||||
hbmOptionToEnum.put( "all", ALL );
|
||||
hbmOptionToEnum.put( "all-delete-orphan", ALL_DELETE_ORPHAN );
|
||||
hbmOptionToEnum.put( "save-update", UPDATE );
|
||||
hbmOptionToEnum.put( "persist", PERSIST );
|
||||
hbmOptionToEnum.put( "merge", MERGE );
|
||||
hbmOptionToEnum.put( "lock", LOCK );
|
||||
hbmOptionToEnum.put( "refresh", REFRESH );
|
||||
hbmOptionToEnum.put( "replicate", REPLICATE );
|
||||
hbmOptionToEnum.put( "evict", EVICT );
|
||||
hbmOptionToEnum.put( "delete", DELETE );
|
||||
hbmOptionToEnum.put( "remove", DELETE ); // adds remove as a sort-of alias for delete...
|
||||
hbmOptionToEnum.put( "delete-orphan", DELETE_ORPHAN );
|
||||
hbmOptionToEnum.put( "none", 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 hbmOptionToEnum.get( hbmOptionName );
|
||||
}
|
||||
}
|
|
@ -44,7 +44,6 @@ public class ManyToOneAttributeBinding extends SimpleAttributeBinding implements
|
|||
private String referencedAttributeName;
|
||||
private String referencedEntityName;
|
||||
private AttributeBinding referencedAttributeBinding;
|
||||
private boolean ignoreNotFound;
|
||||
|
||||
ManyToOneAttributeBinding(EntityBinding entityBinding) {
|
||||
super( entityBinding, false, false );
|
||||
|
@ -153,7 +152,7 @@ public class ManyToOneAttributeBinding extends SimpleAttributeBinding implements
|
|||
|
||||
public void validate() {
|
||||
// can't check this until both the domain and relational states are initialized...
|
||||
if ( getCascade() != null && getCascade().indexOf( "delete-orphan" ) >= 0 ) {
|
||||
if ( getCascadeTypes().contains( CascadeType.DELETE_ORPHAN ) ) {
|
||||
if ( !isLogicalOneToOne ) {
|
||||
throw new MappingException(
|
||||
"many-to-one attribute [" + getAttribute().getName() + "] does not support orphan delete as it is not unique"
|
||||
|
|
|
@ -24,7 +24,9 @@
|
|||
package org.hibernate.metamodel.binding.state;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import org.hibernate.metamodel.binding.CascadeType;
|
||||
import org.hibernate.metamodel.domain.MetaAttribute;
|
||||
|
||||
/**
|
||||
|
@ -43,7 +45,7 @@ public interface AttributeBindingState {
|
|||
|
||||
boolean isAlternateUniqueKey();
|
||||
|
||||
String getCascade();
|
||||
Set<CascadeType> getCascadeTypes();
|
||||
|
||||
boolean isOptimisticLockable();
|
||||
|
||||
|
|
|
@ -24,8 +24,10 @@
|
|||
package org.hibernate.metamodel.source.annotations.entity.state.binding;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import org.hibernate.mapping.PropertyGeneration;
|
||||
import org.hibernate.metamodel.binding.CascadeType;
|
||||
import org.hibernate.metamodel.binding.state.SimpleAttributeBindingState;
|
||||
import org.hibernate.metamodel.domain.MetaAttribute;
|
||||
import org.hibernate.metamodel.source.annotations.entity.SimpleAttribute;
|
||||
|
@ -104,7 +106,7 @@ public class AttributeBindingStateImpl implements SimpleAttributeBindingState {
|
|||
}
|
||||
|
||||
@Override
|
||||
public String getCascade() {
|
||||
public Set<CascadeType> getCascadeTypes() {
|
||||
return null; //To change body of implemented methods use File | Settings | File Templates.
|
||||
}
|
||||
|
||||
|
|
|
@ -23,6 +23,9 @@
|
|||
*/
|
||||
package org.hibernate.metamodel.source.annotations.entity.state.binding;
|
||||
|
||||
import java.util.Set;
|
||||
|
||||
import org.hibernate.metamodel.binding.CascadeType;
|
||||
import org.hibernate.metamodel.binding.state.ManyToOneAttributeBindingState;
|
||||
import org.hibernate.metamodel.source.annotations.entity.AssociationAttribute;
|
||||
|
||||
|
@ -43,8 +46,8 @@ public class ManyToOneBindingStateImpl extends AttributeBindingStateImpl impleme
|
|||
}
|
||||
|
||||
@Override
|
||||
public String getCascade() {
|
||||
return null; //To change body of implemented methods use File | Settings | File Templates.
|
||||
public Set<CascadeType> getCascadeTypes() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -23,14 +23,17 @@
|
|||
*/
|
||||
package org.hibernate.metamodel.source.hbm.state.binding;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import org.hibernate.MappingException;
|
||||
import org.hibernate.internal.util.ReflectHelper;
|
||||
import org.hibernate.mapping.PropertyGeneration;
|
||||
import org.hibernate.metamodel.source.hbm.MappingDefaults;
|
||||
import org.hibernate.metamodel.binding.CascadeType;
|
||||
import org.hibernate.metamodel.binding.state.AttributeBindingState;
|
||||
import org.hibernate.metamodel.domain.MetaAttribute;
|
||||
import org.hibernate.metamodel.source.hbm.MappingDefaults;
|
||||
import org.hibernate.metamodel.source.hbm.util.MappingHelper;
|
||||
|
||||
/**
|
||||
|
@ -73,6 +76,20 @@ public abstract class AbstractHbmAttributeBindingState implements AttributeBindi
|
|||
return ownerClassName;
|
||||
}
|
||||
|
||||
protected Set<CascadeType> determineCascadeTypes(String cascade) {
|
||||
String commaSeparatedCascades = MappingHelper.getStringValue( cascade, getDefaults().getDefaultCascade() );
|
||||
Set<String> cascades = MappingHelper.getStringValueTokens( commaSeparatedCascades, "," );
|
||||
Set<CascadeType> cascadeTypes = new HashSet<CascadeType>( cascades.size() );
|
||||
for ( String s : cascades ) {
|
||||
CascadeType cascadeType = CascadeType.getCascadeType( s );
|
||||
if ( cascadeType == null ) {
|
||||
throw new MappingException( "Invalid cascading option " + s );
|
||||
}
|
||||
cascadeTypes.add( cascadeType );
|
||||
}
|
||||
return cascadeTypes;
|
||||
}
|
||||
|
||||
protected final String getTypeNameByReflection() {
|
||||
Class ownerClass = MappingHelper.classForName( ownerClassName, defaults.getServiceRegistry() );
|
||||
return ReflectHelper.reflectedPropertyClass( ownerClass, attributeName ).getName();
|
||||
|
|
|
@ -23,6 +23,9 @@
|
|||
*/
|
||||
package org.hibernate.metamodel.source.hbm.state.binding;
|
||||
|
||||
import java.util.Set;
|
||||
|
||||
import org.hibernate.metamodel.binding.CascadeType;
|
||||
import org.hibernate.metamodel.source.hbm.MappingDefaults;
|
||||
import org.hibernate.metamodel.binding.state.DiscriminatorBindingState;
|
||||
import org.hibernate.metamodel.source.hbm.xml.mapping.XMLHibernateMapping.XMLClass.XMLDiscriminator;
|
||||
|
@ -46,7 +49,7 @@ public class HbmDiscriminatorBindingState extends AbstractHbmAttributeBindingSta
|
|||
this.discriminator = discriminator;
|
||||
}
|
||||
|
||||
public String getCascade() {
|
||||
public Set<CascadeType> getCascadeTypes() {
|
||||
return null;
|
||||
}
|
||||
|
||||
|
|
|
@ -23,16 +23,20 @@
|
|||
*/
|
||||
package org.hibernate.metamodel.source.hbm.state.binding;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import org.hibernate.FetchMode;
|
||||
import org.hibernate.MappingException;
|
||||
import org.hibernate.internal.util.ReflectHelper;
|
||||
import org.hibernate.metamodel.source.hbm.MappingDefaults;
|
||||
import org.hibernate.metamodel.binding.CascadeType;
|
||||
import org.hibernate.metamodel.binding.state.ManyToOneAttributeBindingState;
|
||||
import org.hibernate.metamodel.domain.MetaAttribute;
|
||||
import org.hibernate.metamodel.source.hbm.HbmHelper;
|
||||
import org.hibernate.metamodel.source.hbm.xml.mapping.XMLManyToOneElement;
|
||||
import org.hibernate.metamodel.source.hbm.MappingDefaults;
|
||||
import org.hibernate.metamodel.source.hbm.util.MappingHelper;
|
||||
import org.hibernate.metamodel.source.hbm.xml.mapping.XMLManyToOneElement;
|
||||
|
||||
/**
|
||||
* @author Gail Badner
|
||||
|
@ -44,7 +48,7 @@ public class HbmManyToOneAttributeBindingState
|
|||
private final FetchMode fetchMode;
|
||||
private final boolean isUnwrapProxy;
|
||||
private final boolean isLazy;
|
||||
private final String cascade;
|
||||
private final Set<CascadeType> cascadeTypes;
|
||||
private final boolean isEmbedded;
|
||||
private final String referencedPropertyName;
|
||||
private final String referencedEntityName;
|
||||
|
@ -74,7 +78,7 @@ public class HbmManyToOneAttributeBindingState
|
|||
isLazy = manyToOne.getLazy() == null ||
|
||||
isUnwrapProxy ||
|
||||
"proxy".equals( manyToOne.getLazy().value() );
|
||||
cascade = MappingHelper.getStringValue( manyToOne.getCascade(), defaults.getDefaultCascade() );
|
||||
cascadeTypes = determineCascadeTypes( manyToOne.getCascade() );
|
||||
isEmbedded = manyToOne.isEmbedXml();
|
||||
referencedEntityName = getReferencedEntityName( ownerClassName, manyToOne, defaults );
|
||||
referencedPropertyName = manyToOne.getPropertyRef();
|
||||
|
@ -148,8 +152,8 @@ public class HbmManyToOneAttributeBindingState
|
|||
return referencedEntityName;
|
||||
}
|
||||
|
||||
public String getCascade() {
|
||||
return cascade;
|
||||
public Set<CascadeType> getCascadeTypes() {
|
||||
return cascadeTypes;
|
||||
}
|
||||
|
||||
public boolean ignoreNotFound() {
|
||||
|
|
|
@ -27,20 +27,22 @@ import java.util.Comparator;
|
|||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import org.hibernate.FetchMode;
|
||||
import org.hibernate.metamodel.binding.CascadeType;
|
||||
import org.hibernate.metamodel.binding.CustomSQL;
|
||||
import org.hibernate.metamodel.source.hbm.MappingDefaults;
|
||||
import org.hibernate.metamodel.binding.state.PluralAttributeBindingState;
|
||||
import org.hibernate.metamodel.domain.MetaAttribute;
|
||||
import org.hibernate.metamodel.source.hbm.HbmHelper;
|
||||
import org.hibernate.metamodel.source.hbm.MappingDefaults;
|
||||
import org.hibernate.metamodel.source.hbm.util.MappingHelper;
|
||||
import org.hibernate.metamodel.source.hbm.xml.mapping.XMLBagElement;
|
||||
import org.hibernate.metamodel.source.hbm.xml.mapping.XMLSqlDeleteAllElement;
|
||||
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.hbm.util.MappingHelper;
|
||||
|
||||
/**
|
||||
* @author Gail Badner
|
||||
|
@ -50,7 +52,7 @@ public class HbmPluralAttributeBindingState extends AbstractHbmAttributeBindingS
|
|||
private final XMLBagElement collection;
|
||||
private final Class collectionPersisterClass;
|
||||
private final String typeName;
|
||||
private final String cascade;
|
||||
private final Set<CascadeType> cascadeTypes;
|
||||
|
||||
public HbmPluralAttributeBindingState(
|
||||
String ownerClassName,
|
||||
|
@ -72,7 +74,7 @@ public class HbmPluralAttributeBindingState extends AbstractHbmAttributeBindingS
|
|||
this.collectionPersisterClass = MappingHelper.classForName(
|
||||
collection.getPersister(), getDefaults().getServiceRegistry()
|
||||
);
|
||||
this.cascade = MappingHelper.getStringValue( collection.getCascade(), mappingDefaults.getDefaultCascade() );
|
||||
this.cascadeTypes = determineCascadeTypes( collection.getCascade() );
|
||||
|
||||
//Attribute typeNode = collectionElement.attribute( "collection-type" );
|
||||
//if ( typeNode != null ) {
|
||||
|
@ -194,7 +196,8 @@ public class HbmPluralAttributeBindingState extends AbstractHbmAttributeBindingS
|
|||
|
||||
public boolean isOrphanDelete() {
|
||||
// ORPHAN DELETE (used for programmer error detection)
|
||||
return ( getCascade().indexOf( "delete-orphan" ) >= 0 );
|
||||
return true;
|
||||
//return ( getCascade().indexOf( "delete-orphan" ) >= 0 );
|
||||
}
|
||||
|
||||
public int getBatchSize() {
|
||||
|
@ -282,8 +285,8 @@ public class HbmPluralAttributeBindingState extends AbstractHbmAttributeBindingS
|
|||
collection.getLoader().getQueryRef();
|
||||
}
|
||||
|
||||
public String getCascade() {
|
||||
return cascade;
|
||||
public Set<CascadeType> getCascadeTypes() {
|
||||
return cascadeTypes;
|
||||
}
|
||||
|
||||
public boolean isKeyCascadeDeleteEnabled() {
|
||||
|
|
|
@ -25,19 +25,21 @@ package org.hibernate.metamodel.source.hbm.state.binding;
|
|||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import org.hibernate.MappingException;
|
||||
import org.hibernate.mapping.PropertyGeneration;
|
||||
import org.hibernate.metamodel.source.hbm.MappingDefaults;
|
||||
import org.hibernate.metamodel.binding.CascadeType;
|
||||
import org.hibernate.metamodel.binding.state.SimpleAttributeBindingState;
|
||||
import org.hibernate.metamodel.domain.MetaAttribute;
|
||||
import org.hibernate.metamodel.source.hbm.HbmHelper;
|
||||
import org.hibernate.metamodel.source.hbm.MappingDefaults;
|
||||
import org.hibernate.metamodel.source.hbm.util.MappingHelper;
|
||||
import org.hibernate.metamodel.source.hbm.xml.mapping.XMLHibernateMapping.XMLClass.XMLId;
|
||||
import org.hibernate.metamodel.source.hbm.xml.mapping.XMLHibernateMapping.XMLClass.XMLTimestamp;
|
||||
import org.hibernate.metamodel.source.hbm.xml.mapping.XMLHibernateMapping.XMLClass.XMLVersion;
|
||||
import org.hibernate.metamodel.source.hbm.xml.mapping.XMLParamElement;
|
||||
import org.hibernate.metamodel.source.hbm.xml.mapping.XMLPropertyElement;
|
||||
import org.hibernate.metamodel.source.hbm.util.MappingHelper;
|
||||
|
||||
/**
|
||||
* @author Gail Badner
|
||||
|
@ -261,7 +263,7 @@ public class HbmSimpleAttributeBindingState extends AbstractHbmAttributeBindingS
|
|||
return isUpdatable;
|
||||
}
|
||||
|
||||
public String getCascade() {
|
||||
public Set<CascadeType> getCascadeTypes() {
|
||||
return null;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue