什么时候需要使用@JoinColumn注解?数据库已有参照完整性还需配置吗
结论先行
你当前的代码写法完全不需要添加@JoinColumn注解,数据库层面的参照完整性和JPA的关联注解属于不同层级的能力,互相没有依赖关系。
分场景说明
场景1:你不需要JPA自动处理实体关联(就是你当前的写法)
你现在把book_aut_id映射为普通的int类型字段bookAutId,这种场景下你只需要自己维护这个字段的取值,数据库的外键约束会自动帮你做校验:如果你存入的bookAutId在author表中不存在,数据库会直接抛出约束违反错误,完全可以正常工作,不需要加任何关联注解。
场景2:你需要JPA自动完成关联查询/级联操作
如果你希望查询Book实体的时候,JPA自动帮你关联查询出对应的Author对象,不需要你自己手动再查一次author表,那你就需要调整实体写法,这时候才需要用到@OneToOne和@JoinColumn:
@Entity @Table(name="book") @Data @NoArgsConstructor @AllArgsConstructor public class Book { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "book_id") private int bookId; @Column(name = "book_title") private String bookTitle; // 删掉原来的int类型bookAutId字段,改为关联Author对象 @OneToOne // name填book表的外键字段名,referencedColumnName填关联表author的主键字段名 @JoinColumn(name = "book_aut_id", referencedColumnName = "aut_id") private Author author; }
注意你注释里写的@JoinColumn(name="aut_id")是错误写法,name属性必须填当前表(book)里的外键字段名,也就是book_aut_id。
核心边界澄清
- 数据库的外键约束是数据库层的校验规则:只负责校验写入的数据是否符合参照完整性,和JPA有没有加关联注解没有任何关系,就算你实体类里完全不写JPA注解,只要表结构里定义了外键,约束就会生效。
- JPA的
@JoinColumn、关联注解是ORM层的功能配置:只是用来告诉JPA怎么完成对象和关系型数据的映射、怎么处理关联查询/级联操作,你不需要这些能力的话完全可以不用。
内容的提问来源于stack exchange,提问作者the_novice
相关产品推荐
相关产品推荐

