@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;catalog 是可选属性,用于指定数据库实例名,一般来说 persistence.xml 文件中必须指定数据库 url,url 中将包含数据库实例。
作用与 catalog 属性作用一致,可自行测试。
指定连接表(中间表)的名称;如果不指定名称,则使用默认表名,默认名称规则为“主表名称_副表名称”。例如:
@JoinTable(name = "cust_user")指定连接表(中间表)中那个字段为连接表的外键列,该外键列引用拥有关联的实体的主表。例如:
@JoinTable(name = "cust_user",
joinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id")
)指定连接表(中间表)中那个字段为连接表的外键列,该外键列引用的是不拥有关联的实体的主表。例如:
@JoinTable(name = "cust_user",
inverseJoinColumns = @JoinColumn(name = "user_ext_id", referencedColumnName = "id")
)为连接表(中间表)指定一个或多个唯一约束。例如:
@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;