我在思考是否真的需要一个服务层。
我正在为一个桌面swing应用程序使用spring + hibernate,目前我有gui / swing层 ->服务层 ->dao层。我只使用spring来支持@Transactional和IOC注入。
最佳实践指出,我必须编写一个服务来使用我的dao,并将所有事务管理放在服务中。
但是我意识到,服务层很多时候只是重复dao方法,例如:
// a DAO example
@Repository
public class CustomerHibernateDAO extends BaseHibernateDAO implements CustomerDAO {
public List<Customer> findAllCustomerILikeName(String name){
return getSession()
.createCriteria(Customer.class)
.add(Restriction.ilike("name", name))
.list();
}
}
// Customer service to use this dao...
@Service
@Transactional
public class CustomerService {
@Autowired
CustomerDAO customerDAO;
// Why i can't call DAO instead the service?
public List<Customer> getAllCustomersByName(String name){
return customerDAO.findAllCustomerILikeName(name);
}
}
这是服务层的一个典型用法……Hibernate是数据库无关的,Spring是技术无关的:那么,我真的需要它吗?
为什么不使用一个唯一的Service类来管理所有DAO?我认为这可能是一个很好的妥协,或者说,这是一个不好的做法吗?
我知道在DAO上放置@Transactional是个不好的方式,但现在我必须只写服务才能将其放置@Transactional……
编辑
我的应用程序是一个管理软件,管理用户注册、产品、订单和其他类似的事物。实际上,它包含许多读取实体->编辑->保存实体或创建->编辑->保存操作,并且由于Hibernate的@manyto...集合和cascade.save_update,这些操作大部分时间都由一个dao进行管理, 它允许在同一个持久化操作中保存两个或多个实体。
因此,例如,在我的项目JFrame中,我可以插入、编辑或创建一个商品(一个要出售的产品),其中包括:
public ItemFrame(){
// the constructor
itemService=springAppContext.getBeans(ItemService.class);
}
public boolean validateForm(){
// test if the gui is correctly filled by user
}
public boolean save(){
// create an Item entity taking value from swing gui(JTextField etc)
Item item=new Item();
item.setName(nameTextField.getText());
item.setEtc...
// ItemService ' save method is a wrap around itemDao.save(item)...
itemService.save(item);
}
private void saveItemActionPerformed(ActionEvent evt){
// When i press SAVE button
if(validateForm()){
save();
}
}
我在大多数情况下遇到了这个问题,所以我认为我陷入了贫血领域反模式...
谢谢。