Явный конструктор с использованием ломбок?
Вопрос
Я переписываю какой-то грязный код, который управляет базой данных и увидел, что оригинальный программист создал класс, сопоставленный в базу данных, как так:
(Я удалил ненужный код, который не имеет цели в этом вопросе)
@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;
}
}
Я все еще новичок в гибернации и использую ломбок, но не будет ли это сделать то же самое и не будет ли ломбок автоматически создавать необходимый конструктор для вас?
@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());
}
Кроме того, оригинальный программист этого кода говорит, что он позволяет заголовому быть «нулевым», но он явно создал конструктор, который нуждается в значении для заголовка. Я что-то упускаю или это немного противоречиво?
Решение
Посмотри на @NoArgsConstructor, @RequiredArgsConstructor, @AllArgsConstructor
.
Поведение конструктора @Data
как @RequiredArgsConstructor
:
@Requiredargsconstructor генерирует конструктор с 1 параметром для каждого поля, который требует специального обращения. Все окончательные поля получают параметр, а также любые поля, которые помечены как @nonnull, которые не инициализируются, где они объявлены.
Учитывая, что ни один из ваших областей либо final
или @NonNull
, это приведет к конструктору отсутствия аргументов. Однако это не самый выразительный способ достижения этого поведения.
Что вы, вероятно, хотите в этом случае, это @NoArgsConstructor
(необязательно в сочетании с @AllArgsConstructor
), чтобы четко сообщить предполагаемое поведение, как также указано в документации:
Некоторые конструкции Java, такие как Hibernate и интерфейс поставщика услуг, требуют конструктора NO-ARGS. Эта аннотация полезна главным образом в сочетании с @Data или одним из других конструкторов, генерирующих аннотации.
Другие советы
Этот бит противоречит, что вы правы. Я не использовал Ломбок раньше, но с помощью Hibernate, если вы хотите, чтобы иметь возможность создать боб и сохранить, что вам нужен конструктор по умолчанию, как указано выше, я знаю. Он использует Contructor.NewInstance () для создания новых объектов.
Вот какая-то гибернатная документация, которая входит в более подробно.
Если вы используете @data с полем @nonnull, и все еще хотите, чтобы Noargs-конструктор, вы можете попробовать добавить все 3 аннотации вместе
@NoArgsConstructor
@RequiredArgsConstructor
@AllArgsConstructor
Видимо старый intellij ошибка, которую я сделал реплицирую в Eclipse Kepler и Lombok V0.11.4
@NoArgsConstructor,
@RequiredArgsConstructor,
@AllArgsConstructor
Создавайте конструкторы, которые не принимают аргументов, один аргумент на финальное / ненулевое поле или ненутреннее поле или один аргумент для каждого поля. Прочитай это Ломбок-проект
@Data
@RequiredArgsConstructor /*Duplicate method Someclass() in type Someclass*/
@NoArgsConstructor(access=AccessLevel.PRIVATE, force=true) /*Duplicate method Someclass() in type Someclass*/
@Entity
public class Someclass {
@Id
private String id;
private String name;
private Type type;
public static enum Type { X , Y, Z}
}
Исправлено его, сделав финал переменных участников
@Data
@RequiredArgsConstructor
@NoArgsConstructor(access=AccessLevel.PRIVATE, force=true)
@Entity
public class Someclass {
@Id
private final String id;
private final String name;
private final Type type;
public static enum Type { X , Y, Z}
}