您好,我有一个关于对不可变实体建模的正确方法的问题:
考虑这个实体(根据Jens Schauder的建议进行编辑):
@Getter
@RequiredArgsConstructor(staticName = "of", access = AccessLevel.PACKAGE)
public final class Student {
private final @Id @Wither
long studentId;
@NotNull
@Size(min = 4, max = 20)
private final String userId;
@NotNull
@Min(0)
private final int matriculationNumber;
@NotNull
@Email
private final String eMail;
}
因此,该实体应该是不可变的,并提供静态的of
创建方法。 RequiredArgsConstructor
还会构建一个私有构造函数,尽管它应该为每个定义的所有final / non null字段创建一个可见的程序包。简而言之,我做了AllArgsConstructor
。
此处https://docs.spring.io/spring-data/jdbc/docs/current/reference/html/#mapping.fundamentals的文档详细介绍了有关“对象创建内部”的部分,其中指出了4个方面的改进处理方式-“ Spring Data使用的构造函数不得为私有”在我看来,这些都是可以实现的。
所以我的问题是: 是否在涉及不可变性和Spring数据jdbc内部最佳映射的两种方式中都正确地完成了此图片化实体?
编辑:
intellij中的lombok插件似乎存在一个错误,阻碍了access = AccessLevel.PACKAGE
做正确的事情。看这里:
https://github.com/mplushnikov/lombok-intellij-plugin/issues/584
尽管该问题已经解决,但该插件的新版本不可用...
答案 0 :(得分:0)
这取决于您对“最佳映射”的定义。
它应该工作,所以已经存在了。
但是由于您的构造函数是私有的,因此无法应用文档中描述的优化。 因此,您失去了可能无法使其达到“最佳”状态的10%的性能提升。
但是10%的提升与对象实例化有关。 这与涉及以下内容的数据库往返无关:
这极有可能使该优化带来的收益大大低于10%,并且在大多数情况下无需担心。
当然,除非您使用实际数据制定基准,否则您永远不会真正知道。 为此,您需要创建一个至少具有包作用域的all args构造函数。