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();
}
}
}