Мы используем 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 аннотаций и искажая код.
К сожалению, в Lombok я не нашел способа агрегировать аннотации к некоторым мета-аннотациям, как в Spring.
Вопрос: есть ли в Lombok готовая аннотация для создания такого публично неизменяемые объекты?
Или же
есть ли способ объявить локальную метааннотацию?
хорошо, это означает, что пока нет возможности агрегировать аннотации ((





Вы по-прежнему можете использовать аннотации @Data, но предоставьте частные сеттеры
@Data
@AllArgsConstructor
@NoArgsConstructor
@Entity
public class Company {
@Id
@Setter(AccessLevel.PRIVATE)
private int id;
@Setter(AccessLevel.PRIVATE)
private String name;
}
спасибо, он создает еще один шаблон: установите уровень доступа для каждого свойства.
Да, определенно согласен. Однако вы можете использовать какие-то объекты DTO, которые являются неизменяемыми и работают с ними. В этом случае вы должны использовать свой объект @Entity только для связи с БД. Что насчет lombok, я не уверен, что вы сможете сделать то, о чем упоминали ранее
У вас должна быть возможность использовать более легкую версию:
@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. Должно быть, согласно журнал изменений, но я не смог заставить его работать в быстрой попытке.
но тогда дополнительный частный конструктор применяется ко всем объектам в пакете. И наличие файла lombok.config вместо аннотации не облегчает чтение и понимание сущностей.
Конструктор @radistao No-arg будет применяться ко всем сущностям, которые используют аннотацию @Data или @Value, да. Однако это не должно быть проблемой, так как это частный. Я также не понимаю, почему наличие этого набора в lombok.config должно затруднять понимание сущностей, поскольку частный конструктор - это просто деталь реализации, а не API сущности. Однако я понимаю, что это решение далеко не идеально, так как у вас все еще есть две аннотации (включая уродливый @Setter(AccessLevel.NONE)) вместо одной. Очевидно, что агрегированные аннотации (если бы они были доступны) были бы лучшим выбором.
См., Например, groups.google.com/forum/m/#!topic/project-lombok/CnvM6MbRSw8