JPA中@JoinColumn的name和referencedColumnName属性的区别及说明

 更新时间:2024年05月18日 10:52:07   作者:Hommmmmmm  
这篇文章主要介绍了JPA中@JoinColumn的name和referencedColumnName属性的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

一、@JoinColumn

@JoinColumn 的作用就是声明关联关系的,什么是关联关系?

就是我们在数据库设计时常说的一对多、多对一、多对多关系。

因此,@JoinColumn 必须和这些关系注解一起使用,否则是没有意义的。

二、name 和 referencedColumnName

刚开始接触这两个属性会觉得很难理解,特别是看书的时候总是分不清,看下面的例子:

// Address表对应的Entity
Class Address{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    ...
}

// User表对应的Entity
Class User{
    ...
    // 显然下面这个属性表示每个User对应一个Address,思考一下:
    // 平时我们在设计数据库的时候会怎么处理这种关系?我一般对这
    // 一对一的关系,都会直接在User表中添加一个字段指向Address
    // 的主键,而下面注解确实是这样做的。
     @OneToOne
    @JoinColumn(name = "address", referencedColumnName = "id")
    private Address address;
    ...
}

其实这两个属性指向的都是数据库字段,也就是数据库里面真真实实存在的表的字段,而不是我们在Java程序中的成员变量名。

如上面的代码,它表示在User表中添加一个address字段,这个字段的取值就是 Address 表的 id,也就是主键,也就说明了它通过这个字段关联着两张表,这其实就是我们在学习数据库时处理一对一关系的一种方法,是不是很熟悉?

所以,一定记住,两个属性都是指数据库里的字段!!!!

  • name:当前表的字段
  • referencedColumnName:引用表对应的字段,如果不注明,默认就是引用表的主键

实际上数据库中的表结构如下, User 的 address 字段关联着 Address 的 id 字段:

User 表属性语义
idID
address地址主键
其他属性
Address 表属性语义
idID
其他属性

看了上面的表是不是就很清楚了?

很多网上的解释说 name 指的是外键名、实体字段名,其实都不是很准确,容易混淆,还是要动手做一下。

了解了JoinColumn 不妨进一步了解下 @JoinTable 的 JoinColumn 属性,这个也是比较容易混淆的。

三、@JoinTable 的 JoinColumn 属性

@JoinTable 一般和 @ManyToMany 使用,处理多对多关系,需要两个 Entity 有中间关系表。

“一对多”一般不会使用关系表,而选择将“一”直接作为“多”的一个属性。

这也是我们学数据库时听老师讲的常用方法。

JoinTable 有很多属性,但我们了解基本的 JoinColumn 相关属性即可,和我们上面说的一样,JoinColumn 实际上指的是数据库的字段

下面从 《Spring Data JPA 从入门到精通》截取的示例:

@Entity
public class Blog{
    @ManyToMany
    @JoinTable(name="blog_tag_relation",
                joinColumns=@joinColumn(name="blog_id",referencedColumnName="id"),
                inverseJoinColumn=@joinColumn(name="tag_id",referencedColumnName="id"))
    private List<Tag> tags = new ArrayList<Tag>();
}

看起来好长,但实际上只用到 @JoinTable 只有三个属性:

  • name:数据库里的中间关系表名(blog_tag_relation)
  • joinColumns:当前表在关系表的链接字段(blog_id),一般我们会用 id
  • inverseJoinColumn:另一张表在关系表的链接字段(tag_id),一般我们会用 id

注意到我们使用 @JoinColumn 指定中间表的列,一定记住它使用的是数据库字段。

对应的表结构如下:

Blog 表属性语义
idID
其他属性
Tag 表属性语义
idID
其他属性
blog_tag_relation 表属性语义
blog_idBlog 的 ID
tag_idTag 的 ID

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java中的ArrayList容量及扩容方式

    Java中的ArrayList容量及扩容方式

    这篇文章主要介绍了Java中的ArrayList容量及扩容方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • Java常见踩坑记录之异常处理

    Java常见踩坑记录之异常处理

    程序运行时发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常,下面这篇文章主要给大家介绍了关于Java常见踩坑记录之异常处理的相关资料,需要的朋友可以参考下
    2022-01-01
  • Spring + Spring Boot + MyBatis + MongoDB的整合教程

    Spring + Spring Boot + MyBatis + MongoDB的整合教程

    这篇文章主要给大家介绍了关于Spring + Spring Boot + MyBatis + MongoDB的整合教程,文中通过图文以及示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
    2017-12-12
  • Mybatis Plus代码生成器(时间管理大师)

    Mybatis Plus代码生成器(时间管理大师)

    这篇文章主要介绍了Mybatis Plus代码生成器(时间管理大师)的相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • java更改图片大小示例分享

    java更改图片大小示例分享

    这篇文章主要介绍了java更改图片大小示例,方法中指定路径 ,旧文件名称 ,新文件名称,n 改变倍数就可以完成更改图片大小,需要的朋友可以参考下
    2014-03-03
  • java反射机制的一些学习心得小结

    java反射机制的一些学习心得小结

    这篇文章主要给大家介绍了关于java反射机制的一些学习心得,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • Java实例讲解注解的应用

    Java实例讲解注解的应用

    JAVA注解 Annotation(注解)是JDK1.5及以后版本引入的。它可以用于创建文档,跟踪代码中的依赖性,甚至执行基本编译时检查。注解是以‘@注解名’在代码中存在的
    2022-06-06
  • IDEA使用jformdesigner插件做管理系统MVC架构的步骤和实现思路

    IDEA使用jformdesigner插件做管理系统MVC架构的步骤和实现思路

    在 IntelliJ IDEA 中结合 JFormDesigner 插件,通过 Swing 框架实现一个管理系统的 MVC 架构是一种经典的开发方式,以下是具体的步骤和实现思路,包含从项目创建到 MVC 架构的核心代码实现,需要的朋友可以参考下
    2024-12-12
  • Java快速入门掌握类与对象及变量的使用

    Java快速入门掌握类与对象及变量的使用

    类和对象是两种以计算机为载体的计算机语言的合称。对象是对客观事物的抽象,类是对对象的抽象。类是一种抽象的数据类型;变量就是可以变化的量,存储在内存中—个可以拥有在某个范围内的可变存储区域
    2022-04-04
  • java agent 使用及实现代码

    java agent 使用及实现代码

    java agent的作用可以在字节码这个层面对类和方法进行修改的技术,能够在不影响编译的情况下,修改字节码。本文主要给大家讲解java agent 使用及实现代码,感兴趣的朋友一起看看吧
    2018-07-07

最新评论