【问题标题】:Insert data into relationship table (many-to-many) with Spring boot使用 Spring Boot 将数据插入关系表(多对多)
【发布时间】:2018-10-22 16:25:03
【问题描述】:

我制作了一个包含一些用户的 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;
    }
}

一个组可以包含 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;
    }
}

我正在使用 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)
);

我设法通过创建这个新用户、将一个组传递给它的构造函数并调用我的 userDao.save() 方法来将一个用户链接到一个组:

userDao.save(new User(name, groups));

现在我想编辑我创建的用户并使他属于另一个组。 如何在不创建新用户的情况下做到这一点?

例如,我有这个用户,他不属于任何组:

INSERT INTO user VALUES(1, 'Jordan');

还有这些群体:

INSERT INTO group VALUES(1, 'Group 1');
INSERT INTO group VALUES(2, 'Group 2');

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

【问题讨论】:

    标签: java mysql spring-boot jpa many-to-many


    【解决方案1】:

    您必须使用您选择的 id 从数据库中选择一个 group 实体。您可以通过 findById 方法为该实体使用 JPA 接口,或者在接口中创建自己的自定义方法。

    当您拥有 group 的实体后,您可以将其添加User 实体字段 groups .之后,您保存用户实体

    同样的过程以双向关系传递到另一方

    推荐阅读:

    1. Difference between unidirectional and bidirectional associations
    2. A bidirectional association has two sides - owner side and an inverse side
    3. Hibernate ManyToMany persistance tutorial

    【讨论】:

      【解决方案2】:

      创建表如下:

      mysql> CREATE TABLE users (
          ->     id integer NOT NULL AUTO_INCREMENT, 
          ->     name varchar(255), 
          ->     PRIMARY KEY (id)
          -> );
      Query OK, 0 rows affected (0.24 sec)
      
      mysql> CREATE TABLE groups (
          ->     id integer NOT NULL AUTO_INCREMENT,
          ->     name varchar(255),
          ->     PRIMARY KEY (id)
          -> );
      Query OK, 0 rows affected (0.17 sec)
      
      mysql> CREATE TABLE group_users (
          ->     user_id int NOT NULL,
          ->     group_id int NOT NULL,
          ->     PRIMARY KEY (user_id, group_id),
          ->     CONSTRAINT group_user_ibfk_1
          ->     FOREIGN KEY (user_id) REFERENCES users(id),
          ->     CONSTRAINT group_user_ibfk_2
          ->     FOREIGN KEY (group_id) REFERENCES groups(id)
          -> );
      Query OK, 0 rows affected (0.23 sec)
      

      向其中插入虚拟数据:

      mysql> INSERT INTO user VALUES(1, 'Jordan');
      Query OK, 1 row affected (0.09 sec)
      
      mysql> INSERT INTO users VALUES(1, 'Jordan');
      Query OK, 1 row affected (0.08 sec)
      
      mysql> 
      mysql> INSERT INTO groups VALUES(1, 'Group 1');
      Query OK, 1 row affected (0.02 sec)
      
      mysql> INSERT INTO groups VALUES(2, 'Group 2');
      Query OK, 1 row affected (0.02 sec)
      
      mysql> insert into group_users values(1,1);
      Query OK, 1 row affected (0.05 sec)
      
      mysql> insert into group_users values(1,2);
      Query OK, 1 row affected (0.08 sec)
      

      表格中的实际数据如下所示:

      mysql> select * from users;
      +----+--------+
      | id | name   |
      +----+--------+
      |  1 | Jordan |
      +----+--------+
      1 row in set (0.00 sec)
      
      mysql> select * from groups;
      +----+---------+
      | id | name    |
      +----+---------+
      |  1 | Group 1 |
      |  2 | Group 2 |
      +----+---------+
      2 rows in set (0.00 sec)
      
      mysql> select * from group_users;
      +---------+----------+
      | user_id | group_id |
      +---------+----------+
      |       1 |        1 |
      |       1 |        2 |
      +---------+----------+
      2 rows in set (0.00 sec)
      

      加入所有表格后的数据将如下所示。

      mysql> select u.id user_id, u.name user_name,g.id group_id, g.name group_name from users u, groups g, group_users gu where u.id = gu.user_id and g.id = gu.group_id;
      +---------+-----------+----------+------------+
      | user_id | user_name | group_id | group_name |
      +---------+-----------+----------+------------+
      |       1 | Jordan    |        1 | Group 1    |
      |       1 | Jordan    |        2 | Group 2    |
      +---------+-----------+----------+------------+
      2 rows in set (0.05 sec)
      

      希望,您已经了解了设计,以及它将如何在您的情况下发挥作用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-08-18
        • 2018-12-29
        • 2011-12-23
        • 1970-01-01
        • 2013-07-20
        • 2019-04-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多