@@ -52,7 +52,7 @@ public class DefaultGrailsDomainClass extends AbstractGrailsClass implements Gr
5252 private Map mappedBy ;
5353 private Validator validator ;
5454 private String mappingStrategy = GrailsDomainClass .GORM ;
55- private List owners = new ArrayList ();
55+ private List < Class > owners = new ArrayList < Class > ();
5656 private boolean root = true ;
5757 private Set subClasses = new HashSet ();
5858 private Collection embedded ;
@@ -406,13 +406,16 @@ private void establishOwnerOfManyToMany(DefaultGrailsDomainClassProperty propert
406406 Object related = BeanUtils .instantiateClass (relatedClassType );
407407 Object relatedBelongsTo = GrailsClassUtils .getPropertyOrStaticPropertyOrFieldValue (related , GrailsDomainClassProperty .BELONGS_TO );
408408 boolean owningSide = false ;
409- boolean relatedOwner = this .owners . contains ( relatedClassType );
409+ boolean relatedOwner = isOwningSide ( relatedClassType , this .owners );
410410 final Class propertyClass = property .getDomainClass ().getClazz ();
411411 if (relatedBelongsTo instanceof Collection ) {
412- owningSide = ((Collection )relatedBelongsTo ).contains (propertyClass );
412+ final Collection associatedOwners = (Collection )relatedBelongsTo ;
413+ owningSide = isOwningSide (propertyClass , associatedOwners );
413414 }
414- else if (relatedBelongsTo != null ) {
415- owningSide = relatedBelongsTo .equals (propertyClass );
415+ else if (relatedBelongsTo instanceof Class ) {
416+ final Collection associatedOwners = new ArrayList ();
417+ associatedOwners .add (relatedBelongsTo );
418+ owningSide = isOwningSide (propertyClass , associatedOwners );
416419 }
417420 property .setOwningSide (owningSide );
418421 if (relatedOwner && property .isOwningSide ()) {
@@ -422,6 +425,15 @@ else if(!relatedOwner && !property.isOwningSide() && !(property.isCircular() &&
422425 throw new GrailsDomainException ("No owner defined between domain classes [" +propertyClass +"] and [" +relatedClassType +"] in a many-to-many relationship. Example: def belongsTo = " +relatedClassType .getName ());
423426 }
424427 }
428+ private boolean isOwningSide (Class relatedClassType , Collection <Class > owners ) {
429+ boolean relatedOwner = false ;
430+ for (Class relatedClass : owners ) {
431+ if (relatedClass .isAssignableFrom (relatedClassType )) {
432+ relatedOwner = true ; break ;
433+ }
434+ }
435+ return relatedOwner ;
436+ }
425437
426438 /**
427439 * Establishes whether the relationship is a bi-directional or uni-directional one-to-many
0 commit comments