将Spring LocalSessionFactoryBean转换为Hibernate SessionFactory

时间:2014-06-18 17:47:59

标签: spring hibernate spring-mvc integration

我正在尝试将Spring与Hibernate集成。但是,我无法通过Spring的LocalSessionFactoryBean获取Hibernate的SessionFactory对象。

我尝试了以下方法:

1)使用org.springframework.orm.hibernate3和org.springframework.orm.hibernate4 LocalSessionFactoryBean类

2)使用AbstractSessionFactoryBean类

3)尝试使用SessionFactory = LocalSessionFactoryBean.getObject()以及SessionFactory = LocalSessionFactoryBean

这是项目结构:

Not allowed to post images till I reach 10 credits, sad..

这是BookService

    package com.zzz.service;

    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.orm.hibernate3.AbstractSessionFactoryBean;
    import org.springframework.orm.hibernate4.LocalSessionFactoryBean;

    import com.zzz.forms.BookForm;

    public class BookService {

       @Autowired
       LocalSessionFactoryBean hibernateSessionFactory;

       SessionFactory sessionFactory;

        public LocalSessionFactoryBean getHibernateSessionFactory() {
            return hibernateSessionFactory;
        }
        public void setHibernateSessionFactory(LocalSessionFactoryBean hibernateSessionFactory) {
            this.hibernateSessionFactory = hibernateSessionFactory;
        }





        public SessionFactory getSessionFactory() {
            return sessionFactory;
        }
        public void setSessionFactory(SessionFactory sessionFactory) {
            this.sessionFactory = sessionFactory;
        }
        public  void  storeBookDetails(BookForm bookForm){

            System.out.println("Hibernae");
            setSessionFactory((SessionFactory)hibernateSessionFactory.getObject());

            Session session=sessionFactory.openSession();

            session.beginTransaction();
            session.save(bookForm);
            session.getTransaction().commit();
            session.close();



            System.out.println("Hibernae");
        }




    }

这是导致此服务的控制器

    package com.zzz.controllers;

    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.ModelAttribute;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.servlet.ModelAndView;

    import com.zzz.forms.BookForm;
    import com.zzz.service.BookService;

    @Controller
    public class FirstPageController {


        BookService bookService;


        public BookService getBookService() {
            return  new BookService();
        }

        public void setBookService(BookService bookService) {
            this.bookService = bookService;
        }

        @RequestMapping(value="/firstPage")
        public ModelAndView showFirstPage()
        {

            return new ModelAndView("books/Book","BookForm",new BookForm());

        }

        @RequestMapping(value="/enterBookDetails")
        public ModelAndView enterBookDetails(@ModelAttribute("BookForm") BookForm bookForm)
        {

            getBookService().storeBookDetails(bookForm);

            System.out.println("BOOK DETAILS ARE AS FOLLOWWS");
            System.out.println(bookForm.getBookId());
            System.out.println(bookForm.getBookName());


            return  new ModelAndView("books/BookSubmitted","BookForm",bookForm);

        }


    }

应用程序上下文:

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xmlns:context="http://www.springframework.org/schema/context"
            xmlns:mvc="http://www.springframework.org/schema/mvc"
            xmlns:hz="http://www.hazelcast.com/schema/spring"
            xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
             http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
            http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context-3.0.xsd
            http://www.hazelcast.com/schema/spring
            http://www.hazelcast.com/schema/spring/hazelcast-spring-3.2.xsd">


            <context:annotation-config/>
            <context:component-scan base-package="com.zzz.controllers"></context:component-scan>
            <mvc:annotation-driven/>



            <bean id="myDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
                <property name="driverClassName" value="com.mysql.jdbc.Driver" />
                <property name="url" value="jdbc:mysql://localhost/zz" />
                <property name="username" value="root" />
                <property name="password" value="root" />
            </bean>

            <bean id="hibernateSessionFactory"
                class="org.springframework.orm.hibernate4.LocalSessionFactoryBean" >
                <property name="dataSource" ref="myDataSource" />
                <property name="packagesToScan" value="com.zzz.forms"/>

                <property name="hibernateProperties">
                    <value>
                        hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
                    </value>
                </property>
            </bean>
            </beans>

和Web XML

        <?xml version="1.0" encoding="UTF-8"?>
        <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
          <display-name>ZZZ</display-name>


          <welcome-file-list>
            <welcome-file>index.jsp</welcome-file>
          </welcome-file-list>


           <servlet>
            <servlet-name>dispatcher</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <load-on-startup>1</load-on-startup>
          </servlet>

          <servlet-mapping>
            <servlet-name>dispatcher</servlet-name>
            <url-pattern>*.htm</url-pattern>
          </servlet-mapping>

            <listener>
                <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
            </listener>
            <context-param>
                <param-name>contextConfigLocation</param-name>
                <param-value>classpath:ApplicationContext.xml</param-value>
            </context-param>

        </web-app>

NullPointer看起来像这样

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.NullPointerException
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:894)
org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:789)
javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)

root cause

java.lang.NullPointerException
com.zzz.service.BookService.storeBookDetails(BookService.java:38)
com.zzz.controllers.FirstPageController.enterBookDetails(FirstPageController.java:39)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)

似乎没有注入LocalSessionFactoryBean,但我无法弄清楚原因。 任何形式的帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

NPE与你的hibernate设置无关。在您的控制器中,您可以使用new BookService()方法中的getBookService()创建新的图书服务。这是不正确的。您需要在spring配置中为book服务定义一个bean,将该bean注入您的控制器(直接或使用注释)并在控制器中使用该bean。您已经定义了BookService属性,因此您几乎就在那里。

相关问题