2012-05-05 20 views
32

dostaję powyższy wyjątek z Spring3 i Hibernte4org.hibernate.HibernateException: Nie Sesja znalezionych dla bieżącego wątku

Oto mój plik xml fasoli

<?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> 

Moja klasa BaseDAO wygląda następująco

public class BaseDAOImpl implements BaseDAO{ 
private SessionFactory sessionFactory; 

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

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

następujący kod zgłasza wyjątek w tytule

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

Czy ktoś ma pomysł, jak rozwiązać ten problem?

Odpowiedz

43

getCurrentSession() ma sens tylko w zakresie transakcji.

Należy zadeklarować odpowiedniego menedżera transakcji, wyznaczyć granicę transakcji i uzyskać dostęp do danych w jej obrębie. Na przykład:

<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 
    } 
}); 

Patrz także:

+0

Dzięki za odpowiedź. Zajrzę do zasobów, które masz powyżej. –

+4

'' powinna być również zawarta w sposób opisany przez [@ vishal-jagtap] (http://stackoverflow.com/questions/10459922/org-hibernate-hibernateexception-no-session-found-for -current-thread/# 16296691) –

+0

Dziękuję bardzo, to bardzo mi pomogło. –

-1

W którym pakiecie umieściłeś klasę BaseDAOImpl .. Myślę, że wymaga to nazwy pakietu podobnej do tej, której użyto w kontekście xml aplikacji i wymaga również odpowiedniej adnotacji.

24

natknąłem sam problem został rozwiązany i jak poniżej Dodano @Transactional na daoImpl klasy

Dodany menedżer trnsaction w pliku konfiguracyjnym:

<tx:annotation-driven/> 

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

To zadziałało dobrze dla mnie. Uratowałem mój dzień. : D – wsams

+0

dzięki ... to działało również ze mną .. –

5

dodam tylko coś, co zajęło mi trochę czasu do debugowania: Nie zapomnij, że @Transactional adnotacja będzie działać tylko na metodach „publiczna”.

Umieściłem @Transactional na "chronionych" i dostałem ten błąd.

Nadzieja to pomaga :)

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

widoczność metoda i @Transactional

Podczas używania serwerów proxy, należy zastosować @Transactional adnotacji tylko do metod z widocznością publicznego. Jeśli wykonasz anotację chronioną, metody prywatne lub pakietowe z adnotacją @Transactional, nie zostanie zgłoszony żaden błąd, ale metoda z adnotacjami nie wykazuje skonfigurowanych ustawień transakcyjnych . Rozważ użycie AspectJ (zobacz poniżej: ), jeśli chcesz opisywać metody niepubliczne.