首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

基于Spring、Hibernate的通用DAO层与Service层的兑现

2012-10-10 
基于Spring、Hibernate的通用DAO层与Service层的实现因为DAO层基本的就是CRUD操作,变化不是很大,要是有变化

基于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")
@Transactional

public 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 .

求解决 ?

热点排行