Announcement Announcement Module
Collapse
No announcement yet.
How to create Hibernate session in Spring MVC application Page Title Module
Move Remove Collapse
X
Conversation Detail Module
Collapse
  • Filter
  • Time
  • Show
Clear All
new posts

  • How to create Hibernate session in Spring MVC application

    I am new to Java/Spring/Eclipse. I am working on creating the login screen using Apache Tomcat 7, SQL Server, Spring MVC, and Hibernate. When the repository layer tries to create the Hibernate session, the system crashes. I am at a lose as to why. Here is the error:

    PHP Code:
    message Request processing failednested exception is org.hibernate.HibernateExceptionNo Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here

    description The server encountered an internal error that prevented it from fulfilling this request
    .

    exception

    org
    .springframework.web.util.NestedServletExceptionRequest processing failednested exception is org.hibernate.HibernateExceptionNo Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here
        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

    org
    .hibernate.HibernateExceptionNo Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here
        org
    .springframework.orm.hibernate3.SpringSessionContext.currentSession(SpringSessionContext.java:63)
        
    org.hibernate.impl.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:687)
        
    com.accumed.protracking.repository.JpaUserInfoRepository.get(JpaUserInfoRepository.java:37)
        
    com.accumed.protracking.service.UserInfoServiceImpl.login(UserInfoServiceImpl.java:20)
        
    com.accumed.protracking.LoginController.loginAttempt(LoginController.java:36)
        
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method
    The Repository:

    PHP Code:
    package com.accumed.protracking.repository;

    @
    Repository("userInfoRepository")
    @
    Transactional
    public class JpaUserInfoRepository implements UserInfoRepository {

        private 
    SessionFactory sessionFactory;    

        public 
    SessionFactory getSessionFactory() {
            return 
    sessionFactory;
        }

        @
    Resource(name="sessionFactory")
        public 
    void setSessionFactory(SessionFactory sessionFactory) {
            
    this.sessionFactory sessionFactory;
        }

        @
    Override
        
    public UserInfo get(String domainString usernameString password) {
            
            
    Session session sessionFactory.getCurrentSession();
            
            
    Query query session.getNamedQuery("callUserInfoGetProcedure")
                    .
    setParameter("domain"domain)
                    .
    setParameter("username"username)
                    .
    setParameter("password"password);
            
            List 
    result query.list();
            
            if(
    result.size() > 0)
                return (
    UserInforesult.get(0);
            
            return 
    null;
        }


    The Entity
    PHP Code:
    package com.accumed.protracking.domain;

    import static javax.persistence.GenerationType.IDENTITY

    import javax.persistence.*;

    import org.hibernate.validator.constraints.NotEmpty;

    @
    NamedNativeQueries({
        @
    NamedNativeQuery(
        
    name "callUserInfoGetProcedure",
        
    query "exec UserInfoGet :domain, :username, :password",
        
    resultClass UserInfo.class
        )
    })
    @
    Entity
    @Table(name "userInfo")
    public class 
    UserInfo {

        @
    NotEmpty
        
    private String domainName;
        @
    NotEmpty
        
    private Boolean corpActive;
        @
    NotEmpty
        
    private int tblCorporation_Id;
        @
    Id
        
    @NotEmpty
        
    private int tblUser_Id;

    // snipped code
        
        
    @Column(name "DomainName")
        public 
    String getDomainName() {
            return 
    domainName;
        }
        public 
    void setDomainName(String domainName) {
            
    this.domainName domainName;
        }
        
        @
    Column(name "CorpActive")
        public 
    Boolean getCorpActive() {
            return 
    corpActive;
        }
        public 
    void setCorpActive(Boolean corpActive) {
            
    this.corpActive corpActive;
        }
        
        @
    Column(name "tblCorporation_Id")
        public 
    int getTblCorporation_Id() {
            return 
    tblCorporation_Id;
        }
        public 
    void setTblCorporation_Id(int tblCorporation_Id) {
            
    this.tblCorporation_Id tblCorporation_Id;
        }

        @
    GeneratedValue(strategy IDENTITY)
        @
    Column(name "tblUser_Id")
        public 
    int getUserId() {
            return 
    tblUser_Id;
        }
        public 
    void setUserId(int tblUser_Id) {
            
    this.tblUser_Id tblUser_Id;
        }
        
    // snipped code

    The Service
    PHP Code:
    package com.accumed.protracking.service;

    @
    Service
    @Transactional
    public class UserInfoServiceImpl implements UserInfoService {
        
        @
    Autowired
        
    private UserInfoRepository userInfoRepository;

        @
    Override
        
    public UserInfo login(String domainString usernameString password)
                
    throws AuthenticationException {
            
    UserInfo userInfo this.userInfoRepository.get(domainusernamepassword);
            if (
    userInfo == null) {
                throw new 
    AuthenticationException("Wrong domain/username/password combination.""invalid.username");
            }

            return 
    userInfo;
        }

    The Controller
    PHP Code:
    package com.accumed.protracking;

    @
    Controller
    @RequestMapping(value "/login")
    public class 
    LoginController {
        
        public static final 
    String ACCOUNT_ATTRIBUTE "account";
        
        @
    Autowired
        
    private UserInfoService userInfoService;

        @
    RequestMapping(method RequestMethod.GET)
        public 
    String initial()
        {
            return 
    "login";
        }

        @
    RequestMapping(method RequestMethod.POST)
        public 
    String loginAttempt(@RequestParam String domain, @RequestParam String username, @RequestParam String password,
                
    RedirectAttributes redirectHttpSession sessionthrows AuthenticationException 
        
            try {
                
    UserInfo userInfo this.userInfoService.login(domainusernamepassword);
                
    session.setAttribute(ACCOUNT_ATTRIBUTEuserInfo);
                return 
    "redirect:/index.htm";
            } catch (
    AuthenticationException ae) {
                
    redirect.addFlashAttribute("exception"ae);
                return 
    "redirect:/login";
            }
        }

    -------------- CONFIGURATION ----------------
    The web.xml
    HTML Code:
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
    	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    
    	<!-- The definition of the Root Spring Container shared by all Servlets and Filters -->
    	<context-param>
    		<param-name>contextConfigLocation</param-name>
    		<param-value>/WEB-INF/spring/root-context.xml</param-value>
    	</context-param>
    	
    	<!-- Creates the Spring Container shared by all Servlets and Filters -->
    	<listener>
    		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    	</listener>
    
    	<!-- Processes application requests -->
    	<servlet>
    		<servlet-name>appServlet</servlet-name>
    		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    		<init-param>
    			<param-name>contextConfigLocation</param-name>
    			<param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
    		</init-param>
    		<load-on-startup>1</load-on-startup>
    	</servlet>
    		
    	<servlet-mapping>
    		<servlet-name>appServlet</servlet-name>
    		<url-pattern>/</url-pattern>
    	</servlet-mapping>
    
    </web-app>
    The root-context.xml
    HTML Code:
    <?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:tx="http://www.springframework.org/schema/tx"
    	xsi:schemaLocation="
    		http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.1.xsd
    		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd">
    	
    	<!-- Root Context: defines shared resources visible to all other web components -->
    	<context:component-scan base-package="com.accumed.protracking.service"/>
    
    	<tx:annotation-driven/>
    
    	<context:component-scan base-package="com.accumed.protracking.repository" />
    			
    	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
        	<property name="driverClassName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"/>
        	<property name="url" value="jdbc:sqlserver:***********;databaseName=***********"/>
        	<property name="username" value="***********"/>
        	<property name="password" value="***********"/>
        </bean>    
        
        <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
            <property name="dataSource" ref="dataSource"/>
            <property name="packagesToScan" value="com.accumed.protracking.domain"/>
            <property name="hibernateProperties">
                <props>
                    <prop key="hibernate.dialect">org.hibernate.dialect.H2Dialect</prop>
                    <prop key="hibernate.max_fetch_depth">3</prop>
                    <prop key="hibernate.jdbc.fetch_size">50</prop>
                    <prop key="hibernate.jdbc.batch_size">10</prop>
                    <prop key="hibernate.show_sql">true</prop>
                </props>
            </property>        
        </bean>    
        
    	<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        	<property name="sessionFactory" ref="sessionFactory" />
    	</bean>
    	
    </beans>

  • #2
    I had similar problem. It's sessionFactory.getCurrentSession() cause you the headache.
    You should use sessionFactory.openSession(), and sesion.close() after you finish JDBC stuff.

    It has something to do with sessionFactory initial life cycle.
    sessionFactory.getCurrentSession() is supposed to return you a current open session.


    Sometimes, it works like a charm, sometimes it just throw that headache message.

    I haven't figured out exactly when this sessionFactory.getCurrentSession() will return a proper session.

    It is especially troublesome when you want to put that data access code on the login page.

    Comment

    Working...
    X