При создании приложения для отдыха у меня была большая проблема. Он заключается во вложении элементов и в неправильном понимании того, как правильно передать их через контроллер покоя. У меня есть что-то вроде следующей структуры:
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToMany(mappedBy = "user", fetch = FetchType.EAGER)
@JsonManagedReference
private List<TaskCard> taskCards;
}
public class TaskCard {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToMany(mappedBy = "taskCard", fetch = FetchType.LAZY)
@JsonManagedReference
private List<Task> tasks;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "user_id")
@JsonBackReference
private User user;
}
public class Task {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "task_card_id")
@JsonBackReference
private TaskCard taskCard;
}
Все эти классы являются сущностями. Как вы уже догадались, у меня есть контроллер отдыха для каждого из этих классов. Здесь начинаются проблемы. В моей голове структура моего API для отдыха должна выглядеть примерно так: /users/1/taskkards/1/tasks/1/
. Это выглядит сложно, верно? Точно! Когда я пытаюсь просто получить пользователя, то в принципе нет никаких проблем, я могу просто отправить /users
запрос, который обработает мой контроллер остальных пользователей. Но если мы перейдем к карте задач, то проблемы уже есть. Оказывается, мой TaskCardController должен выглядеть следующим образом:
@RestController
@RequestMapping("users/{userId}/taskcards")
public class TaskCardController {
// get, post, update, delete methods
}
Это уже означает, что я должен также перенести сюда информацию о пользователе, чтобы убедиться, что карта задач принадлежит ему. Но в то же время, поскольку у моего пользователя есть поле карточек задач, откуда я могу получить это значение? Нужно ли go в хранилище и искать его в базе данных или просто делать что-то подобное?
@GetMapping
public List<TaskCard> getAllTaskCards(@PathVariable("userId") User user) {
return user.getTaskCards();
}
Это вообще нормально, что такое вложение возникает? Зачем мне тогда создавать контроллеры для TaskCard и Task, если я могу просто получить их от пользователя? Это тоже одна из проблем. Если мы еще дойдем до этой задачи, то здесь все очень плохо. Мой контроллер задач должен выглядеть так?
@RestController
@RequestMapping("users/{userId}/taskcards/{cardId}/tasks")
public class TaskController {
// get, post, update, delete methods
}
Что-то говорит мне нет. Это будет ужасно, если мне нужно будет получить пользователя и карточку задачи для запроса задачи. Что мне делать в этой ситуации? Как правильно спроектировать мой API отдыха?