@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;