##included template. Generates the @JoinTable, @JoinColumn or @JoinColumns annotation.
##Assumes that the context has a "role" object representing the generated AssociationRole
##
##macro joinColumn uses $column, $referencedColumn
#macro (joinColumn $column $referencedColumn)
#set ($members = "name=$customizer.quote($column.joinColumnName)")
#if( !$referencedColumn.primaryKey || $referencedColumn.partOfCompositePrimaryKey )
#set ($members = "$members, referencedColumnName=$customizer.quote($referencedColumn.name)")
#end
#if( $customizer.generateDDLAnnotations )
#if ($column.unique && !$column.primaryKey)
#set ($members = "$members, unique=true")
#end
#if (!$column.nullable)
#set ($members = "$members, nullable=false")
#end
#end
#if ($customizer.generateDDLAnnotations && !$role.association.joinTable && !$role.referrerTable.isColumnUpdateInsert($role, $column))
#set ($members = "$members, insertable=false, updatable=false")
#end
@JoinColumn($members)#end
##
##
##
#if ($role.association.joinTable)
#set ($joinTable = $role.association.joinTable)
	@JoinTable(
		name="${joinTable.joinTableAnnotationName}"
		, joinColumns={
#foreach ($column in $role.referrerColumns)
#set ($referencedColumn = $role.getReferencedColumn(${column.name}))
##$referencedColumn is the column in the join table
			#joinColumn($referencedColumn $column)
#if ($velocityCount < $role.referrerColumns.size() )
,
#end			
#end

			}
		, inverseJoinColumns={
#foreach ($column in $role.referencedColumns)
#set ($referencedColumn = $role.getReferrerColumn(${column.name}))
##$referencedColumn is the column in the join table
			#joinColumn($referencedColumn $column)
#if ($velocityCount < $role.referencedColumns.size() )
,
#end			
#end

			}
		)
#else
#if ($role.referrerColumns.size() == 1)
#set ($column = $role.referrerColumns.get(0))
#set ($referencedColumn = $role.getReferencedColumn(${column.name}))
#set ($referencedTableName = $role.getReferencedTable().getName() )
#set( $referencedTablePkName = $role.getReferencedTable().getPrimaryKeyColumn().name )
#set( $computedJoinColumnName = "${role.propertyName}_${referencedTablePkName}" )
#if($column.name.toUpperCase() != $computedJoinColumnName.toUpperCase() )
	#joinColumn($column $referencedColumn)

#elseif( $customizer.generateDDLAnnotations )
	#joinColumn($column $referencedColumn)

#end
#else
	@JoinColumns({
#foreach ($column in $role.referrerColumns)
#set ($referencedColumn = $role.getReferencedColumn(${column.name}))
		#joinColumn($column $referencedColumn)
#if ($velocityCount < $role.referrerColumns.size() )
,
#else

#end
#end		
		})
#end
#end