1

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

考虑这个实体(根据 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构建了一个私有构造函数,尽管它应该为每个定义的所有最终/非空字段创建一个可见的包。总之我做了AllArgsConstructor这么说。

此处的此文档https://docs.spring.io/spring-data/jdbc/docs/current/reference/html/#mapping.fundamentals详细介绍了有关“对象创建内部”的部分说明了改进处理的4个方面-“ Spring Data 使用的构造函数不能是私有的“除其他外,我认为这些都已实现。

所以我的问题是:这个图示的实体在不变性和弹簧数据 jdbc 内部优化映射方面是否正确?

编辑:

intellij 中的 lombok 插件似乎存在错误,阻碍了access = AccessLevel.PACKAGE正确的工作。见这里: https ://github.com/mplushnikov/lombok-intellij-plugin/issues/584

虽然问题已经关闭,但新版本的插件不可用...

4

1 回答 1

0

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

它应该可以工作,所以这已经是东西了。

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

但是 10% 的提升是关于对象实例化的。这与数据库的往返无关,涉及:

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

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

当然,在您使用真实数据进行自己的基准测试之前,您永远不会真正知道。为此,您需要创建一个至少具有包范围的全参数构造函数。

于 2019-02-28T07:08:52.310 回答