Явный конструктор, использующий Lombok? - PullRequest
15 голосов
/ 05 октября 2010

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

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

@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());
}

Кроме того, оригинальный программист этого кода говорит, что он допускает, чтобы заголовок был «нулевым», но он явно создал конструктор, которому нужно значение для заголовка.Я что-то упустил или это немного противоречиво?

Ответы [ 4 ]

15 голосов
/ 05 октября 2010

Посмотрите на @NoArgsConstructor, @RequiredArgsConstructor, @AllArgsConstructor.

Поведение конструктора @Data похоже на @RequiredArgsConstructor:

@ RequiredArgsConstructor генерирует конструктор с 1 параметром для каждого поле, которое требует специальной обработки. Все конечные поля получают параметр, как а также любые поля, которые помечены как @NonNull, которые не инициализированы где они объявлены.

Учитывая, что ни одно из ваших полей не является final или @NonNull, это приведет к конструктору без аргументов. Однако это не самый выразительный способ добиться такого поведения.

В этом случае вам, вероятно, понадобится @NoArgsConstructor (возможно, в сочетании с @AllArgsConstructor) для четкой передачи предполагаемого поведения, как также указано в документации:

Некоторые Java-конструкции, такие как спящий режим и поставщик услуг Интерфейс требует без аргументов конструктор. Эта аннотация полезна в первую очередь в сочетании с любым @Data или другой конструктор генерация аннотаций.

1 голос
/ 11 апреля 2014

Если вы используете @Data с полем @NonNull и по-прежнему хотите использовать конструктор noargs, вы можете попробовать добавить все 3 аннотации вместе

@NoArgsConstructor
@RequiredArgsConstructor
@AllArgsConstructor

Видимо, старый intelliJ ошибка, которую я повторил в Eclipse Kepler и lombok v0.11.4

1 голос
/ 05 октября 2010

Этот бит противоречив, ты прав. Я не использовал Lombok раньше, но с hibernate, если вы хотите иметь возможность создавать bean-компонент и сохранять его, вам нужен конструктор по умолчанию, как указано выше, насколько я знал. Он использует Constructor.newInstance () для создания новых объектов.

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

Документация Hibernate

0 голосов
/ 02 февраля 2019
@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}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...