Java 使用数据库生成的字段创建api模型的最佳实践?
Spring有点新,询问最佳实践: 假设我的一个模型类如下所示: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
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
之外的所有参数,并为我的所有其他模型创建一个类似的对象。可能是脆弱的,因为如果我改变任务,这是另一个需要改变的类save()
方法会尝试保存它而不是让数据库创建值吗(字符串名称,LocalDateTime startDate…
)。但是我可能不想包含所有的参数,所以我需要多个create类李>
id
字段为空更新:根据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
}
}