【发布时间】:2015-06-10 04:03:47
【问题描述】:
我的项目使用最新的 Spring+Hibernate 来实现持久性和实现 REST API。 数据库中的不同表包含大量记录,这些记录也非常大。因此,我创建了许多 DAO 来检索不同级别的详细信息及其随附的 DTO。
例如,如果我在数据库中有一些 Employee 表,其中包含有关每个员工的大量信息。如果我知道任何使用我的应用程序的客户端都会从检索 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 还很陌生,所以请随意指出您认为我不知道的任何基本知识。
谢谢!
【问题讨论】:
-
你能详细说明你为什么要限制细节吗?安全性、性能、...?
-
主要是为了性能和一点安全性(减少敏感数据被返回给低权限服务调用的可见性)。但是,是的,我主要关心的是性能。
标签: java spring hibernate design-patterns dto