2010-10-05 3 views
13

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

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

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

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

ответ

12

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

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

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

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

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

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

+0

Да, я читал о @RequiredArgsConstructor, но поскольку он стандартный в @Data, я его не добавлял. Мой вопрос: правильно ли я использовал аннотации, поскольку исходный программист использовал Lombok, но не использовал аннотации @NonNull, но вместо этого использовал явные конструкторы. Вы говорите, что ни одно из моих полей не является @NonNull, но внимательно посмотрите на мой код (второй блок), я аннотировал поля accessionCode и date с @NonNull. Теперь, поскольку Hibernate действительно нуждается в конструкторе no-args, будет ли это хороший стиль? @data @NoArgsConstructor (доступ = AccessLevel.PROTECTED) @RequiredArgsConstructor – FinalArt2005

+0

Да, это будет путь .. – Tim

+3

Хорошо, только для тех, кто также начинает использовать Ломбок, я только слышал, что @RequiredArgsConstructor не очень надежный, он принимает порядок полей в вашем классе для создания конструктора, поэтому, если кто-то другой изменяет этот порядок, ваш код, вызывающий конструктор, перестает работать, поэтому оказывается, что явный конструктор по-прежнему лучший выбор. Однако @NoArgsConstructor (access = AccessLevel.PROTECTED) представляется полезным, если вы используете Hibernate. Спасибо всем за вашу помощь. – FinalArt2005

1

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

Ниже приведена подробная информация о спящем режиме.

Hibernate Documentation

+0

Аннотации @Data прямо над классом def создадут этот конструктор по умолчанию, насколько я знаю, и из того, что я узнал до сих пор, аннотации @NonNull над полями заставят Ломбок сделать эти параметры полей в этом конструктор, чтобы вы дали значения для них, а также проверите, являются ли они нулевыми. Но так как я новичок в этом, мне было интересно, это только я или что оригинальный программист сделал здесь несколько небольших ошибок. – FinalArt2005

1

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

@NoArgsConstructor 
@RequiredArgsConstructor 
@AllArgsConstructor 

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