private void buildForeignKey()

in odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/model/JPAEdmProperty.java [372:461]


    private void buildForeignKey(final JoinColumn joinColumn, final Attribute<?, ?> jpaAttribute)
        throws ODataJPAModelException, ODataJPARuntimeException {

      joinColumnNames = joinColumnNames == null ? new ArrayList<String[]>() : joinColumnNames;
      String[] name = { null, null };
      name[0] = "".equals(joinColumn.name()) ? jpaAttribute.getName() : joinColumn.name();

      EntityType<?> referencedEntityType;
      if (jpaAttribute.isCollection()) {
        referencedEntityType =
            metaModel.entity(((PluralAttribute<?, ?, ?>) currentAttribute).getElementType().getJavaType());
      } else {
        referencedEntityType = metaModel.entity(jpaAttribute.getJavaType());
      }

      if ("".equals(joinColumn.referencedColumnName())) {
        for (Attribute<?, ?> referencedAttribute : referencedEntityType.getAttributes()) {
          if (referencedAttribute.getPersistentAttributeType() == PersistentAttributeType.BASIC &&
              ((SingularAttribute<?, ?>) referencedAttribute).isId()) {
            AnnotatedElement annotatedElement = (AnnotatedElement) referencedAttribute.getJavaMember();
            Column referencedColumn = null;
            if (annotatedElement != null) {
              referencedColumn = annotatedElement.getAnnotation(Column.class);
            }
            if (referencedColumn != null) {
              name[1] = referencedColumn.name();
            } else {
              name[1] = referencedAttribute.getName();
            }
            joinColumnNames.add(name);
            currentRefAttribute = referencedAttribute;
            break;
          }
        }
      } else {
        for (Attribute<?, ?> referencedAttribute : referencedEntityType.getAttributes()) {
          AnnotatedElement annotatedElement2 = (AnnotatedElement) referencedAttribute.getJavaMember();
          if (annotatedElement2 != null) {
            String refColName = getReferenceColumnName(annotatedElement2, referencedAttribute);
            if(refColName.equals((joinColumn.referencedColumnName()))) {
              name[1] = refColName;
              joinColumnNames.add(name);
              currentRefAttribute = referencedAttribute;
              break;
            } else if(annotatedElement2.getAnnotation(AttributeOverrides.class) != null) {
              AttributeOverrides attributeOverrides = annotatedElement2.getAnnotation(AttributeOverrides.class);
              if(attributeOverrides != null && referencedAttribute instanceof SingularAttribute) {
                boolean found = false;
                // Check if the column name is in the defined overrides
                for(AttributeOverride attributeOverride : attributeOverrides.value()) {
                  if(attributeOverride.column() != null &&
                      joinColumn.referencedColumnName().equals(attributeOverride.column().name())) {
                    name[1] = attributeOverride.column().name();
                    // add the column
                    joinColumnNames.add(name);
                    // get the correct attribute from the embeddable type
                    if(((SingularAttribute<?,?>)referencedAttribute).getType() instanceof EmbeddableType) {
                      EmbeddableType<?> embeddableTypeAttribute =
                          (EmbeddableType<?>) ((SingularAttribute<?, ?>) referencedAttribute).getType();
                      currentRefAttribute = embeddableTypeAttribute.getDeclaredAttribute(attributeOverride.name());
                    } else {
                      currentRefAttribute = referencedAttribute;
                    }
                    found = true;
                    break;
                  }
                }
                if(found) {
                  break;
                }
              } 
            }
          }
        }
      }

      if (currentRefAttribute == null) {
        throw ODataJPAModelException.throwException(ODataJPAModelException.REF_ATTRIBUTE_NOT_FOUND
            .addContent(joinColumn.referencedColumnName() + " -> " + referencedEntityType.getName()), null);
      }
      if (joinColumn.insertable() && joinColumn.updatable()) {
        currentSimpleProperty = new SimpleProperty();
        properties.add(buildSimpleProperty(currentRefAttribute, currentSimpleProperty, joinColumn));
        if(joinColumn.nullable()) {
          currentSimpleProperty.getFacets();

        }
      }

    }