// Add annotations to field
final List<AnnotationMetadataBuilder> annotations = new ArrayList<AnnotationMetadataBuilder>();
// Add @ManyToMany annotation
final AnnotationMetadataBuilder manyToManyBuilder = new AnnotationMetadataBuilder(
MANY_TO_MANY);
annotations.add(manyToManyBuilder);
// Add @JoinTable annotation
final AnnotationMetadataBuilder joinTableBuilder = new AnnotationMetadataBuilder(
JOIN_TABLE);
final List<AnnotationAttributeValue<?>> joinTableAnnotationAttributes = new ArrayList<AnnotationAttributeValue<?>>();
joinTableAnnotationAttributes.add(new StringAttributeValue(
new JavaSymbolName(NAME), joinTable.getName()));
final Iterator<ForeignKey> iter = joinTable.getImportedKeys()
.iterator();
// Add "joinColumns" attribute containing nested @JoinColumn annotations
final List<NestedAnnotationAttributeValue> joinColumnArrayValues = new ArrayList<NestedAnnotationAttributeValue>();
final Set<Reference> firstKeyReferences = iter.next().getReferences();
for (final Reference reference : firstKeyReferences) {
final AnnotationMetadataBuilder joinColumnBuilder = getJoinColumnAnnotation(
reference, firstKeyReferences.size() > 1);
joinColumnArrayValues.add(new NestedAnnotationAttributeValue(
new JavaSymbolName(VALUE), joinColumnBuilder.build()));
}
joinTableAnnotationAttributes
.add(new ArrayAttributeValue<NestedAnnotationAttributeValue>(
new JavaSymbolName("joinColumns"),
joinColumnArrayValues));
// Add "inverseJoinColumns" attribute containing nested @JoinColumn
// annotations
final List<NestedAnnotationAttributeValue> inverseJoinColumnArrayValues = new ArrayList<NestedAnnotationAttributeValue>();
final Set<Reference> lastKeyReferences = iter.next().getReferences();
for (final Reference reference : lastKeyReferences) {
final AnnotationMetadataBuilder joinColumnBuilder = getJoinColumnAnnotation(
reference, lastKeyReferences.size() > 1);
inverseJoinColumnArrayValues
.add(new NestedAnnotationAttributeValue(new JavaSymbolName(
VALUE), joinColumnBuilder.build()));
}
joinTableAnnotationAttributes
.add(new ArrayAttributeValue<NestedAnnotationAttributeValue>(
new JavaSymbolName("inverseJoinColumns"),
inverseJoinColumnArrayValues));