# joinTable

## Purpose

Customizes the join table used for undirectional one-to-many, many-to-many and primitive collection types.

## Examples

Basic collection type:

    class Book {
        static hasMany = [chapterPageCounts:Integer]    static mapping = {
            chapterPageCounts indexColumn:[name:"chapter_number", type:Integer],
                              joinTable:[column:"page_count"]}

Enum collection types:

    enum VehicleStatus { OFF, IDLING, ACCELERATING, DECELERATING }class Truck {    static hasMany = [states:VehicleStatus]    static mapping = {
            states joinTable:[name:'VEHICLE_STATUS_LOG', key:'TRUCK_ID', column:'STATUS']
        }
    }

Many-to-many:

    class Book {    String title
        static belongsTo = Author
        static hasMany = [authors:Author]    static mapping = {
            authors joinTable:[name:"mm_author_books", key:'mm_book_id' ]
        }
    }
    class Author {
        String name    static hasMany = [books:Book]    static mapping = {
            books joinTable:[name:"mm_author_books", key:'mm_author_id']
        }
    }

Unidirectional One-to-many:

    class Employee {
        static hasMany = [projects: Project]
        static mapping = {
            projects joinTable: [name: 'EMP_PROJ', column: 'PROJECT_ID', key: 'EMPLOYEE_ID']
        }
    }class Project {  }

## Description

Usage: `association_name(joinTable:map)`

Arguments:

- `name` - The table name
- `key` (optional) - The foreign key
- `column` (optional) - The inverse column

GORM has various strategies for mapping association types. Some of them, such as basic collection types and many-to-many associations, require the use of a join table. You can customize how this join table is created using the `joinTable` argument.