听不懂@joincolumn(name=“user_id”)

cant understand @joincolumn(name="user_id")

提问人:Sreenath 提问时间:11/3/2023 更新时间:11/3/2023 访问量:18

问:

我在实体中创建了两个单独的类,

在用户类中声明的变量是:

private Long id;
private String name;

在 Book 类中声明的变量为:

private Long id;
private String title;
private String author;
private boolean borrowed;
@ManyToOne
@JoinColumn(name = "user_id")
private User borrowedBy;

我听不懂@JoinColumn什么是user_id? 并解释一下@manytoone是如何工作的?

spring-boot jpa spring-annotations 多对一 joincolumn

评论


答:

0赞 Timur Celikel 11/3/2023 #1

如果你看一下典型的 JPA 日志,Hibernate DDL 类型为 'create',你可以看到幕后发生了什么:

create table book (
    borrowed boolean not null,
    id bigint generated by default as identity,
    user_id bigint,
    author varchar(255),
    title varchar(255),
    primary key (id)
)

 create table user (
    id bigint generated by default as identity,
    name varchar(255),
    primary key (id)
)

JPA 将在 Book 表中创建一个名为 user_id 的列(如果它尚不存在,具体取决于 DDL 类型)。这将是保存要联接到用户表的标识符的列。

你甚至可以看到 Hibernate 自动为我们创造了一个外键约束:

alter table if exists book 
   add constraint FK1wxwagv6cm3vjrxqhmv884hir 
   foreign key (user_id) 
   references user

默认情况下,除非指定,否则 book 表中的 user_id 列将包含用户表的主键值。在我们的示例中,在 User class id 字段中定义的值。

我在此处包含了 User 和 Book 的实体:

@Entity
@Data
public class Book {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String title;
    private String author;
    private boolean borrowed;
    @ManyToOne
    @JoinColumn(name = "user_id")
    private User borrowedBy;
} 

@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;
}