This is an automated email from the ASF dual-hosted git repository.

borinquenkid pushed a commit to branch 8.0.x-hibernate7
in repository https://gitbox.apache.org/repos/asf/grails-core.git

commit e20c284d60cc3c112d94d2cfa9d9ca7db6ca524e
Author: Walter Duque de Estrada <[email protected]>
AuthorDate: Tue Feb 24 18:54:39 2026 -0600

    Adding HibernateAssociation
---
 .../orm/hibernate/cfg/GrailsHibernateUtil.java     | 24 +--------
 .../access/TraitPropertyAccessStrategy.java        |  2 +-
 .../domainbinding/binder/GrailsPropertyBinder.java |  6 +--
 .../cfg/domainbinding/binder/ManyToOneBinder.java  | 28 +++++------
 .../binder/ManyToOneValuesBinder.java              |  7 ++-
 .../GrailsHibernatePersistentProperty.java         |  4 +-
 .../hibernate/HibernateAssociation.java            | 57 ++++++++++++++++++++++
 .../hibernate/HibernateManyToOneProperty.java      |  2 +-
 .../hibernate/HibernateOneToOneProperty.java       |  2 +-
 .../hibernate/HibernateToManyProperty.java         |  2 +-
 ...neProperty.java => HibernateToOneProperty.java} | 24 ++-------
 .../secondpass/CollectionSecondPassBinder.java     |  3 +-
 .../cfg/domainbinding/ManyToOneBinderSpec.groovy   | 28 ++++++-----
 .../domainbinding/ManyToOneValuesBinderSpec.groovy |  9 ++--
 .../model/types/mapping/ManyToManyWithMapping.java |  4 --
 15 files changed, 109 insertions(+), 93 deletions(-)

diff --git 
a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/GrailsHibernateUtil.java
 
b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/GrailsHibernateUtil.java
index 4ddea5c68d..cd4d9abb75 100644
--- 
a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/GrailsHibernateUtil.java
+++ 
b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/GrailsHibernateUtil.java
@@ -18,7 +18,6 @@
  */
 package org.grails.orm.hibernate.cfg;
 
-import java.util.List;
 import java.util.Map;
 
 import groovy.lang.GroovyObject;
@@ -51,7 +50,6 @@ import org.grails.datastore.mapping.model.types.Association;
 import org.grails.datastore.mapping.model.types.Embedded;
 import org.grails.datastore.mapping.reflect.ClassUtils;
 import org.grails.orm.hibernate.AbstractHibernateDatastore;
-import org.grails.orm.hibernate.datasource.MultipleDataSourceSupport;
 import org.grails.orm.hibernate.proxy.HibernateProxyHandler;
 import org.grails.orm.hibernate.support.HibernateRuntimeUtils;
 
@@ -422,29 +420,9 @@ public class GrailsHibernateUtil extends 
HibernateRuntimeUtils {
         return proxyHandler.unwrap(instance);
     }
 
-    /**
-     * @deprecated Use {@link  
MultipleDataSourceSupport#getDefaultDataSource(PersistentEntity)} instead
-     */
-    @Deprecated
-    public static String getDefaultDataSource(PersistentEntity domainClass) {
-        return MultipleDataSourceSupport.getDefaultDataSource(domainClass);
-    }
 
-    /**
-     * @deprecated Use {@link  
MultipleDataSourceSupport#getDatasourceNames(PersistentEntity)} instead
-     */
-    @Deprecated
-    public static List<String> getDatasourceNames(PersistentEntity 
domainClass) {
-        return MultipleDataSourceSupport.getDatasourceNames(domainClass);
-    }
 
-    /**
-     * @deprecated Use {@link  
MultipleDataSourceSupport#getDefaultDataSource(PersistentEntity)} instead
-     */
-    @Deprecated
-    public static boolean usesDatasource(PersistentEntity domainClass, String 
dataSourceName) {
-        return MultipleDataSourceSupport.usesDatasource(domainClass, 
dataSourceName);
-    }
+
 
     public static boolean isMappedWithHibernate(PersistentEntity domainClass) {
         return domainClass instanceof HibernatePersistentEntity;
diff --git 
a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/access/TraitPropertyAccessStrategy.java
 
b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/access/TraitPropertyAccessStrategy.java
index 6edaf21c5f..b9fe9d9c70 100644
--- 
a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/access/TraitPropertyAccessStrategy.java
+++ 
b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/access/TraitPropertyAccessStrategy.java
@@ -114,7 +114,7 @@ public class TraitPropertyAccessStrategy implements 
PropertyAccessStrategy {
     }
   }
 
-  private String getTraitFieldName(Class traitClass, String fieldName) {
+  protected String getTraitFieldName(Class traitClass, String fieldName) {
     return traitClass.getName().replace('.', '_') + "__" + fieldName;
   }
 
diff --git 
a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/GrailsPropertyBinder.java
 
b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/GrailsPropertyBinder.java
index a22e752407..522729047e 100644
--- 
a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/GrailsPropertyBinder.java
+++ 
b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/GrailsPropertyBinder.java
@@ -19,12 +19,12 @@
 package org.grails.orm.hibernate.cfg.domainbinding.binder;
 
 import jakarta.annotation.Nonnull;
-import org.grails.datastore.mapping.model.types.Association;
 import 
org.grails.orm.hibernate.cfg.domainbinding.hibernate.GrailsHibernatePersistentProperty;
 import 
org.grails.orm.hibernate.cfg.domainbinding.hibernate.HibernateEmbeddedProperty;
 import 
org.grails.orm.hibernate.cfg.domainbinding.hibernate.HibernateManyToOneProperty;
 import 
org.grails.orm.hibernate.cfg.domainbinding.hibernate.HibernateOneToOneProperty;
 import 
org.grails.orm.hibernate.cfg.domainbinding.hibernate.HibernateToManyProperty;
+import 
org.grails.orm.hibernate.cfg.domainbinding.hibernate.HibernateToOneProperty;
 
 import org.hibernate.boot.spi.InFlightMetadataCollector;
 import org.hibernate.mapping.PersistentClass;
@@ -90,10 +90,10 @@ public class GrailsPropertyBinder {
                 table,
                 path);
       } else {
-        value = manyToOneBinder.bindManyToOne((Association) currentGrailsProp, 
table, path);
+        value = manyToOneBinder.bindManyToOne((HibernateToOneProperty) 
currentGrailsProp, table, path);
       }
     } else if (currentGrailsProp instanceof HibernateManyToOneProperty 
manyToOne) {
-      value = manyToOneBinder.bindManyToOne((Association) currentGrailsProp, 
table, path);
+      value = manyToOneBinder.bindManyToOne( manyToOne, table, path);
     } else if (currentGrailsProp instanceof HibernateToManyProperty toMany
         && !currentGrailsProp.isSerializableType()) {
       // HibernateToManyProperty
diff --git 
a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/ManyToOneBinder.java
 
b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/ManyToOneBinder.java
index e640a8d6d5..9e7638def4 100644
--- 
a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/ManyToOneBinder.java
+++ 
b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/ManyToOneBinder.java
@@ -20,7 +20,6 @@ package org.grails.orm.hibernate.cfg.domainbinding.binder;
 
 import static 
org.grails.orm.hibernate.cfg.domainbinding.binder.GrailsDomainBinder.FOREIGN_KEY_SUFFIX;
 
-import org.grails.datastore.mapping.model.types.Association;
 import org.grails.orm.hibernate.cfg.ColumnConfig;
 import org.grails.orm.hibernate.cfg.CompositeIdentity;
 import org.grails.orm.hibernate.cfg.JoinTable;
@@ -29,6 +28,8 @@ import 
org.grails.orm.hibernate.cfg.PersistentEntityNamingStrategy;
 import org.grails.orm.hibernate.cfg.PropertyConfig;
 import 
org.grails.orm.hibernate.cfg.domainbinding.hibernate.GrailsHibernatePersistentEntity;
 import 
org.grails.orm.hibernate.cfg.domainbinding.hibernate.GrailsHibernatePersistentProperty;
+import 
org.grails.orm.hibernate.cfg.domainbinding.hibernate.HibernateAssociation;
+import 
org.grails.orm.hibernate.cfg.domainbinding.hibernate.HibernateToOneProperty;
 import 
org.grails.orm.hibernate.cfg.domainbinding.hibernate.HibernateManyToManyProperty;
 import 
org.grails.orm.hibernate.cfg.domainbinding.hibernate.HibernateOneToOneProperty;
 import 
org.grails.orm.hibernate.cfg.domainbinding.util.SimpleValueColumnFetcher;
@@ -79,26 +80,23 @@ public class ManyToOneBinder {
   /** Binds a many-to-one relationship to the */
   @SuppressWarnings("unchecked")
   public ManyToOne bindManyToOne(
-      Association property, org.hibernate.mapping.Table table, String path) {
+      HibernateAssociation property, org.hibernate.mapping.Table table, String 
path) {
     ManyToOne manyToOne = new ManyToOne(metadataBuildingContext, table);
-    GrailsHibernatePersistentProperty hibernateProperty =
-        (GrailsHibernatePersistentProperty) property;
     manyToOneValuesBinder.bindManyToOneValues(property, manyToOne);
     GrailsHibernatePersistentEntity refDomainClass =
-        (GrailsHibernatePersistentEntity)
-            (property instanceof HibernateManyToManyProperty
-                ? property.getOwner()
-                : property.getAssociatedEntity());
+        (property instanceof HibernateManyToManyProperty
+            ? property.getHibernateOwner()
+            : property.getHibernateAssociatedEntity());
     Mapping mapping = refDomainClass.getMappedForm();
 
     boolean isComposite = mapping != null && mapping.hasCompositeIdentifier();
     if (isComposite) {
       CompositeIdentity ci = (CompositeIdentity) mapping.getIdentity();
       compositeIdentifierToManyToOneBinder.bindCompositeIdentifierToManyToOne(
-          hibernateProperty, manyToOne, ci, refDomainClass, path);
+          property, manyToOne, ci, refDomainClass, path);
     } else {
       if (property.isCircular() && (property instanceof 
HibernateManyToManyProperty)) {
-        PropertyConfig pc = hibernateProperty.getMappedForm();
+        PropertyConfig pc = property.getMappedForm();
 
         if (mapping != null && pc.getColumns().isEmpty()) {
           mapping.getColumns().put(property.getName(), pc);
@@ -112,15 +110,15 @@ public class ManyToOneBinder {
           pc.setJoinTable(jt);
         }
         // set type
-        simpleValueBinder.bindSimpleValue(hibernateProperty, null, manyToOne, 
path);
+        simpleValueBinder.bindSimpleValue(property, null, manyToOne, path);
       } else {
         // bind column
         // set type
-        simpleValueBinder.bindSimpleValue(hibernateProperty, null, manyToOne, 
path);
+        simpleValueBinder.bindSimpleValue(property, null, manyToOne, path);
       }
     }
 
-    PropertyConfig config = hibernateProperty.getMappedForm();
+    PropertyConfig config = property.getMappedForm();
     boolean isOneToOne = property instanceof HibernateOneToOneProperty;
     boolean notComposite = !isComposite;
     if (isOneToOne && notComposite) {
@@ -132,7 +130,9 @@ public class ManyToOneBinder {
       if (!config.isUniqueWithinGroup()) {
         c.setUnique(config.isUnique());
       } else {
-        if (property.isBidirectional() && 
property.getInverseSide().isHasOne()) {
+        if (property.isBidirectional()
+            && property.getHibernateInverseSide() instanceof 
HibernateToOneProperty inverseSide
+            && inverseSide.isHibernateOneToOne()) {
           c.setUnique(true);
         }
       }
diff --git 
a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/ManyToOneValuesBinder.java
 
b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/ManyToOneValuesBinder.java
index bdc7bf3989..a37002ecfc 100644
--- 
a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/ManyToOneValuesBinder.java
+++ 
b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/ManyToOneValuesBinder.java
@@ -19,9 +19,8 @@
 package org.grails.orm.hibernate.cfg.domainbinding.binder;
 
 import java.util.Optional;
-import org.grails.datastore.mapping.model.types.Association;
 import org.grails.orm.hibernate.cfg.PropertyConfig;
-import 
org.grails.orm.hibernate.cfg.domainbinding.hibernate.GrailsHibernatePersistentProperty;
+import 
org.grails.orm.hibernate.cfg.domainbinding.hibernate.HibernateAssociation;
 import org.hibernate.FetchMode;
 import org.hibernate.mapping.ManyToOne;
 
@@ -29,8 +28,8 @@ public class ManyToOneValuesBinder {
 
   public ManyToOneValuesBinder() {}
 
-  public void bindManyToOneValues(Association property, ManyToOne manyToOne) {
-    PropertyConfig config = ((GrailsHibernatePersistentProperty) 
property).getMappedForm();
+  public void bindManyToOneValues(HibernateAssociation property, ManyToOne 
manyToOne) {
+    PropertyConfig config = property.getMappedForm();
 
     var fetchMode = 
Optional.ofNullable(config.getFetchMode()).orElse(FetchMode.DEFAULT);
     manyToOne.setFetchMode(fetchMode);
diff --git 
a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/hibernate/GrailsHibernatePersistentProperty.java
 
b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/hibernate/GrailsHibernatePersistentProperty.java
index b5fabf2c4b..f4630851dd 100644
--- 
a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/hibernate/GrailsHibernatePersistentProperty.java
+++ 
b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/hibernate/GrailsHibernatePersistentProperty.java
@@ -48,9 +48,9 @@ public interface GrailsHibernatePersistentProperty extends 
PersistentProperty<Pr
     return this instanceof Association<?> association && 
association.isBidirectional();
   }
 
-  default GrailsHibernatePersistentProperty getHibernateInverseSide() {
+  default HibernateAssociation getHibernateInverseSide() {
     return this instanceof Association<?> association
-        ? (GrailsHibernatePersistentProperty) association.getInverseSide()
+        ? (HibernateAssociation) association.getInverseSide()
         : null;
   }
 
diff --git 
a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/hibernate/HibernateAssociation.java
 
b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/hibernate/HibernateAssociation.java
new file mode 100644
index 0000000000..b894cbbcc4
--- /dev/null
+++ 
b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/hibernate/HibernateAssociation.java
@@ -0,0 +1,57 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    https://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.grails.orm.hibernate.cfg.domainbinding.hibernate;
+
+/**
+ * Common interface for all Hibernate association properties (both ToOne and 
ToMany). Extends
+ * {@link GrailsHibernatePersistentProperty} and declares the key {@link
+ * org.grails.datastore.mapping.model.types.Association} methods directly so 
callers can use them
+ * without casting. Note: {@code Association} is an abstract class so cannot 
be listed as a
+ * super-interface; the implementing classes satisfy these contracts through 
their class hierarchy.
+ *
+ * @see HibernateToOneProperty
+ * @see HibernateToManyProperty
+ */
+public interface HibernateAssociation extends 
GrailsHibernatePersistentProperty {
+
+  // --- Association contract (satisfied by the class hierarchy of all 
implementors) ---
+
+  org.grails.datastore.mapping.model.PersistentProperty<?> getInverseSide();
+
+  org.grails.datastore.mapping.model.PersistentEntity getAssociatedEntity();
+
+  boolean isBidirectional();
+
+  boolean isOwningSide();
+
+  boolean isCircular();
+
+  // --- Hibernate-typed overrides, removing instanceof guards ---
+
+  /** Returns the inverse side as a {@link HibernateAssociation}, eliminating 
cast at call sites. */
+  @Override
+  default HibernateAssociation getHibernateInverseSide() {
+    return (HibernateAssociation) getInverseSide();
+  }
+
+  @Override
+  default GrailsHibernatePersistentEntity getHibernateAssociatedEntity() {
+    return (GrailsHibernatePersistentEntity) getAssociatedEntity();
+  }
+}
diff --git 
a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/hibernate/HibernateManyToOneProperty.java
 
b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/hibernate/HibernateManyToOneProperty.java
index 298f750229..dacd497b16 100644
--- 
a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/hibernate/HibernateManyToOneProperty.java
+++ 
b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/hibernate/HibernateManyToOneProperty.java
@@ -26,7 +26,7 @@ import org.grails.orm.hibernate.cfg.PropertyConfig;
 
 /** Hibernate implementation of {@link 
org.grails.datastore.mapping.model.types.ManyToOne} */
 public class HibernateManyToOneProperty extends 
ManyToOneWithMapping<PropertyConfig>
-    implements GrailsHibernatePersistentProperty {
+    implements HibernateToOneProperty {
   public HibernateManyToOneProperty(
       PersistentEntity entity, MappingContext context, PropertyDescriptor 
property) {
     super(entity, context, property);
diff --git 
a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/hibernate/HibernateOneToOneProperty.java
 
b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/hibernate/HibernateOneToOneProperty.java
index dd0c2e5b2d..36f71c2be4 100644
--- 
a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/hibernate/HibernateOneToOneProperty.java
+++ 
b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/hibernate/HibernateOneToOneProperty.java
@@ -26,7 +26,7 @@ import org.grails.orm.hibernate.cfg.PropertyConfig;
 
 /** Hibernate implementation of {@link 
org.grails.datastore.mapping.model.types.OneToOne} */
 public class HibernateOneToOneProperty extends 
OneToOneWithMapping<PropertyConfig>
-    implements GrailsHibernatePersistentProperty {
+    implements HibernateToOneProperty {
   public HibernateOneToOneProperty(
       PersistentEntity entity, MappingContext context, PropertyDescriptor 
property) {
     super(entity, context, property);
diff --git 
a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/hibernate/HibernateToManyProperty.java
 
b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/hibernate/HibernateToManyProperty.java
index 7ba486c69b..4e92e2b190 100644
--- 
a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/hibernate/HibernateToManyProperty.java
+++ 
b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/hibernate/HibernateToManyProperty.java
@@ -27,7 +27,7 @@ import org.springframework.util.StringUtils;
 
 /** Marker interface for Hibernate to-many associations */
 public interface HibernateToManyProperty
-    extends PropertyWithMapping<PropertyConfig>, 
GrailsHibernatePersistentProperty {
+    extends PropertyWithMapping<PropertyConfig>, HibernateAssociation {
 
   default boolean hasSort() {
     return StringUtils.hasText(getMappedForm().getSort());
diff --git 
a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/hibernate/HibernateOneToOneProperty.java
 
b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/hibernate/HibernateToOneProperty.java
similarity index 51%
copy from 
grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/hibernate/HibernateOneToOneProperty.java
copy to 
grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/hibernate/HibernateToOneProperty.java
index dd0c2e5b2d..12471c35ab 100644
--- 
a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/hibernate/HibernateOneToOneProperty.java
+++ 
b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/hibernate/HibernateToOneProperty.java
@@ -18,22 +18,8 @@
  */
 package org.grails.orm.hibernate.cfg.domainbinding.hibernate;
 
-import java.beans.PropertyDescriptor;
-import org.grails.datastore.mapping.model.MappingContext;
-import org.grails.datastore.mapping.model.PersistentEntity;
-import org.grails.datastore.mapping.model.types.mapping.OneToOneWithMapping;
-import org.grails.orm.hibernate.cfg.PropertyConfig;
-
-/** Hibernate implementation of {@link 
org.grails.datastore.mapping.model.types.OneToOne} */
-public class HibernateOneToOneProperty extends 
OneToOneWithMapping<PropertyConfig>
-    implements GrailsHibernatePersistentProperty {
-  public HibernateOneToOneProperty(
-      PersistentEntity entity, MappingContext context, PropertyDescriptor 
property) {
-    super(entity, context, property);
-  }
-
-  @Override
-  public GrailsHibernatePersistentEntity getHibernateAssociatedEntity() {
-    return (GrailsHibernatePersistentEntity) super.getAssociatedEntity();
-  }
-}
+/**
+ * Marker interface for Hibernate to-one associations ({@link 
HibernateManyToOneProperty} and
+ * {@link HibernateOneToOneProperty}). Parallel to {@link 
HibernateToManyProperty}.
+ */
+public interface HibernateToOneProperty extends HibernateAssociation {}
diff --git 
a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/secondpass/CollectionSecondPassBinder.java
 
b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/secondpass/CollectionSecondPassBinder.java
index 3faf74f779..e452c90536 100644
--- 
a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/secondpass/CollectionSecondPassBinder.java
+++ 
b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/secondpass/CollectionSecondPassBinder.java
@@ -26,7 +26,6 @@ import java.util.Map;
 import java.util.Set;
 import org.grails.datastore.mapping.model.DatastoreConfigurationException;
 import org.grails.datastore.mapping.model.config.GormProperties;
-import org.grails.datastore.mapping.model.types.Association;
 import 
org.grails.orm.hibernate.cfg.domainbinding.binder.CollectionForPropertyConfigBinder;
 import org.grails.orm.hibernate.cfg.domainbinding.binder.ManyToOneBinder;
 import 
org.grails.orm.hibernate.cfg.domainbinding.binder.SimpleValueColumnBinder;
@@ -161,7 +160,7 @@ public class CollectionSecondPassBinder {
         var otherSide = property.getHibernateInverseSide();
         ManyToOne element =
             manyToOneBinder.bindManyToOne(
-                (Association) otherSide, collection.getCollectionTable(), 
EMPTY_PATH);
+                otherSide, collection.getCollectionTable(), EMPTY_PATH);
         element.setReferencedEntityName(otherSide.getOwner().getName());
         collection.setElement(element);
         
collectionForPropertyConfigBinder.bindCollectionForPropertyConfig(collection, 
property);
diff --git 
a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/ManyToOneBinderSpec.groovy
 
b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/ManyToOneBinderSpec.groovy
index f77c7909b6..dc5df81691 100644
--- 
a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/ManyToOneBinderSpec.groovy
+++ 
b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/ManyToOneBinderSpec.groovy
@@ -1,7 +1,8 @@
 package org.grails.orm.hibernate.cfg.domainbinding
 
 import grails.gorm.specs.HibernateGormDatastoreSpec
-import org.grails.datastore.mapping.model.types.Association
+import 
org.grails.orm.hibernate.cfg.domainbinding.hibernate.HibernateAssociation
+import 
org.grails.orm.hibernate.cfg.domainbinding.hibernate.HibernateToOneProperty
 import org.grails.orm.hibernate.cfg.CompositeIdentity
 import 
org.grails.orm.hibernate.cfg.domainbinding.hibernate.GrailsHibernatePersistentEntity
 import 
org.grails.orm.hibernate.cfg.domainbinding.hibernate.GrailsHibernatePersistentProperty
@@ -43,16 +44,16 @@ class ManyToOneBinderSpec extends 
HibernateGormDatastoreSpec {
         }
         def propertyConfig = new PropertyConfig()
 
-        association.getAssociatedEntity() >> refDomainClass
+        association.getHibernateAssociatedEntity() >> refDomainClass
         association.getMappedForm() >> propertyConfig
         mapping.setIdentity(hasCompositeId ? new CompositeIdentity() : null)
 
         when:
-        def result = binder.bindManyToOne(association as Association, null, 
path)
+        def result = binder.bindManyToOne(association as HibernateAssociation, 
null, path)
 
         then:
         result instanceof ManyToOne
-        1 * manyToOneValuesBinder.bindManyToOneValues(association as 
Association, _ as ManyToOne)
+        1 * manyToOneValuesBinder.bindManyToOneValues(association as 
HibernateAssociation, _ as ManyToOne)
         compositeBinderCalls * 
compositeBinder.bindCompositeIdentifierToManyToOne(association as 
GrailsHibernatePersistentProperty, _ as ManyToOne, _, refDomainClass, path)
         simpleValueBinderCalls * simpleValueBinder.bindSimpleValue(association 
as GrailsHibernatePersistentProperty, null, _ as ManyToOne, path)
 
@@ -82,16 +83,17 @@ class ManyToOneBinderSpec extends 
HibernateGormDatastoreSpec {
 
         property.isCircular() >> true
         property.getOwner() >> ownerEntity
+        property.getHibernateOwner() >> ownerEntity
         property.getName() >> "myCircularProp"
         property.getMappedForm() >> propertyConfig
         namingStrategy.resolveColumnName("myCircularProp") >> 
"my_circular_prop"
 
         when:
-        def result = binder.bindManyToOne(property as Association, null, 
"/test")
+        def result = binder.bindManyToOne(property as HibernateAssociation, 
null, "/test")
 
         then:
         result instanceof ManyToOne
-        1 * manyToOneValuesBinder.bindManyToOneValues(property as Association, 
_ as ManyToOne)
+        1 * manyToOneValuesBinder.bindManyToOneValues(property as 
HibernateAssociation, _ as ManyToOne)
         1 * simpleValueBinder.bindSimpleValue(property as 
GrailsHibernatePersistentProperty, null, _ as ManyToOne, "/test")
         def resultConfig = mapping.getColumns().get("myCircularProp")
         resultConfig != null
@@ -116,9 +118,9 @@ class ManyToOneBinderSpec extends 
HibernateGormDatastoreSpec {
         }
         def propertyConfig = Mock(PropertyConfig)
         def column = new Column('test')
-        def inverseSide = Mock(Association)
+        def inverseSide = Mock(HibernateToOneProperty)
 
-        property.getAssociatedEntity() >> refDomainClass
+        property.getHibernateAssociatedEntity() >> refDomainClass
         mapping.setIdentity(null)
         property.getMappedForm() >> propertyConfig
         columnFetcher.getColumnForSimpleValue(_ as ManyToOne) >> column
@@ -126,11 +128,11 @@ class ManyToOneBinderSpec extends 
HibernateGormDatastoreSpec {
         propertyConfig.isUnique() >> isUnique
         propertyConfig.isUniqueWithinGroup() >> isUniqueWithinGroup
         property.isBidirectional() >> isBidirectional
-        property.getInverseSide() >> inverseSide
-        inverseSide.isHasOne() >> isInverseHasOne
+        property.getHibernateInverseSide() >> inverseSide
+        inverseSide.isHibernateOneToOne() >> isInverseHasOne
 
         when:
-        def result = binder.bindManyToOne(property as Association, null, 
"/test")
+        def result = binder.bindManyToOne(property as HibernateAssociation, 
null, "/test")
 
         then:
         result.isAlternateUniqueKey()
@@ -166,13 +168,13 @@ class ManyToOneBinderSpec extends 
HibernateGormDatastoreSpec {
         }
         def propertyConfig = new PropertyConfig()
 
-        property.getAssociatedEntity() >> refDomainClass
+        property.getHibernateAssociatedEntity() >> refDomainClass
         mapping.setIdentity(null)
         property.getMappedForm() >> propertyConfig
         columnFetcher.getColumnForSimpleValue(_ as ManyToOne) >> null
 
         when:
-        binder.bindManyToOne(property as Association, null, "/test")
+        binder.bindManyToOne(property as HibernateAssociation, null, "/test")
 
         then:
         thrown(MappingException)
diff --git 
a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/ManyToOneValuesBinderSpec.groovy
 
b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/ManyToOneValuesBinderSpec.groovy
index 6b9bcedb44..329977265f 100644
--- 
a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/ManyToOneValuesBinderSpec.groovy
+++ 
b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/ManyToOneValuesBinderSpec.groovy
@@ -2,8 +2,7 @@ package org.grails.orm.hibernate.cfg.domainbinding
 
 import grails.gorm.specs.HibernateGormDatastoreSpec
 import org.grails.datastore.mapping.model.PersistentEntity
-import org.grails.datastore.mapping.model.types.Association
-import 
org.grails.orm.hibernate.cfg.domainbinding.hibernate.GrailsHibernatePersistentProperty
+import 
org.grails.orm.hibernate.cfg.domainbinding.hibernate.HibernateAssociation
 import org.grails.orm.hibernate.cfg.PropertyConfig
 import org.hibernate.FetchMode
 import org.hibernate.mapping.ManyToOne
@@ -20,7 +19,7 @@ class ManyToOneValuesBinderSpec extends 
HibernateGormDatastoreSpec {
         def binder = new ManyToOneValuesBinder()
 
         // 2. Set up mocks for the method arguments
-        def association = Mock(Association, additionalInterfaces: 
[GrailsHibernatePersistentProperty])
+        def association = Mock(HibernateAssociation)
         def manyToOne = new 
ManyToOne(getGrailsDomainBinder().getMetadataBuildingContext(),null)
         def associatedEntity = Mock(PersistentEntity)
 
@@ -33,12 +32,12 @@ class ManyToOneValuesBinderSpec extends 
HibernateGormDatastoreSpec {
         config.setIgnoreNotFound(testIgnoreNotFound)
 
         // 4. Define mock behaviors
-        ((GrailsHibernatePersistentProperty)association).getMappedForm() >> 
config
+        association.getMappedForm() >> config
         association.getAssociatedEntity() >> associatedEntity
         associatedEntity.getName() >> "AssociatedEntityName"
 
         when:
-        binder.bindManyToOneValues(association as Association, manyToOne)
+        binder.bindManyToOneValues(association, manyToOne)
 
         then:
         // 5. Verify that the correct values were set on the ManyToOne object
diff --git 
a/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/model/types/mapping/ManyToManyWithMapping.java
 
b/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/model/types/mapping/ManyToManyWithMapping.java
index ad83011fb3..f1193bf3e6 100644
--- 
a/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/model/types/mapping/ManyToManyWithMapping.java
+++ 
b/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/model/types/mapping/ManyToManyWithMapping.java
@@ -43,10 +43,6 @@ public class ManyToManyWithMapping<T extends Property> 
extends ManyToMany<T> imp
         super(entity, context, property);
     }
 
-    public ManyToManyWithMapping(PersistentEntity entity, MappingContext 
context, PropertyDescriptor property, PropertyMapping<T> propertyMapping) {
-        super(entity, context, property);
-        this.propertyMapping = propertyMapping;
-    }
 
     @Override
     public PropertyMapping<T> getMapping() {

Reply via email to