복붙노트

[SPRING] 현재 스레드에 대한 세션이 없습니다 (Spring 3.1.X 및 Hibernate 4).

SPRING

현재 스레드에 대한 세션이 없습니다 (Spring 3.1.X 및 Hibernate 4).

Spring 3.1과 Hibernate 4를 사용하여 프로젝트를 설정하려고합니다. 온라인 튜토리얼을 따라 왔습니다. 나는 스프링 포럼에 따르면 Spring 3.1로 수정되어야한다는 이상한 오류가 발생하고있다. 스프링 버그 트래 커

내 서비스가 getCurrentSession ()을 호출하면 다음 예외가 throw됩니다.

org.hibernate.HibernateException: **No Session found for current thread**] with root cause org.hibernate.HibernateException: No Session found for current thread
at org.springframework.orm.hibernate4.SpringSessionContext.currentSession(SpringSessionContext.java:97) at
org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:881)

**** 편집 : Spring Spring 3.1 문서화 트랜잭션에 따라 my spring-dao.xml을 업데이트했습니다. 내 데이터 소스를 org.apache.commons.dbcp.BasicDataSource로 교체하려고 시도했습니다. 이 구성을 일으킬 수있는 속성이 누락 되었습니까? ****

다음은 spring-dao.xml입니다.

 <!-- Enable annotation style of managing transactions -->
<tx:annotation-driven transaction-manager="transactionManager" />   

<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="hibernateProperties">
        <value>hibernate.dialect=org.hibernate.dialect.MySQLInnoDBDialect</value>
    </property>
</bean>

<!-- Declare a datasource that has pooling capabilities-->   
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
            destroy-method="close"
            p:driverClass="${app.jdbc.driverClassName}"
            p:jdbcUrl="${app.jdbc.url}"
            p:user="${app.jdbc.username}"
            p:password="${app.jdbc.password}"
            p:acquireIncrement="5"
            p:idleConnectionTestPeriod="60"
            p:maxPoolSize="100"
            p:maxStatements="50"
            p:minPoolSize="10" />

<!-- Declare a transaction manager-->
<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager" 
            p:sessionFactory-ref="sessionFactory" />

내 사용자 bean (User.java)

package com.foo.lystra.beans;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name="users")
public class User implements Serializable {
private static final long serialVersionUID = -5527566191402296042L;

@Id
@Column(name = "idusers")
private Integer user_id;

@Column(name="login_name")
private String loginName;

@Column(name="password")
private String password;

@Column(name="role")
private String role;

@Column(name="congregation_id")
private Integer congregation_id;

public Integer getUser_id() {
    return user_id;
}
public void setUser_id(Integer user_id) {
    this.user_id = user_id;
}
public String getLoginName() {
    return loginName;
}
public void setLoginName(String loginName) {
    this.loginName = loginName;
}
public String getPassword() {
    return password;
}
public void setPassword(String password) {
    this.password = password;
}
public String getRole() {
    return role;
}
public void setRole(String role) {
    this.role = role;
}
public Integer getCongregation_id() {
    return congregation_id;
}
public void setCongregation_id(Integer congregation_id) {
    this.congregation_id = congregation_id;
}

public String toString() {
    return "user_name: " + this.loginName + " congregation_id: " + this.congregation_id.toString();
}
}

그리고 마침내 내 봉사 ...

package com.foo.lystra.services;

import java.util.List;

import javax.annotation.Resource;

import org.apache.commons.logging.LogFactory;
import org.apache.commons.logging.Log;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.foo.lystra.beans.User;
import com.foo.lystra.beans.Congregation;

@Service("congregationUserService")
@Transactional
public class CongregationUserService {
protected static Log logger = LogFactory.getLog(CongregationUserService.class);

@Resource(name="sessionFactory")
private SessionFactory sessionFactory;

public List<User> getAllUsers() {
    logger.debug("getting all users");

            //Exception is thrown on this next line:
    Session session = sessionFactory.getCurrentSession();

    Query query = session.createQuery("FROM users");
    return query.list();
}
}

내 데이터 소스가 아마 사용되지 않을 것이라는 것을 알고 있습니다. 구성을 포함하는 것을 잊어 버린 경우이 게시물을 업데이트 할 수 있습니다. 또한 Tomcat 시작 로그가 필요한 경우이를 제공 할 수도 있습니다.

해결법

  1. ==============================

    1.나는 spring-4.0.6과 hibernate-4.3.6에이 문제를 가지고 있었다.

    나는 spring-4.0.6과 hibernate-4.3.6에이 문제를 가지고 있었다.

    해결 방법은 모든 주석 중심의 구성 요소 검사, 주석 기반 지시문을 root-context.xml에서 servlet-context.xml로 이동하는 것입니다.

    <mvc:annotation-driven />
    <context:component-scan base-package="ru.dd.demo" />
    <tx:annotation-driven transaction-manager="transactionManager" />
    

    dataSource, sessionFactory 및 transactionManager는 root-context.xml에서 계속 정의 할 수 있습니다.

  2. ==============================

    2.웹 응용 프로그램에서 같은 문제가 있습니다. 이 문제는 application-context.xml과 webmvc-context.xml 두 구성 파일에 모두 존재합니다. webmvc-context.xml은 application-context.xml 다음에로드됩니다. application-context.xml이로드 될 때 DAO 클래스가 먼저 트랜잭션 참조로로드되지만 webmvc-context.xml이로드 될 때 트랜잭션 참조가없는 다른 객체로 대체된다고 생각합니다. 어떤 방법 으로든 스캔 된 특정 패키지의 문제를 해결합니다. application-context.xml의 경우 webmvc-context.xml.

    웹 응용 프로그램에서 같은 문제가 있습니다. 이 문제는 application-context.xml과 webmvc-context.xml 두 구성 파일에 모두 존재합니다. webmvc-context.xml은 application-context.xml 다음에로드됩니다. application-context.xml이로드 될 때 DAO 클래스가 먼저 트랜잭션 참조로로드되지만 webmvc-context.xml이로드 될 때 트랜잭션 참조가없는 다른 객체로 대체된다고 생각합니다. 어떤 방법 으로든 스캔 된 특정 패키지의 문제를 해결합니다. application-context.xml의 경우 webmvc-context.xml.

  3. ==============================

    3.웹 응용 프로그램입니까? 그렇다면 OpenSessionInViewFilter 사용을 고려하십시오. 왜냐하면 currentSession (현재 스레드에 바인딩되어 있음)을 사용할 때 스레드의 세션을 바인딩 해제하는 코드가 있어야한다는 것입니다.

    웹 응용 프로그램입니까? 그렇다면 OpenSessionInViewFilter 사용을 고려하십시오. 왜냐하면 currentSession (현재 스레드에 바인딩되어 있음)을 사용할 때 스레드의 세션을 바인딩 해제하는 코드가 있어야한다는 것입니다.

    트랜잭션 관리자가이 작업을 수행하는지 여부는 확실하지 않습니다.

  4. ==============================

    4.나는 너와 똑같은 실수를했다.

    나는 너와 똑같은 실수를했다.

    이것은 아직 해결되지 않은 버그입니다.

    https://jira.springsource.org/browse/SPR-9028

    최대 절전 모드 jar 파일을 3.6으로 변경하십시오. Spring이 그것을 사용하기 때문에.

    http://mvnrepository.com/artifact/org.springframework/spring-orm/3.1.0.RELEASE

    여기 Spring 3.1 아티팩트와 의존성

  5. ==============================

    5.Spring Reference (3.2.x)에서 언급 한 바와 같이 :

    Spring Reference (3.2.x)에서 언급 한 바와 같이 :

    따라서 으로 정의되거나 스캔 된 Bean은 @ 컨트롤러에 표시 될 수 있으므로 다른 applicationContext * 파일에는 표시되지 않으므로 가 DispatcherServlet의 config에 정의되어 있으면 @Transactional이 작동하지 않습니다.

    따라서 아마도 DispatcherServlet의 config에 이 있고 applicationContext * .xml에 선언이있는 것 같아 @Autowired는 정상적으로 작동하지만 @Transactional은 그렇지 않습니다.

  6. ==============================

    6.나는 동일한 문제를 가지고 있으며 모든 답변을 테스트했습니다. Vali의 대답은 매우 도움이되었습니다. 나에게 도움이 된 것은 bean을 applicationContext.xml에서 web-servlet.xml로 이동하는 것이었다.

    나는 동일한 문제를 가지고 있으며 모든 답변을 테스트했습니다. Vali의 대답은 매우 도움이되었습니다. 나에게 도움이 된 것은 bean을 applicationContext.xml에서 web-servlet.xml로 이동하는 것이었다.

    <bean id="sessionFactory"
            class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
            <property name="dataSource" ref="dataSource" />
            <property name="configLocation">
                <value>classpath:hibernate.cfg.xml</value>
            </property>       
            <property name="hibernateProperties">
                <props>
                    <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
                    <prop key="hibernate.show_sql">true</prop>
                </props>
            </property>
        </bean>
    
        <tx:annotation-driven />
        <bean id="transactionManager"
            class="org.springframework.orm.hibernate4.HibernateTransactionManager">
            <property name="sessionFactory" ref="sessionFactory" />
        </bean>
    

    또한 web-servlet.xml을 추가해야합니다.

    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:jdbc="http://www.springframework.org/schema/jdbc"
    
    xsi:schemaLocation="       
            http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd
            http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
        "
    
  7. ==============================

    7.web.xml에 OpenSessionInViewFilter 필터를 추가하십시오.

    web.xml에 OpenSessionInViewFilter 필터를 추가하십시오.

    <filter>
        <filter-name>hibernateFilter</filter-name>
        <filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class>
        <init-param>
            <param-name>sessionFactoryBeanName</param-name>
            <param-value>sessionFactory</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>hibernateFilter</filter-name>
        <url-pattern>/*</url-pattern>
        <dispatcher>REQUEST</dispatcher>
        <dispatcher>FORWARD</dispatcher>
    </filter-mapping>
    
  8. ==============================

    8.확실하지는 않지만 문제는 p : packagesToScan에있을 수 있습니다. ConfigurationUserService는 com.foo.lystra.services 패키지에 있지만 p : packagesToScan에는 com.foo.lystra.beans가 있습니다.

    확실하지는 않지만 문제는 p : packagesToScan에있을 수 있습니다. ConfigurationUserService는 com.foo.lystra.services 패키지에 있지만 p : packagesToScan에는 com.foo.lystra.beans가 있습니다.

  9. ==============================

    9.구성이 주석이 달린 클래스를 가리 키지 않습니다. 그들을 추가하십시오

    구성이 주석이 달린 클래스를 가리 키지 않습니다. 그들을 추가하십시오

    <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
      <property name="hibernateProperties">
         <value>hibernate.dialect=org.hibernate.dialect.MySQLInnoDBDialect</value>
      </property>
    
      <property name="annotatedClasses">
        <list>
          <value>test.package.Foo</value>
          <value>test.package.Bar</value>
        </list>
      </property>
    </bean>
    

    이전에 있었던 AnnotationSessionFactoryBean과 비슷합니다. 여기 Api를 확인하십시오.

  10. ==============================

    10.나는 네가 필요하다고 생각한다.

    나는 네가 필요하다고 생각한다.

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

    그렇지 않으면 스프링 컨텍스트가 서비스를 찾지 못하며 따라서 Transactional aspect로 메소드를 래핑하지 않을 것이다.

  11. ==============================

    11.정확하게 동일한 오류가 있었고 서비스를위한 인터페이스를 작성하여 해결되었습니다. 그래서 귀하의 경우, 나는 만들 것입니다 :

    정확하게 동일한 오류가 있었고 서비스를위한 인터페이스를 작성하여 해결되었습니다. 그래서 귀하의 경우, 나는 만들 것입니다 :

    public interface ICongregationUserService {
       public List<User> getAllUsers();
    }
    

    그런 다음 CongregationUserService를 변경하여 구현하십시오.

    @Service("congregationUserService")
    @Transactional
    public class CongregationUserService implements ICongregationUserService{
       //...
    }
    

    그리고 CongregationUserService를 autowire 한 곳에서 ICongregationUserService를 대신 autowire하십시오 :

    @Autowired
    private ICongregationUserService congregationUserService;
    
  12. ==============================

    12.다른 xml 구성 파일 대신 dispatcher-servlet.xml에 를 입력하여이 문제를 해결했습니다.

    다른 xml 구성 파일 대신 dispatcher-servlet.xml에 를 입력하여이 문제를 해결했습니다.

    나는이 방법이 콩이 같은 봄 상황에서 공존 할 수 있다고 생각한다.

  13. ==============================

    13.나는이 문제가 봄의 버그라는 것을 발견했다.

    나는이 문제가 봄의 버그라는 것을 발견했다.

    이 링크는 https://jira.springsource.org/browse/SPR-9020에서 문제를보고합니다.

    이 링크에서 찾을 수있는 Matias Mirabelli의 해결 방법을 사용했습니다. https://gist.github.com/seykron/4770724

    일어나는 일은 Propagation.SUPPORTS로 주석 된 메소드는 트랜잭션을 지원하지만, 새로운 세션을 생성하는 대신 봄에 스레드에 바인드 된 트랜잭션이 없다면 HibernateException을 던진다.

    솔루션을 구성하기 위해서 당신은 hibernate 프로퍼티를 사용할 수있다 :

    hibernate.current_session_context_class = com.your.package.TransactionAwareSessionContext

  14. ==============================

    14.

    <context:component-scan base-package="com.sprhib.repo"/>  #(some class files are annotaed by @Repository,@Service,@Component)
    <tx:annotation-driven transaction-manager="txManager" />
    <task:annotation-driven/>
    

    int는 root.xml입니다.

    <context:component-scan base-package="com.sprhib.web"/>  #(some class files are annotaed by @Controller)
    <mvc:annotation-driven />
    

    int는 servlet-context.xml입니다.

    그것은 작동합니다.

  15. from https://stackoverflow.com/questions/8846586/no-session-found-for-current-thread-spring-3-1-x-and-hibernate-4 by cc-by-sa and MIT license