Java 使用数据库生成的字段创建api模型的最佳实践?

Java 使用数据库生成的字段创建api模型的最佳实践?,java,api,spring-mvc,Java,Api,Spring Mvc,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 pri

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和存储库类,用于
任务
。但是,当我创建服务类时,create方法可能是这样的(为了便于说明,非常简化):

所以问题是:在数据库中创建任务之前,参数t不会有id。但是id不应该为null。我看到了多种选择

  • 创建一个
    taskDetails
    对象,该对象包含除
    id
    uuid
    之外的所有参数,并为我的所有其他模型创建一个类似的对象。可能是脆弱的,因为如果我改变任务,这是另一个需要改变的类
  • 参数t将是id为0的任务。但是
    save()
    方法会尝试保存它而不是让数据库创建值吗
  • 创建模型将接受任务的参数作为单独的参数,如
    (字符串名称,LocalDateTime startDate…
    )。但是我可能不想包含所有的参数,所以我需要多个create类
  • id
    字段为空
  • 这在任何API中都是非常常见的情况,所以我假设Spring有一种标准的方法来实现这一点。但我一直在四处寻找,试图找到它,但我找不到。这里的最佳实践是什么

    如果这是一个骗局,请告诉我答案


    更新:根据Shekhar的回答,我研究并得出我可能应该使用
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    ,因为这告诉Spring db正在处理字段的生成。大概这意味着我应该去掉
    @NotNull
    注释。但是,如果数据库自动生成了其他字段,该怎么办?我可以多次使用
    GenerationType.IDENTITY

    因此,我所做的是使用
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    作为标识,并使用
    @GeneratedValue(strategy=GenerationType.AUTO)
    。这意味着我的java程序正在生成标识,但这没关系,因为它们只是随机的uuid,所以我将它们设置为默认生成,而不是总是这样,如果我的程序提供了uuid,db不会抱怨

    也许将您不想保留的其他字段标记为transient会有所帮助
      public Task create(Task t){
          try{
               return taskRepository.save(t);
          } catch(Exception e){
               //handle exception
          }
      }