@JoinTable 注解

@JoinTable 注解用于关联映射,它是在关联的拥有方进行配置。使用 @JoinTable 注解将创建一个连接表,也称为“中间表”。

连接表(join table)通常用于 many-to-many 和单向 one-to-many 关联的映射。@JoinTable 还可以用于映射双向 many-to-one/one-to-many 关联、单向 many-to-one 关系和 one-to-one 关联(双向和单向)。

当连接表(join table)用于在关系的拥有方将关系映射到可嵌入类时,包含的实体(而不是可嵌入类)被认为是关系的所有者。

如果缺少 @JoinTable 注释,则应用注释元素的默认值。连接表的名称被假定为使用下划线连接在一起(首先是拥有侧)的相关主表的表名。

实例

如果在 @JoinTable 中不指定任何属性值,JPA 提供商将采用默认值。下面是 OpenJPA 在不指定属性下采用的默认值,代码如下:

/**
 * 采用 @JoinTable 默认值
 * name:主表名_副表名,如:userjointable_userjointableext
 * joinColumns:外键,主表主键,格式:主表名_主键名。如:USERJOINTABLE_ID
 * inverseJoinColumns:外键,副表,格式:副表属性名_主键名。如:USEREXTS_ID
 * uniqueConstraints:唯一约束,为每个列创建唯一约束。如:USEREXTS_ID 和 USERJOINTABLE_ID
 * 连接表格SQL如下:
 * CREATE TABLE `userjointable_userjointableext` (
 *   `USERJOINTABLE_ID` int(11) DEFAULT NULL,
 *   `USEREXTS_ID` int(11) DEFAULT NULL,
 *   KEY `I_SRJNLXT_ELEMENT` (`USEREXTS_ID`),
 *   KEY `I_SRJNLXT_USERJOINTABLE_ID` (`USERJOINTABLE_ID`)
 * ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 */
@OneToMany(cascade = CascadeType.ALL)
@JoinTable
private List<UserJoinTableExt> userExts;

下面自定义 @JoinTable 中的 name、joinColumns 和 inverseJoinColumns 属性值,代码如下:

/**
 * 自定义 @JoinTable 中的 name、joinColumns 和 inverseJoinColumns 属性值
 * 连接表格SQL如下:
 * CREATE TABLE `cust_user` (
 *   `user_id` int(11) DEFAULT NULL,
 *   `user_ext_id` int(11) DEFAULT NULL,
 *   KEY `I_CST_USR_ELEMENT` (`user_ext_id`),
 *   KEY `I_CST_USR_USER_ID` (`user_id`)
 * ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 */
@OneToMany(cascade = CascadeType.ALL)
@JoinTable(name = "cust_user",
    joinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id"),
    inverseJoinColumns = @JoinColumn(name = "user_ext_id", referencedColumnName = "id")
)
private List<UserJoinTableExt> userExts;

@JoinTable 属性

catalog

catalog 是可选属性,用于指定数据库实例名,一般来说 persistence.xml 文件中必须指定数据库 url,url 中将包含数据库实例。

schema

作用与 catalog 属性作用一致,可自行测试。

name 连接表名称

指定连接表(中间表)的名称;如果不指定名称,则使用默认表名,默认名称规则为“主表名称_副表名称”。例如:

@JoinTable(name = "cust_user")

joinColumns 连接表主表外键 

指定连接表(中间表)中那个字段为连接表的外键列,该外键列引用拥有关联的实体的主表。例如:

@JoinTable(name = "cust_user",
    joinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id")
)

inverseJoinColumns 连接表副表外键

指定连接表(中间表)中那个字段为连接表的外键列,该外键列引用的是不拥有关联的实体的主表。例如:

@JoinTable(name = "cust_user",
    inverseJoinColumns = @JoinColumn(name = "user_ext_id", referencedColumnName = "id")
)

uniqueConstraints 表唯一约束

为连接表(中间表)指定一个或多个唯一约束。例如:

@JoinTable(name = "cust_user",
    joinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id"),
    inverseJoinColumns = @JoinColumn(name = "user_ext_id", referencedColumnName = "id"),
    uniqueConstraints = {
        @UniqueConstraint(name = "unique_user_id", columnNames = {"user_id"}),
        @UniqueConstraint(name = "unique_user_ext_id", columnNames = {"user_ext_id"})
    }
)

上面映射将创建如下数据表,SQL语句如下:

CREATE TABLE `cust_user` (
  `user_id` int(11) DEFAULT NULL,
  `user_ext_id` int(11) DEFAULT NULL,
  UNIQUE KEY `unique_user_id` (`user_id`),
  UNIQUE KEY `unique_user_ext_id` (`user_ext_id`),
  KEY `I_CST_USR_ELEMENT` (`user_ext_id`),
  KEY `I_CST_USR_USER_ID` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号