默认情况下,JPA 持续性提供程序在映射多对多关联(或在单向的一对多关联中)的拥有方上的实体关联时使用一个连接表。连接表名称及其列名均在默认情况下指定,且 JPA 持续性提供程序假设:在关系的拥有方上的实体主表中,每个主键列有一个连接列。

通过表关联的方式来映射一对多或者多对多的关系时,要使用@JoinTable这个标记。该标记的定义如下所示。

@Target({METHOD, FIELD})

public @interface JoinTable {

String name() default "";

String catalog() default "";

String schema() default "";

JoinColumn[] joinColumns() default {};

JoinColumn[] inverseJoinColumns() default {};

UniqueConstraint[] uniqueConstraints default {};

}

在使用此@JoinTable标记时,需要注意以下几个问题。

l         该标记与@Table注释类似,用于标注用于关联的表。可以标注在方法或者属性上,属性catalog、schema和uniqueConstraint与@Table注释中的属性意义类似,请读者参阅@Table注释说明的部分。

l         name属性为连接两个表的表名称。若不指定,则使用默认的表名称如下所示。

“表名1”+“_”+“表名2”。

例如以上的代码中,如果不指定name的名称,默认的保存关系的名称如下所示。

“customer_address”。

l         joinColumns属性表示,在保存关系中的表中,所保存关联关系的外键的字段。并配合@JoinColumn标记使用。

例如以下的映射配置,表示字段customer_id为外键关联到customer表中的id字段。

joinColumns={

@JoinColumn(name="customer_id",referencedColumnName="id")

}

l         inverseJoinColumns属性与joinColumns属性类似,它保存的是保存关系的另一个外键字段。

例如以下的映射配置,表示字段address_id为外键关联到address表中的id字段。

inverseJoinColumns={

@JoinColumn(name="address_id",referencedColumnName="id")

}

提示:@JoinTable不仅能够定义一对多的关联,也可以定义多对多表的关联

@JoinColumn

默认情况下,在实体关联中,JPA 持续性提供程序使用一个基于现有名称(如字段或属性名称)的数据库模式,以便它可以自动确定要使用的单个连接列(包含外键的列)。

在以下条件下使用 @JoinColumn

@JoinColumn 属性

属性 必需 说明

columnDefinition

默认值:空 String

JPA 使用最少量 SQL 创建一个数据库表列。

如果需要使用更多指定选项创建列,请将 columnDefinition 设置为在针对列生成 DDL 时希望 JPA 使用的 String SQL 片断。

insertable

默认值:true

默认情况下,JPA 持续性提供程序假设它可以插入到所有表列中。

如果该列为只读,请将 insertable 设置为 false

name

默认值:如果使用一个连接列,则 JPA 持续性提供程序假设外键列的名称是以下名称的连接:

  • 引用关系属性的名称 +“_”+ 被引用的主键列的名称。

  • 引用实体的字段名称 +“_”+ 被引用的主键列的名称。

如果实体中没有这样的引用关系属性或字段(请参阅 @JoinTable),则连接列名称格式化为以下名称的连接:实体名称 +“_”+ 被引用的主键列的名称。

这是外键列的名称。如果连接针对“一对一”或“多对一”实体关系,则该列位于源实体的表中。如果连接针对“多对多”实体关系,则该列位于连接表(请参阅 @JoinTable)中。

如果连接列名难于处理、是一个保留字、与预先存在的数据模型不兼容或作为数据库中的列名无效,请将 name 设置为所需的 String 列名。

nullable

默认值:true

默认情况下,JPA 持续性提供程序假设允许所有列包含空值。

如果不允许该列包含空值,请将 nullable 设置为 false

referencedColumnName

默认值:如果使用一个连接列,则 JPA 持续性提供程序假设在实体关系中,被引用的列名是被引用的主键列的名称。

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

要指定其他列名,请将 referencedColumnName 设置为所需的 String 列名。

table

默认值:JPA 持续性提供程序假设实体的所有持久字段存储到一个名称为实体类名称的数据库表中(请参阅 @Table)。

如果该列与辅助表关联(请参阅 @SecondaryTable),请将 name 设置为相应辅助表名称的 String名称,如示例 1-8 所示。

unique

默认值:false

默认情况下,JPA 持续性提供程序假设允许所有列包含重复值。

如果不允许该列包含重复值,请将 unique 设置为 true

updatable

默认值:true

默认情况下,JPA 持续性提供程序假设它可以更新所有表列。

如果该列为只读,则将 updatable 设置为 false

下例显示了如何使用此批注使 JPA 将数据库表 Employee 列 ADDR_ID 用作连接列。

@Entity public class Employee implements Serializable { ... @ManyToOne @JoinColumn(name="ADDR_ID") public Address getAddress() { return address; } }

@JoinTable和@JoinColumn的更多相关文章

  1. Associations marked as mappedBy must not define database mappings like @JoinTable or @JoinColumn【报错】

    自己的项目没有测通  可能是自己项目原因——因为自己项目中级联关系的类涉及太多 自己的项目[这样的配置报错] @OneToMany(fetch=FetchType.LAZY,cascade = { C ...

  2. Hibernate的关联映射——单向1-1关联

    Hibernate的关联映射--单向1-1关联 对于单向的1-1关联关系,需要在持久化类里增加代表关联实体的成员变量,并为该成员变量添加setter方法和getter方法.从持久化类的代码上看,单向1 ...

  3. hibernate基于注解的维护权反转:@OneToMany(mappedBy=)

    背景说明:首先是SSH环境下,对象基于注解的方式映射到数据库: 昨天遇到一个比较纠结的问题,@OneToMany(mappedBy="xxx"), mappedBy属性有什么用,然 ...

  4. JavaEE(14) - JPA关联映射

    1. 单向N-1关联映射 2. 单向1-1关联映射 3. 单向1-N关联映射 4. 单向N-N关联映射 5. 双向1-1关联映射 6. 双向1-N关联映射 7. 双向N-N关联映射 1. 单向N-1关 ...

  5. JPA 系列教程 异常 集锦

    异常1.hibernate升级到3.5版本 异常信息摘要: Associations marked as mappedBy must not define database mappings like ...

  6. Hibernate Annotation (Hibernate 注解)

    简介: 传统上,Hibernate的配置依赖于外部 XML 文件:数据库映射被定义为一组 XML 映射文件,并且在启动时进行加载. 然而现在借助新的 Hibernate   Annotation 库, ...

  7. Spring boot data JPA数据库映射关系 : @OneToOne,@OneToMany,@ManyToMany

    问题描述 在利用Spring boot data JPA进行表设计的时候,表对象之间经常存在各种映射关系,如何正确将理解的映射关系转化为代码中的映射关系是关键之处. 解决办法 概念理解 举例:在公司的 ...

  8. spring-data-jpa一对多多对一多对多关联

    一对多.多对一 Country类 @Entity @Table(name = "Country") public class Country { @Id //sequence id ...

  9. Spring Boot学习随记

    由于早年在管理领域耕耘了一段时间,完美错过了Spring的活跃期, 多少对这个经典的技术带有一种遗憾的心态在里面的, 从下面的我的生涯手绘图中大概可以看出来我的经历. 最近由于新介入到了工业数字化领域 ...

随机推荐

  1. VS快速定位文件、代码插件——DPack

    之前用Myeclipse开发一个Java项目,发现其中“Open Resource”(Ctrl+Shirft+R)的功能比较好用,回到.Net后就找了找VS相应的功能,试了几个后觉得Dpack比较好用 ...

  2. OD: ActiveX Vulnerabilities

    通过一个精心构造的页面 exploit 第三方软件中的 ActiveX 已经成为一种惯用攻击手段,众多知名软件公司都曾被发现其注册的 ActiveX 中存在严重的缓冲区溢出漏洞,一个被广泛使用的第三方 ...

  3. 监听tomcat服务器启动/关闭并从配置文件中读取参数进行初始化

    监听tomcat服务器启动/关闭很简单(2步): 1. 建立一个类实现ServletContextListener接口,重写其中的方法(contextDestroyed和contextInitiali ...

  4. 如何在Eclipse中给main方法加参数

    在main方法中有一个args参数,那么如何给args参数赋值呢? public class TestMain { public static void main(String[] args) { f ...

  5. 不用修改nginx的高并发合并回源架构

    nginx的连接都是一对一的,想改成一对多,比较麻烦,所以曾经看完了Nginx代码想改成一对多,我还是没改成,后来改变了一下思路想到一个更简单的方案,而且不失并发性能,还容易控制,下面先给出下面的图: ...

  6. PHP判断是否微新浏览器

    $inwechat = false; $user_agent = $_SERVER['HTTP_USER_AGENT']; if (strpos($user_agent, 'MicroMessenge ...

  7. 一个使用CSocket类的网络通信实例

    http://www.cppblog.com/changshoumeng/archive/2010/05/14/115413.html 3.8 一个使用CSocket类的网络通信实例 本例采用CSoc ...

  8. C语言+ODBC+SQL 操作(向SQL里面添加数据)

    为了节省时间,我就引用上一节的数据库的表和C语言的结构体数组,在结构体数组中添加数据,清空数据库数据. 第一步查询:SQLBindParameter函数的用法. SQLRETURN SQLBindPa ...

  9. xPath技术

    在dom4j中如何使用xPath技术 1)导入xPath支持jar包 . jaxen-1.1-beta-6.jar 2)使用xpath方法 List<Node> selectNodes(& ...

  10. string标准库的使用

    string s; s.empty() 如果 s 为空串,则返回 true,否则返回 false. s.size() 返回 s 中字符的个数 s[n] 返回 s 中位置为 n 的字符,位置从 开始计数 ...