Spring控制器,服务类,HiberNate Dao类?为什么dao的服务类没有例外?

时间:2014-04-01 07:45:36

标签: spring hibernate

我没有从现有的答案中得到正确的理解我有完全基于表单的Web应用程序,其中我有一个弹簧控制器为每个表单。

公共基类,具有所有服务类实例的varible(singleton object)声明代码(以避免在每个控制器中声明bo成员变量,用于业务服务交互),这是所有控制器的父级。

具有所有dao服务实例的变量(单例对象)声明代码的公共基类,它是所有BO类的父类。

具有HibernateTemplate的变量(单例对象)声明代码的公共基类,使用@Autowired annotaions的SessionFactory.Which是所有dao类的父类。以上三个具有Logger对象实例的类的父类。

一个fbisExceptionHandler.java,它从所有控制器捕获所有@RequestMapping方法的异常,如下所示

@ControllerAdvice  
                public class ExceptionControllerAdvice  
             {  
                @ExceptionHandler(Exception.class)  
                public ModelAndView exception(Exception e)   
               {  
                                ModelAndView mav = new ModelAndView("exception");  
                                mav.addObject("name", e.getClass().getSimpleName());  
                                logger.error( e.getMessage())
                                mav.addObject("message", e.getMessage());  
                                return mav;    
                }  
            }  

请回答我的问题 1)这个单一的方法是否适用于处理所有异常.i,那些陷入控制器,服务类,dao类的人? 2)为什么我的所有hibernate dao的方法都没有使用try..catch块或者在方法签名时抛出声明....是不是hibernate dao没有抛出任何异常?如果是这样他们抓住了什么? 例如我的一个hibernate dao是
3)如何处理来自db供应商的所有constarints?有没有内置的hibernate? 4)为什么我的所有bo的方法都没有使用try..catch块或者在方法签名处抛出声明....哪里确实抛出异常并被捕获?

My sample dao  

    package com.fbis.form18.daoimp;
        all imports 
        @Repository
        public class Form18daoImp implements Form18Dao{
            @Autowired
            SessionFactory sessionFactory;
            HibernateTemplate hibernateTemplate;
            @Autowired
            public void setSessionFactory(SessionFactory sessionFactory)
            {
                this.hibernateTemplate=new HibernateTemplate(sessionFactory);
            }
            public void save(Form18Dtls form18dtls) {
                sessionFactory.getCurrentSession().save(form18dtls);
                          logger.info("Form18Dtls saved successfully");
            }
            @Override
            public Form18Dtls findbyFacId(String facID) {
                @SuppressWarnings("rawtypes")
                List list=hibernateTemplate.find("from Form18Dtls where FAC_ID=?", facID);
                          logger.info("findbyFacId ran successfully");            
                return (Form18Dtls)list.get(0);
            }  
    all dao's methods are continued here..
    }


My sample bo

    package com.fbis.form18.boimp;
    all imports
    @Service("form18Bo")
    public class Form18boImp implements Form18Bo 
    {
        @Autowired
        Form18Dao form18dtlsdao;

        @Transactional
        public void save(Form18Dtls from18dtls) 
        {
            String UniqueTransactionNumber=getFacId(from18dtls.getFacDistrict(),"Form18_Dtls");
            from18dtls.setFacId(UniqueTransactionNumber);
            from18dtls.setSubmtdDate(new java.util.Date());
            from18dtls.setAppStatus("I");
            from18dtls.setFormId(23);
            form18dtlsdao.save(from18dtls);

        }
        public String getFacId(String district,String tableName)
        {
            FacIdGenerator facid=new FacIdGenerator();
            String genFacid=facid.factoryIdCreator("F18", district, tableName);
                logger.info("getFacId ran successfully");         
            return genFacid;

        }
        @Override
        public Form18Dtls findbyFacId(String facID) {
            return form18dtlsdao.findbyFacId(facID);
        }
    other bo's continued here

如果我关注错误的课程,欢迎提出建议,提前致谢

1 个答案:

答案 0 :(得分:1)

如果我理解正确,你的问题围绕着从数据访问层抛出的异常,在这种情况下,你使用hibernate作为你的供应商。

如果是这样,那么这是关于已检查异常和未经检查的异常的纯Java问题。 Hibernate异常是未经检查的(扩展RuntimeException),因此不需要在方法签名上声明它们,也不需要捕获它们。最重要的是,可以告诉Spring将特定的供应商(例如hibernate)异常转换为Spring DataAccessException(参见http://docs.spring.io/spring/docs/4.0.x/spring-framework-reference/html/dao.html)。

关于您上面的编号问题:

  1. 正如我所说,hibernate抛出RuntimeExceptions,你不需要声明它们,如果你没有捕获它们,那么你的@ExceptionHandler会捕获它们并处理它们。
  2. 我不明白这个问题
  3. 与第2号相同的答案