public static AssociationKeyMetadata getInverseAssociationKeyMetadata ( OgmEntityPersister mainSidePersister , int propertyIndex ) { Type propertyType = mainSidePersister . getPropertyTypes ( ) [ propertyIndex ] ; SessionFactoryImplementor factory = mainSidePersister . getFactory ( ) ; // property represents no association, so no inverse meta-data can exist if ( ! propertyType . isAssociationType ( ) ) { return null ; } Joinable mainSideJoinable = ( ( AssociationType ) propertyType ) . getAssociatedJoinable ( factory ) ; OgmEntityPersister inverseSidePersister = null ; // to-many association if ( mainSideJoinable . isCollection ( ) ) { inverseSidePersister = ( OgmEntityPersister ) ( ( OgmCollectionPersister ) mainSideJoinable ) . getElementPersister ( ) ; } // to-one else { inverseSidePersister = ( OgmEntityPersister ) mainSideJoinable ; mainSideJoinable = mainSidePersister ; } String mainSideProperty = mainSidePersister . getPropertyNames ( ) [ propertyIndex ] ; // property is a one-to-one association (a many-to-one cannot be on the inverse side) -> get the meta-data // straight from the main-side persister AssociationKeyMetadata inverseOneToOneMetadata = mainSidePersister . getInverseOneToOneAssociationKeyMetadata ( mainSideProperty ) ; if ( inverseOneToOneMetadata != null ) { return inverseOneToOneMetadata ; } // process properties of inverse side and try to find association back to main side for ( String candidateProperty : inverseSidePersister . getPropertyNames ( ) ) { Type type = inverseSidePersister . getPropertyType ( candidateProperty ) ; // candidate is a *-to-many association if ( type . isCollectionType ( ) ) { OgmCollectionPersister inverseCollectionPersister = getPersister ( factory , ( CollectionType ) type ) ; String mappedByProperty = inverseCollectionPersister . getMappedByProperty ( ) ; if ( mainSideProperty . equals ( mappedByProperty ) ) { if ( isCollectionMatching ( mainSideJoinable , inverseCollectionPersister ) ) { return inverseCollectionPersister . getAssociationKeyMetadata ( ) ; } } } } return null ; }
Returns the meta - data for the inverse side of the association represented by the given property on the given persister in case it represents the main side of a bi - directional one - to - many or many - to - many association .