Я переписывание некоторые грязный кода, который управляет базой данных, и увидел, что оригинальный программист создал класс переведенный в базу данных, как так:Явный конструктор с использованием Ломбока?
(я удалил ненужный код, который не имеет никакого смысла в этом вопросе)
@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;
}
}
Я все еще новичок в Hibernate и пользуюсь Lombok, но не будет ли это делать то же самое и не будет ли Lombok автоматически создавать необходимый конструктор для вас?
@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());
}
Кроме того, оригинальный программист этого кода говорит, что он позволяет заголовок быть «нулевым», но он явно создал конструктор, который необходимо значение для заголовка. Я что-то пропустил или это немного противоречиво?
Да, я читал о @RequiredArgsConstructor, но поскольку он стандартный в @Data, я его не добавлял. Мой вопрос: правильно ли я использовал аннотации, поскольку исходный программист использовал Lombok, но не использовал аннотации @NonNull, но вместо этого использовал явные конструкторы. Вы говорите, что ни одно из моих полей не является @NonNull, но внимательно посмотрите на мой код (второй блок), я аннотировал поля accessionCode и date с @NonNull. Теперь, поскольку Hibernate действительно нуждается в конструкторе no-args, будет ли это хороший стиль? @data @NoArgsConstructor (доступ = AccessLevel.PROTECTED) @RequiredArgsConstructor – FinalArt2005
Да, это будет путь .. – Tim
Хорошо, только для тех, кто также начинает использовать Ломбок, я только слышал, что @RequiredArgsConstructor не очень надежный, он принимает порядок полей в вашем классе для создания конструктора, поэтому, если кто-то другой изменяет этот порядок, ваш код, вызывающий конструктор, перестает работать, поэтому оказывается, что явный конструктор по-прежнему лучший выбор. Однако @NoArgsConstructor (access = AccessLevel.PROTECTED) представляется полезным, если вы используете Hibernate. Спасибо всем за вашу помощь. – FinalArt2005