public Object loadByUniqueKey()

in core/src/main/java/org/hibernate/ogm/persister/impl/OgmEntityPersister.java [789:845]


	public Object loadByUniqueKey(
			String propertyName,
			Object uniqueKey,
			SharedSessionContractImplementor session) throws HibernateException {
		//we get the property type for an associated entity
		final int propertyIndex = getPropertyIndex( propertyName );
		final GridType gridUniqueKeyType = getUniqueKeyTypeFromAssociatedEntity( propertyIndex, propertyName );
		//get the associated property index (to get its column names)
		//find the ids per unique property name
		AssociationKeyMetadata associationKeyMetadata = inverseOneToOneAssociationKeyMetadata.get( propertyName );
		if ( associationKeyMetadata == null ) {
			throw new AssertionFailure( "loadByUniqueKey on a non EntityType:" + propertyName );
		}

		OgmEntityPersister inversePersister = (OgmEntityPersister) ( (EntityType) getPropertyTypes()[propertyIndex] ).getAssociatedJoinable( session.getFactory() );

		OptionsServiceContext serviceContext = session.getFactory()
				.getServiceRegistry()
				.getService( OptionsService.class )
				.context();

		AssociationTypeContext associationTypeContext = new AssociationTypeContextImpl.Builder( serviceContext )
				.associationKeyMetadata( associationKeyMetadata )
				.hostingEntityPersister( inversePersister )
				.mainSidePropertyName( getPropertyNames()[propertyIndex] )
				.build();

		AssociationPersister associationPersister = new AssociationPersister.Builder(
					inversePersister.getMappedClass()
				)
				.gridDialect( gridDialect )
				.key( uniqueKey, gridUniqueKeyType )
				.associationKeyMetadata( associationKeyMetadata )
				.session( session )
				.associationTypeContext( associationTypeContext )
				.hostingEntity( session.getPersistenceContext().getEntity( new org.hibernate.engine.spi.EntityKey( (Serializable) uniqueKey, inversePersister ) ) )
				.build();

		final Association ids = associationPersister.getAssociationOrNull();

		if ( ids == null || ids.size() == 0 ) {
			return null;
		}
		else if ( ids.size() == 1 ) {
			//EntityLoader#loadByUniqueKey uses a null object and LockMode.NONE
			//there is only one element in the list, so get the first
			Tuple tuple = ids.get( ids.getKeys().iterator().next() );
			final Serializable id = (Serializable) getGridIdentifierType().nullSafeGet( tuple, getIdentifierColumnNames(), session, null );
			return load( id, null, LockMode.NONE, session );
		}
		else {
			throw new AssertionFailure(
					"Loading by unique key but finding several matches: table:" + getTableName()
							+ " property: " + propertyName
							+ " value: " + uniqueKey );
		}
	}