Spring 没有 Id 字段的构造函数

Spring Constructor without Id field

我想为更多实体创建一个构造函数,但没有 Id 字段。你建议我做什么? @AllArgsConstructor 注释不好,因为那时会包含 Id 字段,@NoArgsConstructor 不会为此目的完成它的工作,并且 @RequiredArgsConstructor 只有在您有 final 或 @NoNull 字段时才有效。我是否应该将其他列设置为 @NoNull 或 final?另外,哪种方法更好?我应该将我的 Id 设为 UUID String 类型还是带有 @GeneratedValue 注释的 Long?

要回答有关 Lombok 构造函数注释的第一个问题,您是对的,@RequiredArgsConstructor@AllArgsConstructor@NoArgsConstructor 不适合省略 id 的构造函数。 但是,只要要实例化您的 id,您就可以手动创建自己的构造函数,省去 id 属性。

以下示例由 Student()Student(studentId, name)Student(name)(省略 id)构成

长整型ID

@Getter
@Setter
@ToString
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table(name= "student")
public class Student {
    @Id
    @GeneratedValue
    @Column(name = "student_id", nullable = false)
    private Long studentId;

    private String name;

    public Student(String name){
        this.name = name;
    }
}

作为 UUID 的 ID

@Getter
@Setter
@ToString
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table(name= "student")
public class Student {
    @Id
    @Column(name = "student_id", nullable = false)
    private UUID studentId;

    private String name;

    public Student(String name){
        this.studentId = UUID.randomUUID();
        this.name = name;
    }
}

由于studentId在任何一种情况下都会生成,无论如何它都会在持久化到数据库时收到一个值,所以我们不需要分配一个。

关于您的问题另外,哪种方法更好?我应该将我的 Id 作为 UUID String 类型还是带有 @GeneratedValue 注释的 Long?,这完全取决于您,并且取决于应用程序及其预期用途,但如果您 checkout this discussion about UUID vs GUID 我认为它会有所帮助您决定 UUID 是否符合您的需求。