Tôi đang viết lại một số mã lộn xộn mà quản lý một cơ sở dữ liệu, và thấy rằng các lập trình viên ban đầu tạo ra một lớp ánh xạ tới cơ sở dữ liệu như vậy:Nhà xây dựng rõ ràng bằng Lombok?
(Tôi đã gỡ bỏ mã không cần thiết mà không có mục đích trong câu hỏi này)
@Entity
@Data
@EqualsAndHashCode(callSuper = false, of = { "accessionCode", "header", "date" })
@SuppressWarnings("PMD.UnusedPrivateField")
public class PDBEntry implements Serializable {
@Id
@NaturalId
@NotEmpty
@Length(max = 4)
private String accessionCode;
@NaturalId
@NotEmpty
private Date date;
@NaturalId
// We allow for the header to be 'null'
private String header;
private Boolean isValidDssp;
@Temporal(TemporalType.TIMESTAMP)
private Date lastUpdated = new Date(System.currentTimeMillis());
protected PDBEntry(){}
public PDBEntry(String accessionCode, String header, Date date){
this.accessionCode = accessionCode;
this.header = header;
this.date = date;
}
}
Tôi vẫn là người mới bắt đầu ở Hibernate và sử dụng Lombok, nhưng điều này sẽ không làm điều tương tự và Lombok sẽ tự động tạo hàm tạo cần thiết cho bạn?
@Entity
@Data
@SuppressWarnings("PMD.UnusedPrivateField")
public class PDBEntry implements Serializable {
@Id
@NaturalId
@NotEmpty
@NonNull
@Length(max = 4)
private String accessionCode;
@NaturalId
@NotEmpty
@NonNull
private Date date;
@NaturalId
// We allow for the header to be 'null'
private String header;
private Boolean isValidDssp;
@Temporal(TemporalType.TIMESTAMP)
private Date lastUpdated = new Date(System.currentTimeMillis());
}
Ngoài ra, lập trình viên ban đầu của mã này cho biết tiêu đề này là 'null', nhưng ông đã tạo một hàm tạo cần giá trị cho tiêu đề một cách rõ ràng. Tôi đang thiếu một cái gì đó hoặc là một chút mâu thuẫn?
Có, tôi đã đọc về @RequiredArgsConstructor, nhưng vì nó là tiêu chuẩn trong @Data, tôi không thêm nó. Câu hỏi của tôi là liệu tôi có sử dụng chú thích một cách chính xác vì lập trình ban đầu đã sử dụng Lombok nhưng không sử dụng chú thích @NonNull, nhưng thay vào đó sử dụng các hàm tạo rõ ràng. Bạn nói không có trường nào của tôi là @NonNull, nhưng nhìn kỹ vào mã của tôi (hộp thứ hai), tôi đã chú thích các trường accessionCode và date với @NonNull. Bây giờ kể từ khi Hibernate thực sự dường như yêu cầu một nhà xây dựng không-args, đây sẽ là một phong cách tốt? @Data @NoArgsConstructor (truy cập = AccessLevel.PROTECTED) @RequiredArgsConstructor – FinalArt2005
Yup, đó sẽ là con đường để đi .. – Tim
Ok, chỉ với bất kỳ ai cũng bắt đầu sử dụng Lombok, tôi vừa nghe rằng @RequiredArgsConstructor không phải là rất mạnh mẽ, nó lấy thứ tự của các trường trong lớp của bạn để xây dựng hàm khởi tạo, vì vậy nếu ai đó thay đổi thứ tự này, mã của bạn gọi hàm khởi tạo ngừng hoạt động, vì vậy chỉ ra hàm khởi tạo rõ ràng vẫn là lựa chọn tốt hơn. Các @NoArgsConstructor (access = AccessLevel.PROTECTED) tuy nhiên dường như có ích nếu bạn đang sử dụng Hibernate. Cảm ơn tất cả mọi người đã giúp đỡ của bạn. – FinalArt2005