基于Spring、Hibernate的通用DAO层与Service层的实现
因为DAO层基本的就是CRUD操作,变化不是很大,要是有变化的那就是查询。而确实没有必要为每一个实体写一个完整的DAO,但是没有还不行,那就“抽取”出来吧。而Service依赖与DAO层,有时就是简单调用一下,也确实没有必要每个都写。总之,不爱写多个,那就写一个通用的,而其他的继承或实现这个通用的可以了。
还是用代码说话吧。
?
?
?
以上是BaseDao和它的实现类。
那下面以CustomerDao与OrderDao为例,编写具体的Dao
?
?
package org.monday.service.impl;import javax.annotation.Resource;import org.monday.dao.BaseDao;import org.monday.domain.Order;import org.monday.service.OrderService;import org.springframework.stereotype.Service;import org.springframework.transaction.annotation.Transactional;/** * 订单Service的实现类 继承BaseServiceImpl 显示订单Service接口 * * @author Monday */@Service(value = "orderService")@Transactionalpublic class OrderServiceImpl extends BaseServiceImpl<Order> implements OrderService {/** * 注入DAO */@Resource(name = "orderDao")public void setDao(BaseDao<Order> dao) {super.setDao(dao);}/** * 若CustomerService 定义了BaseService没有的方法,则可以在这里实现 */}??
这里只是提供了一个思路。可能代码还有不严谨的地方,欢迎补充指正。
容易出现的两个异常:
1.org.hibernate.HibernateException: No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here
?
答案:要加@Transactional注解
除了要在这里加注解
@Service("customerService")
@Transactionalpublic class CustomerServiceImpl extends BaseServiceImpl<Customer> implements CustomerService {}
?
这里也要加
@Transactional
public class BaseServiceImpl<T> implements BaseService<T> {}
?
2.org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'customerService':
Injection of resource fields failed;
nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException:
No unique bean of type [org.monday.dao.BaseDao] is defined:
expected single matching bean but found 2: [customerDao, orderDao]?
答案:
(参考)
注入具体的DAO
@Resource(name="customerDao")
?public void setDao(BaseDao<Customer> dao) {
??super.setDao(dao);
?}?
PS:画个图好了。
?
? 1 楼 ws347575294 2012-04-04 @Service(value = "orderService")
@Transactional
public class OrderServiceImpl extends BaseServiceImpl<Order> implements OrderService {
/**
* 注入DAO
*/
@Resource(name = "orderDao")
public void setDao(BaseDao<Order> dao) {
super.setDao(dao);
}
/**
* 若CustomerService 定义了BaseService没有的方法,则可以在这里实现
*/
如果在这里注入了多个DAO会出错,它总是记录着最后一个被注入的DAO .
求解决 ?