使用 Spring Boot 将数据插入关系表(多对多)
Posted
技术标签:
【中文标题】使用 Spring Boot 将数据插入关系表(多对多)【英文标题】:Insert data into relationship table (many-to-many) with 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 组?
【问题讨论】:
【参考方案1】:您必须使用您选择的 id 从数据库中选择一个 group 实体。您可以通过 findById 方法为该实体使用 JPA 接口,或者在接口中创建自己的自定义方法。
当您拥有 group 的实体后,您可以将其添加到 User 实体字段 groups .之后,您保存用户实体。
同样的过程以双向关系传递到另一方组。
推荐阅读:
-
Difference between unidirectional and bidirectional associations
A bidirectional association has two sides - owner side and an inverse side
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)
希望,您已经了解了设计,以及它将如何在您的情况下发挥作用。
【讨论】:
以上是关于使用 Spring Boot 将数据插入关系表(多对多)的主要内容,如果未能解决你的问题,请参考以下文章
Spring数据JPA-休眠多对多关系在链接实体表中插入null
spring boot 学习心得 使用JpaRepository注解自定义SQL查询数据库多表查询