##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}" )
#set( $isDefaultJoinColumnName =  $column.isDefaultJoinColumnName( ${role.propertyName}) )
#if( ! $isDefaultJoinColumnName )
	#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