Lombok: публично неизменяемый (через сеттеры) объект с конструктором all и без аргументов, hash, equals и toString - PullRequest
0 голосов
/ 02 июля 2018

Мы используем Lombok для наших сущностей, чтобы сгенерировать этот общий шаблон, такой как конструкторы, hash / equals и toString.

В то же время мы хотели бы сохранить наши объекты неизменными. К сожалению, мы не можем сделать полностью неизменяемыми (например, со свойствами final), потому что процессорам JPA / Hibernate требуется конструктор без аргументов и устанавливаются свойства для отражения.

  • @lombok.Data не подходит, потому что создает публичные сеттеры

  • @lombok.Value не подходит, потому что он задает свойства final, и Hibernate не может установить их поверх отражения.

что нас действительно устраивает:

@Getter 
@AllArgsConstructor 
@NoArgsConstructor 
@EqualsAndHashCode 
@ToString
@Entity
public class Company {
    @Id
    private int id;
    private String name;
}

Но это опять-таки создает для нас образец, копируя каждый раз 5 аннотаций и портя код.

К сожалению, в Ломбоке я не нашел способа объединять аннотации в метааннотации, как в Spring.

Вопрос: есть ли в Ломбоке нестандартная аннотация для генерации таких общедоступных объектов ?

Или

есть ли способ объявить локальную метааннотацию ?

Ответы [ 2 ]

0 голосов
/ 02 июля 2018

Вы должны использовать более легкую версию:

@Data
@Setter(AccessLevel.NONE)
@Entity
public class Company {
    @Id
    private int id;
    private String name;
}

со следующим в lombok.config файле:

lombok.noArgsConstructor.extraPrivate = true

Я не уверен, работает ли конфигурация extraPrivate в Lombok 1.18.0. Это должно, согласно changelog , но я не смог заставить его работать в быстрой попытке.

0 голосов
/ 02 июля 2018

Вы по-прежнему можете использовать @Data аннотации, но можете предоставить частные сеттеры

@Data
@AllArgsConstructor 
@NoArgsConstructor 
@Entity
public class Company {
    @Id
    @Setter(AccessLevel.PRIVATE)
    private int id;
    @Setter(AccessLevel.PRIVATE)
    private String name;
}
...