jpa - Lombok:公开不可变(over setters)对象,具有所有参数和无参数构造函数、散列、equals 和 toString

标签 jpa constructor entity immutability lombok

我们为我们的实体使用 Lombok 来生成通用样板,例如构造函数、散列/等于和 toString。

与此同时,我们希望保持我们的对象不可变。不幸的是,我们不能使它完全不可变(例如使用 final 属性),因为 JPA/Hibernate 处理器需要无参数构造函数并通过反射设置属性。

  • @lombok.Data 不适合,因为它创建了公共(public) setter

  • @lombok.Value 不适合,因为它使属性 final 并且 Hibernate 无法通过反射设置它们。

真正适合我们的是:

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

但这又为我们创建了一个样板,每次复制粘贴 5 个注释并弄乱代码。

不幸的是,我没有在 Lombok 中找到任何方法来将注释聚合到某些元注释,就像在 Spring 中一样。

问题:Lombok 中是否有任何开箱即用的注释来生成此类公共(public)不可变实体

或者

有什么方法可以声明本地元注释

最佳答案

你应该可以使用稍微轻一点的版本:

@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 ,但我无法快速尝试使其工作。

关于jpa - Lombok:公开不可变(over setters)对象,具有所有参数和无参数构造函数、散列、equals 和 toString,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51131772/

相关文章:

java - 我正在尝试使用 hibernate envers 连接 2 个表以具有相同的转速?

jpa - 是否可以使用 JPA 和 java.time.LocalDate 日期格式按月从 MySQL 查找数据?

java - 这个构造函数是如何工作的?

javascript - jquery ui 自动完成选择菜单 html 实体(&符号和引号)

java - Hibernate 无法确定集合的类型

Java Spring Boot 访问 MariaDB 的 View ?

java - JPA:即使在 FetchType.LAZY 之后也有 N+1 个查询

c++ - 在可变参数构造函数中初始化 const 数组

没有参数名称的C++构造函数

php - CakePHP 3.0 - 在实体中使用 MySQL 函数