Как управлять несколькими объектами с помощью JPA? - PullRequest
0 голосов
/ 15 февраля 2019

Контекст

Я пытаюсь создать простой API для изучения Spring Boot и JPA.Информация хранится в базе данных H2.

У меня есть 2 объекта: mission и user.

Несколько пользователей назначены на миссию.И пользователи могут назначаться на разные миссии.

Итак, у моего класса Mission есть атрибут private ArrayList<User> users;.

Цель

Моя цельсоздать несколько запросов как:

  • (запрос GET) IP/missions/123456/users: получить всех пользователей, назначенных для миссии 123456
  • (запрос PUT) IP/missions/456789: назначить пользователеймиссия 456789

Итак, связали обе сущности.

Проблематично

Но я не знаю, как хранить / связывать информациюотносительно mission и user.Хороший способ - создать «ассоциативную таблицу» со схемой Assignements(id_user, id_mission)?

Спасибо за помощь!

Редактировать 1: Код

Entity Mission

@Entity
public class Mission{

    @Id
    private String id;
    private String name;
    private Date start;
    private Date end;
    private ArrayList<User> users;
    private int status;

    public Mission() {
    }

    public Mission(String name, Date start, Date end) {
        this.name = name;
        this.start = start;
        this.end = end;
        this.status = 0;
    }

    // getters and setters
}

Entity User

@Entity
public class User {

    @Id
    private String id;
    private String name;

    public User() {
    }

    public User(String name) {
        this.name = name;
    }

    // getters and setters
}

SQL

Я используюSQL скрипт.В настоящее время скрипт выглядит следующим образом:

INSERT INTO mission (id, name, start, end, status) VALUES ('de7d9052-4961-4b4f-938a-3cd12cbe1f82', 'mission 1', '2019-02-11', '2019-02-13', 0)
INSERT INTO mission (id, name, start, end, status) VALUES ('425e7701-02c6-4de3-9333-a2459eece1c8', 'mission 2', '2019-02-10', '2019-02-15', 0)

Редактировать 2: Новый код (с @ManyToMany)

Сущности

@Entity
public class Mission {

    @Id
    private String missionid;
    private String namemission;
    private Date start;
    private Date end;
    @ManyToMany
    @JoinTable(name = "mission_user",
        joinColumns = @JoinColumn(name = "missionid"),
        inverseJoinColumns = @JoinColumn(name = "userid")
    )
    private Set<User> users = new HashSet<>();
    private int status;

    public Mission() {}

    public Mission(String name, Date start, Date end) {
        this.namemission = name;
        this.start = start;
        this.end = end;
        this.status = 0;
    }
}

@Entity
public class User {

    @Id
    private String iduser;
    private String nomuser;
    @ManyToMany(mappedBy = "users")
    private Set<Mission> missions = new HashSet<>();

    public User() {}

    public User(String nom) {
        this.nomuser = nom;
    }

}

Хранилища

@RepositoryRestResource(collectionResourceRel = "mission")
public interface MissionResource extends JpaRepository<Mission, String> {
    ...
}

@RepositoryRestResource(collectionResourceRel = "user")
public interface UserResource extends JpaRepository<User, String> {
    ...
}

Контроллер покоя

@RestController
@RequestMapping(value = "/missions", produces = MediaType.APPLICATION_JSON_VALUE)
@ExposesResourceFor(Mission.class)
public class MissionRepresentation {
    private final MissionResource missionResource;
    private final UserResource userResource;

    public MissionRepresentation(MissionResource missionResource, UserResource userResource) {
        this.missionResource = missionResource;
        this.userResource = userResource;
    }

    // mapping
}

Ответы [ 2 ]

0 голосов
/ 16 февраля 2019

Класс миссии будет иметь:

@Entity
public class Mission {
...
    @ManyToMany(mappedBy = "missions")
    private List<User> users;
...
}

, а класс пользователя будет иметь:

@Entity
public class User {
...

    @ManyToMany(mappedBy = "users")
    private List<Mission> missions;
...
}

, это создаст таблицу в вашей базе данных с именем что-то вроде: missions_uesrs и будетиметь MissionId и userId как только столбцы.

0 голосов
/ 15 февраля 2019

Лучше всего было бы реализовать объединяющий стол, как вы сказали.Это было бы что-то вроде:

create table mission_user (
    mission_id int,
    user_id int,
    primary key (mission_id, user_id)
)

Затем @ManyToMany, используя эту таблицу в качестве отображения или сущности типа MissionUser и сопоставив User и Mission как @OneToMany.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...