2015-03-02 49 views
4

我在spring中使用hibernate。 我收到以下错误而调用的getCurrentSession方法Spring + hibrnate =创建会话动作时出现错误

protected Session getCurrentSession(){ 
    return getSessionFactory().openSession(); 
} 

错误:

java.lang.StackOverflowError 
    org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.<init> (JdbcCoordinatorImpl.java:97) 
    org.hibernate.engine.transaction.internal.TransactionCoordinatorImpl.<init>(TransactionCoordinatorImpl.java:87) 
    org.hibernate.internal.SessionImpl.<init>(SessionImpl.java:254) 
    org.hibernate.internal.SessionFactoryImpl$SessionBuilderImpl.openSession(SessionFactoryImpl.java:1609) 
    org.hibernate.internal.SessionFactoryImpl.openSession(SessionFactoryImpl.java:973) 

我已经搜索了很多,检查计算器给出的所有答案,但没有能够解决问题:(任何一个可以帮助我为什么我面对这样的错误。

打电话时我正在错误/活动方法,

我的控制器类:

package com.nativeunlock.security.controller; 

import java.security.Principal; 
import java.util.List; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.security.access.annotation.Secured; 
import org.springframework.stereotype.Controller; 
import org.springframework.ui.ModelMap; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod; 

import com.nativeunlock.dto.CampaignEntity; 
import com.nativeunlock.service.ICampaignService; 
import com.nativeunlock.service.IUserService; 


@Controller 
public class LoginController { 

    @Autowired 
    IUserService userServices; 

    @Autowired 
    ICampaignService campaignService; 


    @Secured("ROLE_OPERATION") 
    @RequestMapping(value="/campaign", method = RequestMethod.GET) 
    public String campaign(ModelMap model, Principal principal) { 

     try { 

      List<CampaignEntity> userEntity = campaignService.getCampaignList(); 
      System.out.println(userEntity.size()); 

      String name = principal.getName(); 
      model.addAttribute("username", name); 
      return "campaign"; 
     } catch (Exception e) { 
      return login(model, principal); 
     }  
    } 

    @Secured("ROLE_OPERATION") 
    @RequestMapping(value="/addCampaign", method = RequestMethod.GET) 
    public String addCampaign(ModelMap model, Principal principal) {  
     try {   
      return "addCampaign"; 
     } catch (Exception e) { 
      return login(model, principal); 
     }  
    } 


    @RequestMapping(value="/admin", method = RequestMethod.GET) 
    public String login(ModelMap model, Principal principal) { 

     if(principal != null) { 
      return campaign(model, principal);   
     } 
     return "login_page"; 

    } 

    @RequestMapping(value="/loginError", method = RequestMethod.GET) 
    public String loginerror(ModelMap model) { 

     return login(model, null); 

    } 


    @RequestMapping(value="/logout", method = RequestMethod.GET) 
    public String logout(ModelMap model) { 

     return login(model, null); 

    } 
} 

我的服务类:

​​

我DAO类是:

package com.nativeunlock.dao; 

import java.util.List; 

import org.hibernate.Session; 
import org.hibernate.SessionFactory; 
import org.hibernate.Transaction; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Component; 

import com.nativeunlock.dto.CampaignEntity; 

import org.hibernate.Query; 

@Component 
public class CampaignDao implements ICampaignDao{ 

    @Autowired 
    SessionFactory sessionFactory; 

    Session session = null; 
    Transaction tx = null; 


    protected SessionFactory getSessionFactory() { 
     if (sessionFactory == null){ 
      throw new IllegalStateException("SessionFactory has not been set on DAO before usage"); 
     } 
     return sessionFactory; 
    } 

    public void setSessionFactory(SessionFactory sessionFactory) { 
     this.sessionFactory = sessionFactory; 
    } 

    protected Session getCurrentSession(){ 
     return getSessionFactory().openSession(); 
    } 

    public Query getNamedQuery(String queryName){ 
     return getCurrentSession().getNamedQuery(queryName); 
    } 

    @SuppressWarnings("unchecked") 
    @Override 
    public List<CampaignEntity> getCampaignList() {  
     final Query clientQuery = getNamedQuery(CampaignEntity.GET_CAMPAIGNS_QUERY); 
     return (List<CampaignEntity>) clientQuery.list(); 
    } 

} 

我的实体类是

package com.nativeunlock.dto; 

import javax.persistence.*; 

import lombok.Getter; 
import lombok.Setter; 


@NamedQueries({ 
    @NamedQuery(
      name = CampaignEntity.GET_CAMPAIGNS_QUERY, 
      query = "from CampaignEntity campaign" 
    )  
}) 

@Entity 
@Table(name = "campaign") 
public class CampaignEntity { 

    public static final String GET_CAMPAIGNS_QUERY ="SiteURLs.getCampaignList"; 

    @Id 
    @GeneratedValue 
    @Column(name = "ID") 
    @Getter 
    @Setter 
    private int campain_id; 


    @Getter 
    @Setter 
    @Column(name = "no_of_views") 
    private int no_of_views; 


    @Getter 
    @Setter 
    @Column(name = "video_url") 
    private int video_url;  

} 

我dispacher的servlet是

<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:security="http://www.springframework.org/schema/security" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd 
     http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security.xsd"> 

    <context:component-scan base-package="com.nativeunlock.**" /> 

    <context:property-placeholder location="classpath:common.properties" /> 

    <bean id="dataSource" class="${datasource.class}"> 
     <property name="driverClassName" value="${mysql.driver}" /> 
     <property name="url" value="${mysql.url}" /> 
     <property name="username" value="${mysql.username}" /> 
     <property name="password" value="${mysql.password}" /> 
    </bean> 

    <bean id="sessionFactory" 
     class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
     <property name="dataSource" ref="dataSource" /> 
     <property name="packagesToScan" value="com.nativeunlock.dao.**"/>  
     <property name="hibernateProperties"> 
      <props> 
       <prop key="hibernate.dialect">${hibernate.dialect}</prop> 
       <prop key="hibernate.show_sql">${hibernate.show_sql}</prop> 
       <prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop> 
       <prop key="hibernate.connection.characterEncoding">UTF-8</prop> 
       <prop key="hibernate.connection.useUnicode">true</prop> 
      </props> 
     </property> 
    </bean> 

    <bean id="txManager" 
     class="org.springframework.orm.hibernate4.HibernateTransactionManager"> 
     <property name="sessionFactory" ref="sessionFactory" /> 
    </bean> 

    <bean id="persistenceExceptionTranslationPostProcessor" 
     class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" /> 


    <bean id="savedRequestAwareAuthenticationSuccessHandler" 
     class="org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler"> 
     <property name="targetUrlParameter" value="targetUrl" /> 
    </bean> 


    <bean 
     class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
     <property name="prefix" value="/pages/" /> 
     <property name="suffix" value=".jsp" /> 
    </bean> 

    <security:global-method-security 
     jsr250-annotations="enabled" pre-post-annotations="enabled" 
     secured-annotations="enabled" /> 

</beans> 

我的日志:

Mar 02, 2015 12:51:07 PM org.apache.catalina.core.ApplicationContext log 
INFO: No Spring WebApplicationInitializer types detected on classpath 
Mar 02, 2015 12:51:07 PM org.apache.catalina.core.ApplicationContext log 
INFO: Initializing Spring root WebApplicationContext 
Mar 02, 2015 12:51:10 PM org.apache.catalina.core.ApplicationContext log 
INFO: Initializing Spring FrameworkServlet 'dispatcher' 
Mar 02, 2015 12:51:23 PM org.apache.catalina.core.StandardWrapperValve invoke 
SEVERE: Servlet.service() for servlet [dispatcher] in context with path [/Audience-Box] threw exception [Handler processing failed; nested exception is java.lang.StackOverflowError] with root cause 
java.lang.StackOverflowError 
    at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.<init>(JdbcCoordinatorImpl.java:97) 
    at org.hibernate.engine.transaction.internal.TransactionCoordinatorImpl.<init>(TransactionCoordinatorImpl.java:87) 
    at org.hibernate.internal.SessionImpl.<init>(SessionImpl.java:254) 
    at org.hibernate.internal.SessionFactoryImpl$SessionBuilderImpl.openSession(SessionFactoryImpl.java:1609) 
    at org.hibernate.internal.SessionFactoryImpl.openSession(SessionFactoryImpl.java:973) 
    at com.nativeunlock.dao.CampaignDao.getCurrentSession(CampaignDao.java:37) 
    at com.nativeunlock.dao.CampaignDao.getNamedQuery(CampaignDao.java:41) 
    at com.nativeunlock.dao.CampaignDao.getCampaignList(CampaignDao.java:47) 
    at com.nativeunlock.service.CampaignService.getCampaignList(CampaignService.java:23) 
    at com.nativeunlock.security.controller.LoginController.campaign(LoginController.java:36) 
    at com.nativeunlock.security.controller.LoginController.login(LoginController.java:61) 
    at com.nativeunlock.security.controller.LoginController.campaign(LoginController.java:42) 
    at com.nativeunlock.security.controller.LoginController.login(LoginController.java:61) 
    at com.nativeunlock.security.controller.LoginController.campaign(LoginController.java:42) 
    at com.nativeunlock.security.controller.LoginController.login(LoginController.java:61) 
    at com.nativeunlock.security.controller.LoginController.campaign(LoginController.java:42) 
    at com.nativeunlock.security.controller.LoginController.login(LoginController.java:61) 
    at com.nativeunlock.security.controller.LoginController.campaign(LoginController.java:42) 
    at com.nativeunlock.security.controller.LoginController.login(LoginController.java:61) 
    at com.nativeunlock.security.controller.LoginController.campaign(LoginController.java:42) 
    at com.nativeunlock.security.controller.LoginController.login(LoginController.java:61) 
    at com.nativeunlock.security.controller.LoginController.campaign(LoginController.java:42) 
    at com.nativeunlock.security.controller.LoginController.login(LoginController.java:61) 
    at com.nativeunlock.security.controller.LoginController.campaign(LoginController.java:42) 
    at com.nativeunlock.security.controller.LoginController.login(LoginController.java:61) 
    at com.nativeunlock.security.controller.LoginController.campaign(LoginController.java:42) 
    at com.nativeunlock.security.controller.LoginController.login(LoginController.java:61) 
    at com.nativeunlock.security.controller.LoginController.campaign(LoginController.java:42) 
    at com.nativeunlock.security.controller.LoginController.login(LoginController.java:61) 
    at com.nativeunlock.security.controller.LoginController.campaign(LoginController.java:42) 
    at com.nativeunlock.security.controller.LoginController.login(LoginController.java:61) 
    at com.nativeunlock.security.controller.LoginController.campaign(LoginController.java:42) 
    at com.nativeunlock.security.controller.LoginController.login(LoginController.java:61) 
    at com.nativeunlock.security.controller.LoginController.campaign(LoginController.java:42) 
    at com.nativeunlock.security.controller.LoginController.login(LoginController.java:61) 
    at com.nativeunlock.security.controller.LoginController.campaign(LoginController.java:42) 
    at com.nativeunlock.security.controller.LoginController.login(LoginController.java:61) 
    at com.nativeunlock.security.controller.LoginController.campaign(LoginController.java:42) 
    at com.nativeunlock.security.controller.LoginController.login(LoginController.java:61) 
    at com.nativeunlock.security.controller.LoginController.campaign(LoginController.java:42) 
    at com.nativeunlock.security.controller.LoginController.login(LoginController.java:61) 
    at com.nativeunlock.security.controller.LoginController.campaign(LoginController.java:42) 
    at com.nativeunlock.security.controller.LoginController.login(LoginController.java:61) 
    at com.nativeunlock.security.controller.LoginController.campaign(LoginController.java:42) 
    at com.nativeunlock.security.controller.LoginController.login(LoginController.java:61) 
    at com.nativeunlock.security.controller.LoginController.campaign(LoginController.java:42) 
    at com.nativeunlock.security.controller.LoginController.login(LoginController.java:61) 
    at com.nativeunlock.security.controller.LoginController.campaign(LoginController.java:42) 
    at com.nativeunlock.security.controller.LoginController.login(LoginController.java:61) 
+0

什么是您的getSessionFactory方法? – 2015-03-02 07:39:42

+0

@vimal 保护的SessionFactory了getSessionFactory(){ \t \t如果(SessionFactory的== NULL){ \t \t \t抛出新IllegalStateException异常( “SessionFactory的尚未使用之前设置的DAO”); \t \t} \t \t return sessionFactory; \t} 它正在返回会话对象 – 2015-03-02 07:40:13

+0

你确定你不会在递归通过代码吗? – 2015-03-02 07:41:56

回答

0

你的问题是,你调用下面两个函数中相互递归。

at com.nativeunlock.security.controller.LoginController.login(LoginController.java:61) 
at com.nativeunlock.security.controller.LoginController.campaign(LoginController.java:42) 

你不必这样做,因为你的控制器已经与注释@Secured("ROLE_OPERATION")担保所以,如果有授权的任何要求,Spring MVC的会自动调用登录控制器。您所要做的就是在配置文件中配置逻辑控制器操作。 (或批注)

删除的递归后,我读了你的真正问题的评论,这是

org.hibernate.MappingException: Named query not known: getCampaignList at org.hibernate.internal.AbstractSessionImpl.getNamedQuery(AbstractSess ionImpl.java:154) at org.hibernate.internal.SessionImpl.getNamedQuery(SessionImpl.java:137 1) at com.nativeunlock.dao.CampaignDao.getNamedQuery(CampaignDao.java:41) 

这是因为该行的

public static final String GET_CAMPAIGNS_QUERY ="SiteURLs.getCampaignList"; 

你必须确保你试图在那里实施的逻辑是正确的。重新检查SiteURLs.getCampaignList。希望这不应该存在于应用程序中。

相关问题