我正在做一个 GWT+Hibernate 项目。它由各种模块组成,我将在其中命名两个 - 公司和登录。对于每个模块,我都创建了一个 RPC 服务,这样项目就不会以一个可以完成所有工作的神一样的服务而告终。
为了与数据库交互,我使用 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
更好的建议?