我正在处理一个GWT+Hibernate项目。它由多个模块组成,其中我将命名两个——公司和登录。为了每个模块,我创建了一个RPC服务,以便项目不会以一个神一样的服务结束。
为了与数据库交互,我使用Hibernate API——具体来说,是POJO中的EntityManager和Annotations。
此外,我创建了一个通用的DAO类来处理基本的CRUD操作。GenericDAO类还将处理EntityManager。每个模块服务类都将扩展此GenericDAO,以便可以添加自己的查询方法。
以下是GenericDAO类的存根 -
其他模块的接口也是同样的方式。
这是一个好的设计吗?GenericDAO 确实节省了一些会话管理和基本 CRUD 操作的样板代码。然而,由于 Hibernate API 的存在,每个方法已经只剩下 3-4 行代码。在这种情况下,我没有发现 GenericDAO 的其他用途。或者我使用的方式有问题吗?
如果这种设计不够好,请提出更好的建议。
编辑: 我想知道在这种情况下你会给服务模块什么名称。我现在使用 "Impl" 后缀,但感觉有点不顺口。例如,对于公司模块, 接口 - CompanyService 类 - CompanyServiceImpl
有更好的建议吗?
为了与数据库交互,我使用Hibernate API——具体来说,是POJO中的EntityManager和Annotations。
此外,我创建了一个通用的DAO类来处理基本的CRUD操作。GenericDAO类还将处理EntityManager。每个模块服务类都将扩展此GenericDAO,以便可以添加自己的查询方法。
以下是GenericDAO类的存根 -
public class GenericDataAccessService<EntityType, PrimaryKeyType extends Serializable> {
// Constructor
@Override
public void save(EntityType newEntity) {
// TODO Auto-generated method stub
}
@Override
public void update(EntityType entity) {
// TODO Auto-generated method stub
}
@Override
public EntityType find(PrimaryKeyType primaryKey) {
// TODO Auto-generated method stub
return null;
}
@Override
public List<EntityType> findByProperty(String property) {
// TODO Auto-generated method stub
return null;
}
@Override
public List<EntityType> findAll() {
// TODO Auto-generated method stub
return null;
}
@Override
public void delete(PrimaryKeyType primaryKey) {
// TODO Auto-generated method stub
}
@Override
public void delete(EntityType entity) {
// TODO Auto-generated method stub
}
}
现在,假设我要为公司模块添加一个查找方法。因此,我编写了如下的CompanyService类 -
public class CompanyService extends GenericDataAccessService<Company, int> {
public void addCompany(Company company) {
super.save(company);
}
public Company updateCompany(Company company) {
return super.update(company);
}
public List<Company> findMatchingCompanies(String companyName) {
return super.findByProperty(companyName);
}
public void deleteCompany (int companyId) {
super.delete(companyId);
}
public List<Company> findThroughSomeCustomSearch() {
// custom query code.
}
}
其他模块也是类似的步骤。这样,我还可以为每个模块的服务添加非数据访问相关的方法。
现在,我需要在客户端暴露这些模块。我选择不以任何方式暴露GenericDAO类;因此没有接口。相反,我为每个模块创建一个接口。
所以,对于CompanyService,它是 -
public interface CompanyService {
public void addCompany(Company company);
public Company updateCompany(Company company);
public List<Company> findMatchingCompanies(String companyName);
public void deleteCompany (int companyId);
public List<Company> findThroughSomeCustomSearch();
}
其他模块的接口也是同样的方式。
这是一个好的设计吗?GenericDAO 确实节省了一些会话管理和基本 CRUD 操作的样板代码。然而,由于 Hibernate API 的存在,每个方法已经只剩下 3-4 行代码。在这种情况下,我没有发现 GenericDAO 的其他用途。或者我使用的方式有问题吗?
如果这种设计不够好,请提出更好的建议。
编辑: 我想知道在这种情况下你会给服务模块什么名称。我现在使用 "Impl" 后缀,但感觉有点不顺口。例如,对于公司模块, 接口 - CompanyService 类 - CompanyServiceImpl
有更好的建议吗?