一般是 一个service 对一个dao 
service 中要调用别的dao是也是通过service 调service 这种public class xxxImplService implements xxxService { @Autowired(required = false)
private xxxDao xxxDao;
@Autowired(required = false)
private xxxService xxxService;
         @Autowired(required = false)
private xxxService xxxService;}
有没有这种情况
一个service 对应多dao 
这种public class xxxImplService implements xxxService { @Autowired(required = false)
private xxxDao xxxDao;
@Autowired(required = false)
private xxxDao xxxDao;
         @Autowired(required = false)
private xxxDao xxxDao;}

解决方案 »

  1.   

    一个service 可以对应多dao。
    有  
      

  2.   

    一般我们是后者用的多。dao层是与数据库打交道,是操作数据库的。而Service层是完成业务逻辑的。你的一个业务逻辑一般都会涉及多张表,因此需要与多个Dao打交道,用他们来完成业务逻辑
    所以你的一个Service对应一个dao的作法不好。
      

  3.   

    不要为了dao而dao,为了Service而Service你要知道分三层,那三层各是干什么用的。这样才能真正灵活应用。
      

  4.   

    一个service肯定可以对应多个DAO假如你要同时操作三个表的数据 难道要将3个表对应的DAO代码重新整合起来?这就是为什么要将事务处理放在 service层
      

  5.   

    对啊  一个service可以对应多个DAO  一个DAO只负责一个数据表的操作,涉及到业务方法的整合就在业务service里面整合,将多个dao注入一个service是可以的
      

  6.   

    你这种理解不对 service和dao不是一一对应的关系 这点你要认识到 至于我们平时做的最多的还是service与dao配套的 甚至service仅仅是return XXXDao.xxx(); 但是对于业务十分负责 比如银行系统 它是有很多东西要在service层进行调用多个dao进行业务封装的 实际上service层和dao层是没有关系的 dao层是处理数据持久化 service侧重与实际的业务封装 说这么多 希望你能理解一点 凡事没有绝对!
      

  7.   


    那你到是说说你是什么意思?你是说一个Service里面:有某个Dao类的多个实例??这个意思么?如果是这个意思,那我说你吃多了没事做。
      

  8.   

    直接调dao的话那不是绕过了业务逻辑吗
      

  9.   

    service才是业务逻辑
    dao只是操作数据库
      

  10.   


    public class TestImpDao extends AbstractManager implements TestDao{
      public void insertTest (Test test) {
    this.save(test);
      }
    }public class Test2ImpDao extends AbstractManager implements Test2Dao{
      public void insertTest2 (Test2 test2) {
    this.save(test2);
      }
    }public class Test2ImpService implements Test2Service {  @Autowired(required = false)
        private TestDao testDao;
     
      public void insertTest2 (Test2 test2) {
         if(test2 != null){
           if("xxx".equals(test2.getxx())) {
               test2.setxxx(xxx);
            }
           testDao.insertTest(test2);
         }
      }
    }
    public class TestImpService implements TestService {  @Autowired(required = false)
        private TestDao testDao;
      @Autowired(required = false)
        private Test2Dao test2Dao; 
      public void insertTest (Test test) {
         testDao.insertTest(test);
         test2Dao.insertTest2(test);  //那我这时直接调用时不是绕过了Test2Service 业务逻辑吗
      }
    }
      

  11.   

     public void insertTest2 (Test2 test2) {
         if(test2 != null){
           if("xxx".equals(test2.getxx())) {
               test2.setxxx(xxx);
            }
           testDao.insertTest(test2);
         }
      }
    //有可能做的更多的业务逻辑 以后可能也会变更
      

  12.   

    你还是没有理解分层的思想:一般我们Service类的一个方法就是一个业务逻辑单元,处理一业务。像你的。public void insertTest (Test test) {
         testDao.insertTest(test);
         test2Dao.insertTest2(test);  //那我这时直接调用时不是绕过了Test2Service 业务逻辑吗
      }
    向testDao和test2Dao各插入一条数据,这不就是你的业务逻辑??如果你要往test2Dao插数据。还需要先 得到一个test2Service,再调用test2Service的插入数据的方法,那你觉得你的dao和service有什么区别?
      

  13.   


    为什么你插入test2的业务逻辑一定要放在test2Service里面列? 你为什么不以在test1Service的方法里面列??
      

  14.   

    这样是没错
    可是比如:过一段时间客户提出可以看test2新增的历史记录了?可能以后还有别的变更了?
      

  15.   

    这样不是不能共用了吗?
    比如我action 调用 test2Service.insertTest(test2); 时这样不是什么都不需要变吗
      

  16.   

    写test1Service里面那我要是有N个这样的地方了?那以后需求变更不是得改死
      

  17.   

              action:处理参数--->Service进行业务处理,调用Dao来操作数据库--->Dao--->数据库
    这样保证每都是分开的。
    我们举个例子吧。转帐操作。。 1。在action我们获取了帐号 a1,a2,以及转帐的金额 m传到service
    2。在service里面有一个方法:tansfer来完成转帐
    [code=Java][
       public void transfer(Account a1,Account a2,double m){
               // 1.判断a1的余额够不够, 这里是不是需要调用userDao去查询余额?
             //2。如果够的话,a1.balance - m    a2.balance+m。也是用userDao
            //3。往转帐记录表里面插入一条转帐记录 ,是不是要用到transferRecordDao?
         }
    /code]
    那你说这个service是不是用到了2个dao?  每个Service 都有自己的任务,为什么要去调用别人列?
     你这样Service又调用Service,还调用Dao,那你不觉得自己分层很乱?根本没有层次可言?
    你再不明白。。那我也说不了什么。。只能说我教不会你。。 你另寻高明吧
      

  18.   

    大胡子是对的。
    一般一个service是可以操作多个dao的。一个service内一般一个方法对应一个完整的业务事务,而一个事务会可能操作多表(也就是操作多个dao)service之间一般不互相调用,而由上层进行调用(Action层或Manage层)
      

  19.   


    那要是我 金额支付和金额增加都需要发送短信通知也在这写是吧
    那我要是有N个这样的地方那我维护不是得改N个方 代码也没有重复利用假设userDao是调用update
     那要是用userService update的话是不是只需在userService update里增加发短信功能了?
      

  20.   

    这句话对,灵活,层。并不是什么一个dao一个service。不要急学问是慢慢学的,可能你今天不懂,明天就恍然大悟。
      

  21.   


    action --->service --->dao --->数据库
                   |  /|\
                 |__ |
                  
    没有一团糟吧?就应为service 是业务逻辑 而service 方法中 调另一个service方法 
    就因这样业务逻辑就是一团糟?
    何不明白 一个service 方法中 调另一个service方法 这个方法难道就不是一个完整的业务逻辑吗
      

  22.   

    为什么会出现service掉service这种情况呢!?
      

  23.   

    你在同一个service注入不同的Dao难道不行吗!??
      

  24.   

    service调service可能会出现死循环,分层也比较乱