我们为我们的实体使用 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/