Вставить данные в таблицу отношений (многие ко многим) с помощью Spring boot - PullRequest
0 голосов
/ 12 мая 2018

Я сделал приложение 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?

Ответы [ 2 ]

0 голосов
/ 12 мая 2018

Вы должны выбрать группу сущность из базы данных с id на ваш выбор.Вы либо используете JPA интерфейс для этой сущности с методом findById или создаете свой собственный метод в интерфейсе.

Если у вас есть сущность для group , вы добавляете его в Пользователь поле сущности groups .После этого вы сохраняете пользователя сущность .

Тот же процесс переходит на другую сторону группу в двунаправленном отношении.

Рекомендуемое чтение:

  1. Разница между однонаправленными и двунаправленными ассоциациями
  2. Двунаправленная ассоциация имеет две стороны -сторона владельца и обратная сторона
  3. Hibernate Учебное пособие по сохранению ManyToMany
0 голосов
/ 12 мая 2018

Создать таблицу как:

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)

Надеюсь, вы разобрались с дизайном, и как он будет работать в вашем случае.

...