JPA 中 @JoinColumn 的 name 和 referencedColumnNam

时间:2025-03-11 16:38:34

JPA 中 @JoinColumn 的 name 和 referencedColumnName 属性怎么辨别

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


就是我们在数据库设计时常说的一对多、多对一、多对多关系。因此,@JoinColumn 
必须和这些关系注解一起使用,否则是没有意义的。

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

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

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

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

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

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