我所在的项目使用最新的 Spring+Hibernate 来实现持久性和实现 REST API。 数据库中的不同表包含大量记录,这些记录也很大。因此,我创建了许多 DAO 来检索不同级别的详细信息及其随附的 DTO。
例如,如果我在数据库中有一些员工表,其中包含有关每个员工的大量信息。如果我知道使用我的应用程序的任何客户端都会从检索 Employee 实体的不同级别的详细信息中受益匪浅(而不是每次都受到整个实体的轰炸),那么到目前为止我一直在做的事情是这样的:
class EmployeeL1DetailsDto
{
String id;
String firstName;
String lastName;
}
class EmployeeL2DetailsDto extends EmployeeL1DetailsDto
{
Position position;
Department department;
PhoneNumber workPhoneNumber;
Address workAddress;
}
class EmployeeL3DetailsDto extends EmployeeL2DetailsDto
{
int yearsOfService;
PhoneNumber homePhoneNumber;
Address homeAddress;
BidDecimal salary;
}
等等...
在这里您可以看到我已将员工信息分为不同的详细级别。 附带的 DAO 看起来像这样:
class EmployeeDao
{
...
public List<EmployeeL1DetailsDto> getEmployeeL1Detail()
{
...
// uses a criteria-select query to retrieve only L1 columns
return list;
}
public List<EmployeeL2DetailsDto> getEmployeeL2Detail()
{
...
// uses a criteria-select query to retrieve only L1+L2 columns
return list;
}
public List<EmployeeL3DetailsDto> getEmployeeL3Detail()
{
...
// uses a criteria-select query to retrieve only L1+L2+L3 columns
return list;
}
.
.
.
// And so on
}
我一直在使用 hibernate 的 aliasToBean() 将检索到的实体自动映射到 DTO 中。尽管如此,我还是觉得整个过程中的样板数量(所有 DTO、DAO 方法、所需详细程度的 URL 参数等)有点令人担忧,让我认为可能有一种更简洁的方法对此。
所以,我的问题是:是否有更好的模式可以遵循来从持久化实体中检索不同级别的详细信息? 我对 Spring 和 Hibernate 还很陌生,所以请随时指出您认为我不知道的任何基本知识。
谢谢!
最佳答案
我会尽可能少地使用不同的查询。我宁愿在映射中设置惰性关联,然后使用适当的 Hibernate 获取策略按需初始化它们。
我认为每个业务模型实体拥有多个不同的 DTO 类并没有什么问题,而且它们通常会使代码更具可读性和可维护性。
但是,如果DTO类的数量趋于爆炸式增长,那么我会在可读性(可维护性)和性能之间做出平衡。
例如,如果上下文中未使用 DTO 字段,我会将其保留为 null 或无论如何填充它(如果这确实不昂贵的话)。然后,如果它为空,您可以指示对象编码器在生成 REST 服务响应(JSON、XML 等)时排除空字段(如果它确实困扰服务使用者)。或者,如果您正在填写它,那么稍后当您在应用程序中添加新功能并开始在上下文中使用它时,总是会受到欢迎的。
关于java - 不同粒度的DTO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30746894/