@Target({ElementType.FIELD, ElementType.METHOD}) 
@Retention(RetentionPolicy.RUNTIME)
public @interface Value
{
    /**
     * Types of the values. This can be determined if using JDK1.5 generics
     * but is required otherwise. Multiple types can be specified if the
     * implementation supports multiple types.
     * @return the types of values
     */
    Class[] types() default {};

    /**
     * Whether the value  is to be stored serialized (into a single column of a
     * join table).
     * @return Whether the value is to be stored serialized (into a join table)
     */
    String serialized() default "";

    /** Whether this value is embedded. 
     * @return whether this value is embedded
     */
    String embedded() default "";

    /**
     * The embedded mapping for the value.
     * @return the embedded mapping for the value
     */
    Embedded[] embeddedMapping() default {};

    /**
     * Whether the value is dependent on the owner (and will be deleted 
     * when the owner is deleted).
     * @return whether the value is dependent on the owner
     */
    String dependent() default "";

    /**
     * Name of the table for the value.
     * @return the name of the table for the value
     */
    String table() default "";

    /**
     * Name of the column to store the value in.
     * @return the name of the column to store the value in
     */
    String column() default "";

    /**
     * Delete action to apply to any foreign key for the value.
     * @return delete action to apply to any foreign key for the value
     */
    ForeignKeyAction deleteAction() default ForeignKeyAction.UNSPECIFIED;

    /**
     * Update action to apply to any foreign key for the value.
     * @return update action to apply to any foreign key for the value
     */
    ForeignKeyAction updateAction() default ForeignKeyAction.UNSPECIFIED;

    /**
     * Whether the value column(s) should be indexed.
     * @return whether the value column(s) should be indexed.
     */
    String indexed() default "";

    /** The name of the index to generate. 
     * @return the name of the index
     */
    String index() default "";

    /**
     * Whether the element column(s) contents should be considered unique
     * @return whether the element column(s) contents should be considered unique
     */
    String unique() default "";

    /**
     * The name of the unique key constraint to generate.
     * @return the name of the unique key constraint
     */
    String uniqueKey() default "";

    /**
     * Name of a member in the key class where this value is stored.
     * @return the name of a member in the key class where this value is stored
     */
    String mappedBy() default "";

    /**
     * The column(s) for the value.
     * @return the column(s) for the value
     */
    Column[] columns() default {};

    /** Generate or assume a foreign key constraint exists on the column
     * or columns associated with this join. Specify "true" or "false".
     * @return whether to generate or assume a foreign key constraint
     */
    String generateForeignKey() default "";

    /** Name for a generated foreign key constraint.
     * @return the name of the generated foreign key constraint
     */
    String foreignKey() default "";

    /** Vendor extensions.
     * @return the vendor extensions
     */
    Extension[] extensions() default {};
}
