//$Id: JoinTable.java 11282 2007-03-14 22:05:59Z epbernard $
//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
package javax.persistence;

import java.lang.annotation.Retention;
import java.lang.annotation.Target;

import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.*;

/**
 * This annotation is used in the mapping of associations. It is specified on the owning
 * side of a many-to-many association, or in a unidirectional one-to-many association.
 *
 * If the JoinTable annotation is missing, the default values of the annotation elements apply.
 * The name of the join table is assumed to be the table names of the associated primary tables
 * concatenated together (owning side first) using an underscore.
 *
 * @author Emmanuel Bernard
 */
@Target({METHOD, FIELD})  @Retention(RUNTIME)
public @interface JoinTable {
	/**
	 * The name of the join table.
	 *
	 * Defaults to the concatenated names of the two associated primary entity tables,
	 * separated by an underscore
	 */
	String name() default "";
	/**
	 * The catalog of the table.
	 *
	 * Defaults to the default catalog.
	 */
	String catalog() default "";
	/**
	 * The schema of the table.
	 *
	 * Defaults to the default schema for user.
	 */
	String schema() default "";
	/**
	 * The foreign key columns of the join table which reference the primary table of the
	 * entity owning the association (i.e. the owning side of the association).
	 *
	 * Uses the same defaults as for JoinColumn.
	 */
	JoinColumn[] joinColumns() default {};
	/**
	 * The foreign key columns of the join table which reference the primary table of the entity
	 * that does not own the association (i.e. the inverse side of the association).
	 *
	 * Uses the same defaults as for JoinColumn
	 */
	JoinColumn[] inverseJoinColumns() default {};
	/**
	 * Unique constraints that are to be placed on the table. These are only used if table
	 * generation is in effect.
	 *
	 * Defaults to no additional constraints
	 */
	UniqueConstraint[] uniqueConstraints() default {};
}
