From 4a92016f0c7217a325c7b27590d3aec99266d0eb Mon Sep 17 00:00:00 2001 From: brmeyer Date: Tue, 6 Nov 2012 16:38:00 -0500 Subject: [PATCH] HHH-6356 Add PluralAttributeBinding.isInsertable() and isUpdatable() --- .../hibernate/metamodel/internal/Binder.java | 8 ++++++-- .../spi/binding/PluralAttributeKeyBinding.java | 17 +++++++++++++---- .../org/hibernate/tuple/PropertyFactory.java | 9 +++------ 3 files changed, 22 insertions(+), 12 deletions(-) diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/Binder.java b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/Binder.java index 70bdfef9ba..899a0d6889 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/Binder.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/Binder.java @@ -161,6 +161,7 @@ * @author Steve Ebersole * @author Hardy Ferentschik * @author Gail Badner + * @author Brett Meyer */ public class Binder { private static final CoreMessageLogger log = Logger.getMessageLogger( @@ -496,6 +497,7 @@ void bindCollectionTableForeignKey( bindValues( attributeBindingContainer, keySource, attributeBinding.getAttribute(), collectionTable ); // Determine if the foreign key (source) column is updatable and also extract the columns out // of the RelationalValueBindings. + boolean isInsertable = false; boolean isUpdatable = false; List sourceColumns = new ArrayList( sourceColumnBindings.size() ); for ( RelationalValueBinding relationalValueBinding : sourceColumnBindings ) { @@ -505,10 +507,12 @@ void bindCollectionTableForeignKey( throw new NotYetImplementedException( "Derived values are not supported when creating a foreign key that targets columns." ); } + isInsertable = isInsertable || relationalValueBinding.isIncludeInInsert(); isUpdatable = isUpdatable || relationalValueBinding.isIncludeInUpdate(); sourceColumns.add( (Column) value ); } - keyBinding.setIncludedInUpdate( isUpdatable ); + keyBinding.setInsertable( isInsertable ); + keyBinding.setUpdatable( isUpdatable ); List targetColumns = determineForeignKeyTargetColumns( @@ -1309,7 +1313,7 @@ private void bindOneToManyCollectionKey( keyBinding.setForeignKey( fk ); } } - keyBinding.setIncludedInUpdate( isUpdatable ); + keyBinding.setUpdatable( isUpdatable ); } else { bindCollectionTableForeignKey( attributeBinding, attributeSource.getKeySource(), collectionTable ); diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/spi/binding/PluralAttributeKeyBinding.java b/hibernate-core/src/main/java/org/hibernate/metamodel/spi/binding/PluralAttributeKeyBinding.java index 96b6706751..7271006086 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/spi/binding/PluralAttributeKeyBinding.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/spi/binding/PluralAttributeKeyBinding.java @@ -38,7 +38,8 @@ public class PluralAttributeKeyBinding { private final SingularAttributeBinding referencedAttributeBinding; private ForeignKey foreignKey; private boolean inverse; - private boolean isIncludedInUpdate; + private boolean insertable; + private boolean updatable; // this knowledge can be implicitly resolved based on the typing information on the referenced owner attribute private HibernateTypeDescriptor hibernateTypeDescriptor = new HibernateTypeDescriptor(); @@ -130,14 +131,22 @@ public boolean isNullable() { return false; } - public void setIncludedInUpdate(boolean isIncludedInUpdate){ + public void setInsertable( boolean insertable ){ + this.insertable = insertable; + } + + public boolean isInsertable() { + return insertable; + } + + public void setUpdatable( boolean updatable ){ // The key is updatable if the foreign key *source* columns are updatable; // We don't have the RelationalValueBindings for the FK source columns stored in ForeignKey // so it needs to be set explicitly. - this.isIncludedInUpdate = isIncludedInUpdate; + this.updatable = updatable; } public boolean isUpdatable() { - return isIncludedInUpdate; + return updatable; } } diff --git a/hibernate-core/src/main/java/org/hibernate/tuple/PropertyFactory.java b/hibernate-core/src/main/java/org/hibernate/tuple/PropertyFactory.java index 029f899d0b..40c1ad3d82 100644 --- a/hibernate-core/src/main/java/org/hibernate/tuple/PropertyFactory.java +++ b/hibernate-core/src/main/java/org/hibernate/tuple/PropertyFactory.java @@ -354,15 +354,12 @@ public static StandardProperty buildStandardProperty(AttributeBinding property, null, type, lazyAvailable && pluralAttributeBinding.isLazy(), - // TODO: fix this when HHH-6356 is fixed; for now assume AbstractPluralAttributeBinding is updatable and insertable - true, // pluralAttributeBinding.isInsertable(), - true, //pluralAttributeBinding.isUpdatable(), + pluralAttributeBinding.getPluralAttributeKeyBinding().isInsertable(), + pluralAttributeBinding.getPluralAttributeKeyBinding().isUpdatable(), false, false, true, // plural attributes are nullable - // TODO: fix this when HHH-6356 is fixed; for now assume AbstractPluralAttributeBinding is updatable and insertable - //alwaysDirtyCheck || pluralAttributeBinding.isUpdatable(), - true, + alwaysDirtyCheck || pluralAttributeBinding.getPluralAttributeKeyBinding().isUpdatable(), pluralAttributeBinding.isIncludedInOptimisticLocking(), cascadeStyle, fetchMode