Наилучшая практика для создания моделей API с полями, созданными в базе данных - PullRequest
0 голосов
/ 19 октября 2019

Немного новичок в Spring, спрашиваю о лучших практиках:

Скажем, один из моих классов моделей выглядит так:

Entity
@Table(name="task")
@Getter @Setter @NoArgsConstructor @RequiredArgsConstructor
public class Task {


    @Id
    @NotNull
    private Long id; //this will be auto-generated in the database
    @NotNull
    private String name;
    private boolean completed;
    @Column(name="startdate", columnDefinition = "TIMESTAMPTZ")
    private LocalDateTime StartDate;
    @Column(columnDefinition = "TIMESTAMPTZ")
    private LocalDateTime deadline;
}

У меня есть стандартный класс DTO и репозиторий для Task. Но когда я создаю класс обслуживания, метод create может выглядеть так (очень упрощенно для иллюстрации):

  public Task create(Task t){
      try{
           return taskRepository.save(t);
      } catch(Exception e){
           //handle exception
      }
  }

Так вот в чем дело: у параметра t не будет идентификатора до того, как задача будет создана вбаза данных. Но id не должен быть нулевым. Я вижу несколько вариантов.

  1. Создайте объект taskDetails со всеми параметрами, кроме id и uuid, и аналогичный объект для всех других моих моделей. Может быть, хрупкий, потому что это другой класс, который нужно изменить, если я изменю Задачу.
  2. Параметр t будет Задачей с идентификатором 0. Но метод save() попытается сохранить его вместо того, чтобы позволить базе данных создатьзначение?
  3. Модель создания будет принимать параметры задачи в качестве отдельных аргументов, как в (String name, LocalDateTime startDate...). Но я не хочу включать все параметры, поэтому мне нужно несколько классов создания.
  4. Пусть поле id будет нулевым.

Это довольно распространенная ситуация в любом API, поэтому я предполагаю, что Spring имеет стандартный способ сделать это. Но я искал вокруг и пытался найти это, и я не могу. Какова лучшая практика здесь?

Если это обман, пожалуйста, направьте меня на ответ на вопрос.

ОБНОВЛЕНИЕ: Основываясь на ответе Шекхара, я исследовал и выяснил, что мне, вероятно, следует использовать @GeneratedValue(strategy = GenerationType.IDENTITY), потому что это говорит Спринг, что БД позаботился о создании поля. Предположительно это означает, что я должен избавиться от аннотации @NotNull. Но что, если есть другие поля, которые автоматически генерируются базой данных? Могу ли я использовать GenerationType.IDENTITY более одного раза?

1 Ответ

0 голосов
/ 20 октября 2019

Итак, я использовал @GeneratedValue(strategy = GenerationType.IDENTITY) для идентификации, а для других значений использовал @GeneratedValue(strategy = GenerationType.AUTO). Это означает, что моя java-программа генерировала идентификаторы, но это нормально, потому что они были просто случайными uuids, поэтому я установил их для генерации по умолчанию, а не всегда, поэтому, если моя программа предоставила uuid, БД не будет жаловаться.

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