복붙노트

[SPRING] org.hibernate.HibernateException : 현재 스레드에 대한 세션을 찾지 못했습니다.

SPRING

org.hibernate.HibernateException : 현재 스레드에 대한 세션을 찾지 못했습니다.

Spring 3와 Hibernate 4에서 위 예외를 얻고있다.

다음은 내 bean xml 파일이다.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:context="http://www.springframework.org/schema/context"
   xmlns:tx="http://www.springframework.org/schema/tx"
   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-3.0.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-3.0.xsd
    http://www.springframework.org/schema/tx
    http://www.springframework.org/schema/tx/spring-tx-3.1.xsd">

   <context:annotation-config/>


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

  <bean id="sessionFactory"
      class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="hibernateProperties">
        <props>
            <prop key="dialect">org.hibernate.dialect.MySQL5Dialect</prop>
        </props>
    </property>
    <property name="packagesToScan">
        <list>
            <value>com.example.ghs.model.timetable</value>
        </list>
    </property>
  </bean>

   <bean id="baseDAO"
      class="com.example.ghs.dao.BaseDAOImpl"/>
</beans>

내 BaseDAO 클래스는 다음과 같습니다.

public class BaseDAOImpl implements BaseDAO{
private SessionFactory sessionFactory;

 @Autowired
 public BaseDAOImpl(SessionFactory sessionFactory){
     this.sessionFactory = sessionFactory;
 }

 @Override
 public Session getCurrentSession(){
     return sessionFactory.getCurrentSession();
 }
}

다음 코드는 제목에 예외를 발생시킵니다.

public class Main {
 public static void main(String[] args){
    ClassPathXmlApplicationContext context =
            new ClassPathXmlApplicationContext("dao-beans.xml");
    BaseDAO bd = (BaseDAO) context.getBean("baseDAO");
    bd.getCurrentSession();
 }
}

누구든지이 문제를 해결하는 방법에 대한 아이디어가 있습니까?

해결법

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

    1.getCurrentSession ()은 트랜잭션 범위 내에서만 의미가 있습니다.

    getCurrentSession ()은 트랜잭션 범위 내에서만 의미가 있습니다.

    적절한 트랜잭션 관리자를 선언하고, 트랜잭션 경계를 구분하고, 트랜잭션 내에서 데이터 액세스를 수행해야합니다. 예를 들어 다음과 같습니다.

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

    .

    PlatformTransactionManager ptm = context.getBean(PlatformTransactionManager.class);
    TransactionTemplate tx = new TransactionTemplate(ptm);
    
    tx.execute(new TransactionCallbackWithoutResult() {
        public void doInTransactionWithoutResult(TransactionStatus status) { 
            // Perform data access here
        }
    });
    

    참조 :

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

    2.나는 똑같은 문제를 겪고 아래와 같이 풀렸다. daoImpl 클래스에 @Transactional을 추가했습니다.

    나는 똑같은 문제를 겪고 아래와 같이 풀렸다. daoImpl 클래스에 @Transactional을 추가했습니다.

    구성 파일에 트랜잭션 관리자 추가 :

    <tx:annotation-driven/> 
    
    <bean id="transactionManager" 
     class="org.springframework.orm.hibernate4.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory"></property>
    </bean>
    
  3. ==============================

    3.디버깅 할 시간이 필요했던 부분을 추가 할 것입니다. @Transactional 어노테이션은 "public"메소드에서만 작동한다는 것을 잊지 마십시오.

    디버깅 할 시간이 필요했던 부분을 추가 할 것입니다. @Transactional 어노테이션은 "public"메소드에서만 작동한다는 것을 잊지 마십시오.

    나는 "보호 된"것들에 @Transactional을 넣었고이 오류가 발생했습니다.

    희망이 도움이 :)

    http://docs.spring.io/spring/docs/3.1.0.M2/spring-framework-reference/html/transaction.html

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

    4.어떤 패키지 u는 BaseDAOImpl 클래스에 넣었습니다 ... 나는 그것이 응용 프로그램 컨텍스트 xml에서 사용하는 것과 비슷한 패키지 이름을 필요로하며 관련 주석도 필요하다고 생각합니다.

    어떤 패키지 u는 BaseDAOImpl 클래스에 넣었습니다 ... 나는 그것이 응용 프로그램 컨텍스트 xml에서 사용하는 것과 비슷한 패키지 이름을 필요로하며 관련 주석도 필요하다고 생각합니다.

  5. from https://stackoverflow.com/questions/10459922/org-hibernate-hibernateexception-no-session-found-for-current-thread by cc-by-sa and MIT license