webentwicklung-frage-antwort-db.com.de

org.hibernate.HibernateException: Für den aktuellen Thread wurde keine Sitzung gefunden

Ich bekomme die obige Ausnahme mit Spring3 und Hibernte4

Das Folgende ist meine Bean-XML-Datei

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

Meine BaseDAO-Klasse sieht so aus

public class BaseDAOImpl implements BaseDAO{
private SessionFactory sessionFactory;

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

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

Der folgende Code löst die Ausnahme im Titel aus

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

Hat jemand eine Idee, wie man dieses Problem löst?

33
Can't Tell

getCurrentSession() macht nur innerhalb eines Transaktionsbereichs Sinn.

Sie müssen einen geeigneten Transaktionsmanager deklarieren, Transaktionsgrenzen abgrenzen und den Datenzugriff darin ausführen. Zum Beispiel wie folgt:

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

Siehe auch:

45
axtavt

Ich bin auf dasselbe Problem gestoßen und wurde wie unten beschrieben gelöst. @Transactional in der daoImpl-Klasse hinzugefügt

Trnsaction manager in Konfigurationsdatei hinzugefügt:

<tx:annotation-driven/> 

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

Ich füge nur etwas hinzu, dessen Debugging einige Zeit in Anspruch nahm: Vergessen Sie nicht, dass eine @ Transactional-Annotation nur bei "öffentlichen" Methoden funktioniert.

Ich habe einige @Transactional auf "geschützte" gesetzt und diesen Fehler bekommen.

Ich hoffe es hilft :)

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

Methodensichtbarkeit und @Transactional

Wenn Sie Proxys verwenden, sollten Sie die Annotation @Transactional nur auf Methoden mit öffentlicher Sichtbarkeit anwenden. Wenn Sie geschützte, private oder für Pakete sichtbare Methoden mit der @ Transactional-Annotation mit Anmerkungen versehen, wird kein Fehler ausgegeben, die mit Anmerkungen versehene Methode weist jedoch nicht die konfigurierten Transaktionseinstellungen auf. Ziehen Sie die Verwendung von AspectJ in Betracht (siehe unten), wenn Sie nicht öffentliche Methoden mit Anmerkungen versehen müssen.

6
lboix