使用 Spring boot 将数据插入关系表(多对多)

Jor*_*oel 5 java mysql many-to-many jpa spring-boot

我制作了一个包含一些用户的 Spring Boot 应用程序。这些用户可以属于 0 个、一个或多个组(为了更好的可视化,我省略了一些代码行):

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    private String name;

    @ManyToMany
    @JoinTable(
            name = "group_user",
            joinColumns = {@JoinColumn(name = "user_id")},
            inverseJoinColumns = {@JoinColumn(name = "group_id")}
    )
    private List<Group> groups = new ArrayList<>();

    public User(String name, List<Group> groups) {
        this.name = name;
        this.groups = groups;
    }
}
Run Code Online (Sandbox Code Playgroud)

一个组可以包含 0 个、一个或多个用户。

@Entity
public class Group {

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

    private String name;

    @ManyToMany(mappedBy = "groups")
    private List<User> users = new ArrayList<>();

    public Group(String name, List<User> users) {
        this.name = name;
        this.users = users;
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在使用 MySQL,并且创建了 3 个表:

CREATE TABLE user (
    id integer NOT NULL AUTO_INCREMENT, 
    name varchar(255), 
    PRIMARY KEY (id)
);

CREATE TABLE group (
    id integer NOT NULL AUTO_INCREMENT,
    name varchar(255),
    PRIMARY KEY (id)
);

CREATE TABLE group_user (
    user_id int NOT NULL,
    group_id int NOT NULL,
    PRIMARY KEY (user_id, group_id),
    KEY group_id (group_id),
    CONSTRAINT group_user_ibfk_1
    FOREIGN KEY (user_id) REFERENCES user (id),
    CONSTRAINT group_user_ibfk_2
    FOREIGN KEY (group_id) REFERENCES group (id)
);
Run Code Online (Sandbox Code Playgroud)

我通过创建这个新 User、将组传递给其构造函数并调用 userDao.save() 方法,成功地将用户链接到组:

userDao.save(new User(name, groups));
Run Code Online (Sandbox Code Playgroud)

现在我想编辑我创建的用户并让他属于另一个组。如何在不创建新用户的情况下执行此操作?

例如,我有一个不属于任何组的用户:

INSERT INTO user VALUES(1, 'Jordan');
Run Code Online (Sandbox Code Playgroud)

还有这些群体:

INSERT INTO group VALUES(1, 'Group 1');
INSERT INTO group VALUES(2, 'Group 2');
Run Code Online (Sandbox Code Playgroud)

现在,我如何(在 Java 中)将我的用户链接到组 1 和组 2?

Mik*_*iko 4

您必须从数据库中选择具有您选择的ID的实体。您可以通过findById方法使用该实体的 JPA接口,也可以在接口中创建您自己的自定义方法。

当您拥有该组的实体后,您可以将其添加用户实体字段中。之后保存用户实体

相同的过程适用于双向关系中的另一方组。

推荐阅读:

  1. 单向关联和双向关联的区别
  2. 双向关联有两侧 - 所有者侧和反向侧
  3. Hibernate ManyToMany 持久化教程