Как получить информацию через @JoinTable с HATEOAS - PullRequest
0 голосов
/ 15 марта 2019

У меня есть 2 объекта: task и user. Одна задача может иметь несколько пользователей. Поэтому я использую аннотацию @jointable, как показано ниже:

@ManyToMany
@JoinTable(name = "tasks_users",
        joinColumns = @JoinColumn(name = "taskid"),
        inverseJoinColumns = @JoinColumn(name = "userid")
)
private Set<User> users = new HashSet<>();

Однако, когда я пытаюсь получить все задачи с помощью запроса GET, у меня есть только информация о задачах, но не информация о пользователях:

Получить все задания

{
    "_embedded": {
        "task": [
            {
                "taskname": "Football",
                "taskchief": "Jean Dupond",
                "startdate": "2019-02-18",
                "enddate": "2019-05-05",
                "status": 1,
                "_links": {
                    "self": {
                        "href": "http://localhost:8082/tasks/de7d9052-4961-4b4f-938a-3cd12cbe1f82"
                    }
                }
            },
            {
                "taskname": "Blockchain project",
                "taskchief": "Léo Dubois",
                "startdate": "2019-03-01",
                "enddate": "2019-06-24",
                "status": 1,
                "_links": {
                    "self": {
                        "href": "http://localhost:8082/tasks/425e7701-02c6-4de3-9333-a2459eece1c8"
                    }
                }
            }
        ]
    },
    "_links": {
        "self": {
            "href": "http://localhost:8082/tasks"
        }
    }
}

Это нормальное поведение?

Спасибо за ваши ответы и советы.

PS: Скажите, если вам нужен конкретный код, я его загрузю.

1 Ответ

1 голос
/ 15 марта 2019

Я думаю, вам нужно изменить тип выборки для загрузки ваших сущностей USERS.

По умолчанию в отношениях «многие ко многим» между двумя объектами JPA применяет загрузку LAZY.

Это означает, что ваши объекты будут загружаться только по требованию и, в частности, при первом вызове метода доступа.

Если вы измените тип извлечения на EAGER, то по умолчанию ПОЛЬЗОВАТЕЛЬ (-ы), связанные с объектами ЗАДАЧ, в вашем случае будут загружены в ваши коллекции ПОЛЬЗОВАТЕЛЕЙ.

Вы можете достичь этого, выполнив следующие действия:

@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name = "tasks_users",
        joinColumns = { @JoinColumn(name = "taskid") },
        inverseJoinColumns = { @JoinColumn(name = "userid") })
private Set<User> users = new HashSet<>();
...