如何使用静态工厂方法为不可变实体建模

时间:2019-02-27 16:24:36

标签: spring performance spring-data immutability spring-data-jdbc

您好,我有一个关于对不可变实体建模的正确方法的问题:

考虑这个实体(根据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

尽管该问题已经解决,但该插件的新版本不可用...

1 个答案:

答案 0 :(得分:0)

这取决于您对“最佳映射”的定义。

它应该工作,所以已经存在了。

但是由于您的构造函数是私有的,因此无法应用文档中描述的优化。 因此,您失去了可能无法使其达到“最佳”状态的10%的性能提升。

但是10%的提升与对象实例化有关。 这与涉及以下内容的数据库往返无关:

  • 从实体中提取数据
  • 要使用的SQL的构造(或查找)
  • 将两者都发送到数据库
  • 在数据库中执行查询
  • 返回结果

这极有可能使该优化带来的收益大大低于10%,并且在大多数情况下无需担心。

当然,除非您使用实际数据制定基准,否则您永远不会真正知道。 为此,您需要创建一个至少具有包作用域的all args构造函数。