JPA 中 @JoinColumn 注解用来定义主键字段和外键字段的对应关系(如果要映射的字段/列本身就是主键,则可以省略该注解)。注解源码如下:
@Target({METHOD, FIELD}) @Retention(RUNTIME) public @interface JoinColumn { String name() default ""; String referencedColumnName() default ""; boolean unique() default false; boolean nullable() default true; boolean insertable() default true; boolean updatable() default true; String columnDefinition() default ""; String table() default ""; }
@JoinColumn 属性详细说明如下:
指定实体中外键字段的名称。name 不是必填的,你可以不写,采用默认值(假如使用 @OneToOne 进行一对一映射,此时 name 默认值格式为“副表名_副表主键名”)。如果要自己定义外键名称的话可以设置。
(1)如果连接是使用外键映射策略的 @OneToOne 或 @ManyToOne 映射,则外键列在源实体的表中或可嵌入的表中。
(2)如果连接是使用外键映射策略的单向 @OneToMany 映射,则外键在目标实体的表中(副表中)。
(3)如果连接是 @ManyToMany 映射或 @OneToOne 或双向 @ManyToOne / @OneToMany 映射,则外键在连接表中(中间表)。
(4)如果连接是针对集合元素,则外键在集合表中。
指定此外键列引用的列的名称。
(1)当与 @JoinClumn 注解修饰实体以外的实体关系映射一起使用时,引用的列位于目标实体的表中。
(2)当与单向 @OneToMany 外键映射一起使用时,引用的列位于源实体的表中。
(3)在 @JoinTable 注释中使用时,引用的键列位于拥有实体的实体表中,如果连接是反向连接定义的一部分,则为反向实体。
(4)在 @CollectionTable 映射中使用时,引用的列位于集合包含的实体表中。
指定属性是否是唯一键,是 @UniqueConstraint 注解的快捷方式;当唯一键约束仅为单个字段时非常有用。对于与作为外键一部分的主键相对应的连接列,没有必要显式指定此项,这是因为主键具有唯一性。
外键列是否为空。
指定该列是否包含在持久性提供程序生成的 INSERT SQL 语句中。
指定该列是否包含在持久性提供程序生成的 UPDATE SQL 语句中。
指定为列生成 DDL 时使用的 SQL 片段。
包含列的表的名称。 如果未指定表,则假定该列位于使用实体的主表中。
(1)如果联接用于使用外键映射策略的 @OneToOne 或 @ManyToOne 映射,则为源实体(主表)或可嵌入表的名称。
(2)如果连接用于使用外键映射策略的单向 @OneToMany 映射,则为目标实体的表的名称。
(3)如果连接是 @ManyToMany 映射或 @OneToOne 或双向 @ManyToOne / @OneToMany 映射,则为联接表的名称。
(4)如果联接用于元素集合,则为集合表的名称。
注意:不能单独使用 @JoinColumn 注解,该注解需要配合 @OneToOne、@ManyToOne、@OneToMany 一起使用,单独使用没有意义。
可以通过 @JoinColumns 注解定义多个字段的关联关系。@JoinColumns 的源码如下:
@Target({METHOD, FIELD}) @Retention(RUNTIME) public @interface JoinColumns { JoinColumn[] value(); }
关于更多 @JoinColumns 注解的用法,将在后续的 @OneToOne、@ManyToOne、@OneToMany 注解教程中详细介绍。