Явный конструктор с использованием ломбок?

StackOverflow https://stackoverflow.com/questions/3864391

  •  27-09-2019
  •  | 
  •  

Вопрос

Я переписываю какой-то грязный код, который управляет базой данных и увидел, что оригинальный программист создал класс, сопоставленный в базу данных, как так:

(Я удалил ненужный код, который не имеет цели в этом вопросе)

@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 () для создания новых объектов.

Вот какая-то гибернатная документация, которая входит в более подробно.

Hibernate Documentation

Если вы используете @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}
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top