Немного новичок в 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 не должен быть нулевым. Я вижу несколько вариантов.
- Создайте объект
taskDetails
со всеми параметрами, кроме id
и uuid
, и аналогичный объект для всех других моих моделей. Может быть, хрупкий, потому что это другой класс, который нужно изменить, если я изменю Задачу. - Параметр t будет Задачей с идентификатором 0. Но метод
save()
попытается сохранить его вместо того, чтобы позволить базе данных создатьзначение? - Модель создания будет принимать параметры задачи в качестве отдельных аргументов, как в
(String name, LocalDateTime startDate...)
. Но я не хочу включать все параметры, поэтому мне нужно несколько классов создания. - Пусть поле
id
будет нулевым.
Это довольно распространенная ситуация в любом API, поэтому я предполагаю, что Spring имеет стандартный способ сделать это. Но я искал вокруг и пытался найти это, и я не могу. Какова лучшая практика здесь?
Если это обман, пожалуйста, направьте меня на ответ на вопрос.
ОБНОВЛЕНИЕ: Основываясь на ответе Шекхара, я исследовал и выяснил, что мне, вероятно, следует использовать @GeneratedValue(strategy = GenerationType.IDENTITY)
, потому что это говорит Спринг, что БД позаботился о создании поля. Предположительно это означает, что я должен избавиться от аннотации @NotNull
. Но что, если есть другие поля, которые автоматически генерируются базой данных? Могу ли я использовать GenerationType.IDENTITY
более одного раза?