@JoinColumn 注解

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

指定实体中外键字段的名称。name 不是必填的,你可以不写,采用默认值(假如使用 @OneToOne 进行一对一映射,此时 name 默认值格式为“副表名_副表主键名”)。如果要自己定义外键名称的话可以设置。

(1)如果连接是使用外键映射策略的 @OneToOne 或 @ManyToOne 映射,则外键列在源实体的表中或可嵌入的表中。

(2)如果连接是使用外键映射策略的单向 @OneToMany 映射,则外键在目标实体的表中(副表中)。

(3)如果连接是 @ManyToMany 映射或 @OneToOne 或双向 @ManyToOne / @OneToMany 映射,则外键在连接表中(中间表)。

(4)如果连接是针对集合元素,则外键在集合表中。

referencedColumnName

指定此外键列引用的列的名称。

(1)当与 @JoinClumn 注解修饰实体以外的实体关系映射一起使用时,引用的列位于目标实体的表中。

(2)当与单向 @OneToMany 外键映射一起使用时,引用的列位于源实体的表中。

(3)在 @JoinTable 注释中使用时,引用的键列位于拥有实体的实体表中,如果连接是反向连接定义的一部分,则为反向实体。

(4)在 @CollectionTable 映射中使用时,引用的列位于集合包含的实体表中。

unique

指定属性是否是唯一键,是 @UniqueConstraint 注解的快捷方式;当唯一键约束仅为单个字段时非常有用。对于与作为外键一部分的主键相对应的连接列,没有必要显式指定此项,这是因为主键具有唯一性。

nullable

外键列是否为空。

insertable

指定该列是否包含在持久性提供程序生成的 INSERT SQL 语句中。

updatable

指定该列是否包含在持久性提供程序生成的 UPDATE SQL 语句中。

columnDefinition

指定为列生成 DDL 时使用的 SQL 片段。

table

包含列的表的名称。 如果未指定表,则假定该列位于使用实体的主表中。

(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 注解教程中详细介绍。

说说我的看法
全部评论(
没有评论
关于
本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明,如果原文没有版权声明,请来信告知:hxstrive@outlook.com
公众号