it-swarm.com.de

Spring Hibernate - Transaktionssynchronisierte Sitzung für aktuellen Thread konnte nicht abgerufen werden

Ich habe eine Anwendung mit spring + hibernate erstellt, diese Fehlermeldung wird jedoch immer angezeigt. Dies ist meine erste Anwendung mit Hibernate. Ich habe einige Anleitungen gelesen, kann dieses Problem jedoch nicht lösen. Wo mache ich falsch?

Dies ist der Code meiner Bewerbung

ott 05, 2014 4:03:06 PM org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh
Informazioni: Refreshing   org[email protected]1eab16b: startup date  [Sun Oct 05 16:03:06 CEST 2014]; root of context hierarchy
ott 05, 2014 4:03:06 PM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
Informazioni: Loading XML bean definitions from class path resource [springConfig.xml]
ott 05, 2014 4:03:08 PM org.hibernate.annotations.common.reflection.Java.JavaReflectionManager <clinit>
INFO: HCANN000001: Hibernate Commons Annotations {4.0.5.Final}
ott 05, 2014 4:03:08 PM org.hibernate.Version logVersion
INFO: HHH000412: Hibernate Core {4.3.6.Final}
ott 05, 2014 4:03:08 PM org.hibernate.cfg.Environment <clinit>
INFO: HHH000206: hibernate.properties not found
ott 05, 2014 4:03:08 PM org.hibernate.cfg.Environment buildBytecodeProvider
INFO: HHH000021: Bytecode provider name : javassist
ott 05, 2014 4:03:09 PM org.hibernate.dialect.Dialect <init>
INFO: HHH000400: Using dialect: org.hibernate.dialect.MySQL5Dialect
ott 05, 2014 4:03:09 PM org.hibernate.engine.transaction.internal.TransactionFactoryInitiator initiateService
INFO: HHH000399: Using default transaction strategy (direct JDBC transactions)
ott 05, 2014 4:03:09 PM org.hibernate.hql.internal.ast.ASTQueryTranslatorFactory <init>
INFO: HHH000397: Using ASTQueryTranslatorFactory
Exception in thread "main" org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current thread
at org.springframework.orm.hibernate4.SpringSessionContext.currentSession(SpringSessionContext.Java:134)
at org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.Java:1014)
at coreservlets.StudentDAOImpl.create(StudentDAOImpl.Java:19)
at coreservlets.MainApp.main(MainApp.Java:14)

student.java

package coreservlets;

public class Student {

    private Integer id;
    private String name;
    private Integer age;

    public Integer getId(){return id;}//getId

    public void setId(Integer id){this.id=id;}//setId

    public String getName(){return name;}//getName

    public void setName(String name){this.name=name;}//setName

    public Integer getAge(){return age;}//getAge

    public void setAge(Integer age){this.age=age;}//setAge

}//Student

studentDAO.Java

package coreservlets;

import org.hibernate.SessionFactory;

public interface StudentDAO {

    public void setSessionFactory(SessionFactory sessionFactory);

    public void create(String name,Integer age);

}//StudentDAO

StudentDAOImpl.Java

package coreservlets;

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

@Repository
public class StudentDAOImpl implements StudentDAO {

    private SessionFactory sessionFactory;

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

    public void create(String name,Integer age){
        Session session=sessionFactory.getCurrentSession();
        Student student=new Student();
        student.setName(name);
        student.setAge(age);
        session.save(student);
    }//create

}//StudentDAOImpl

MainApp.Java

package coreservlets;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainApp {

    public static void main(String[] args) {

        ApplicationContext context=new ClassPathXmlApplicationContext("springConfig.xml");

        StudentDAOImpl student=(StudentDAOImpl) context.getBean("studentDAOImpl");

        student.create("Alessandro", new Integer(33));


    }//main

}//MainApp

springConfig.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd
    http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd">

<context:annotation-config/>

<context:component-scan base-package="coreservlets"/>

<bean id="dataSource" class="org.Apache.commons.dbcp2.BasicDataSource">
  <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
  <property name="url" value="jdbc:mysql://localhost:3306/spring_hibernate"/>
  <property name="username" value="root"/>
  <property name="password" value="password"/>
  <property name="initialSize" value="5"/>
  <property name="maxTotal" value="10"/>
</bean>

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

</bean>

</beans>

sql

create table student
(
id integer not null auto_increment,
name varchar(20) not null,
age integer not null,
primary key(id)
);
85
Alex

Sie müssen aktivieren die Transaktionsunterstützung (<tx:annotation-driven> oder @EnableTransactionManagement) und deklarieren die transactionManager und es sollte durch die SessionFactory funktionieren.

Sie müssen @Transactional in Ihren @Repository einfügen.

Mit @Transactional in Ihrem @Repository Spring kann Transaktionsunterstützung in Ihrem Repository angewendet werden.

Ihre Student-Klasse enthält keine @ javax.persistence. * -Anmerkungen wie @Entity, ich gehe davon aus, dass die Mapping-Konfiguration für diese Klasse über XML definiert wurde.

169
Manuel Jordan

Ich hatte das gleiche Problem, aber in einer Klasse, die nicht Teil der Serviceschicht war. In meinem Fall wurde der Transaktionsmanager einfach durch die getBean()-Methode aus dem Kontext abgerufen, und die Klasse gehörte zur Ansichtsebene - mein Projekt verwendet die OpenSessionInView-Technik.

Die sessionFactory.getCurrentSession()-Methode hat dieselbe Ausnahme verursacht wie die des Autors. Die Lösung für mich war ziemlich einfach.

Session session;

try {
    session = sessionFactory.getCurrentSession();
} catch (HibernateException e) {
    session = sessionFactory.openSession();
}

Wenn die getCurrentSession()-Methode fehlschlägt, sollte die openSession() den Trick ausführen.

31
itachi

Fügen Sie im Klassen-Service die Anmerkung @Transactional von spring hinzu

11
Patrikoko

In Ihrem xyz.DAOImpl.Java

Führen Sie die folgenden Schritte aus:

// Schritt-1: Sitzungsfabrik einstellen

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

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

// Schritt-2: Versuchen Sie, die aktuelle Sitzung abzurufen, und erfassen Sie die HibernateException-Ausnahme. 


// Schritt-3: Wenn es eine HibernateException-Ausnahme gibt, dann true, um openSession zu erhalten. 

try 
{
    //Step-2: Implementation
    session = sessionFactory.getCurrentSession();
} 
catch (HibernateException e) 
{
    //Step-3: Implementation
    session = sessionFactory.openSession();
}
2
ArunDhwaj IIITH

@Transactional = javax.transaction.Transactional setzt es neben @Repository 

1
Alter Hu

Ich habe diese Konfiguration in web.xml hinzugefügt und es funktioniert gut für mich!

<filter>
    <filter-name>OpenSessionInViewFilter</filter-name>
    <filter-class>org.springframework.orm.hibernate5.support.OpenSessionInViewFilter</filter-class>
    <init-param>
        <param-name>sessionFactoryBeanName</param-name>
        <param-value>sessionFactory</param-value>
    </init-param>
    <init-param>
        <param-name>flushMode</param-name>
        <param-value>AUTO</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>OpenSessionInViewFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

Darüber hinaus gibt mir die am besten bewertete Antwort Hinweise, um zu verhindern, dass die Anwendung beim ersten Lauf in Panik gerät.

1
何德福

Sie müssen die Transaktion für Ihre DAO-Methode zulassen Hinzufügen,

@Transactional (readOnly = true, propagation = Propagation.NOT_SUPPORTED)

über Ihre Dao-Methoden .. und @Transactional sollte von Paket sein,

org.springframework.transaction.annotation.Transactional

1
RahuL Sharma

Ich hatte auch diesen Fehler, weil ich in der Datei, in der ich @Transactional Annotation verwendete, die falsche Klasse importierte

import javax.transaction.Transactional; 

Verwenden Sie anstelle von Javax

import org.springframework.transaction.annotation.Transactional; 
1
browndoor

Meine Konfiguration war so. Ich hatte einen QuartzJob, eine Service Bean und Dao. Wie üblich wurde es mit LocalSessionFactoryBean (für Ruhezustand) und SchedulerFactoryBean für Quartz-Framework konfiguriert. Beim Schreiben des Quartz-Jobs habe ich ihn fälschlicherweise mit @ Service kommentiert. Ich hätte das nicht tun sollen, weil ich eine andere Strategie zum Verdrahten von QuartzBean unter Verwendung von AutowiringSpringBeanJobFactory erweiterete SpringBeanJobFactory

Tatsächlich war es so, dass TX aufgrund von Quartz Autowire in den Job Bean injiziert wurde und gleichzeitig der Tx-Kontext durch @ Service - Annotation festgelegt wurde und daher der TX nicht mehr synchron war !! 

Ich hoffe, es hilft denen, für die oben genannte Lösungen das Problem nicht wirklich gelöst haben. Ich habe Spring 4.2.5 und Hibernate 4.0.1 verwendet, 

Ich sehe, dass in diesem Thread ein unnötiger Vorschlag zum Hinzufügen von @ Transactional Annotation zum DAO (@ Repository) vorhanden ist. Dies ist ein sinnloser Vorschlag, denn @ Repository hat alles, was es braucht muss nicht extra @ transactional auf DAOs setzen, da die DAOs von den Services aufgerufen werden, die bereits von @Trasancational injiziert wurden. Ich hoffe, dass dies hilfreiche Leute sein könnten, die Quarz, Frühling und Hibernate zusammen verwenden. 

0
SANJAY GAUTAM

Ich stieß auf das gleiche Problem und fand schließlich heraus, dass das nicht in der Datei [dispatcher] -servlet.xml definiert war, in der das Komponente-Scan-Element die Annotationsklasse @service aktiviert hat. 

Einfach mit dem Component-Scan-Element zusammengefügt, das Problem ist verschwunden.

0
Lee

Fügen Sie transaction-manager zu Ihrem <annotation-driven/> in spring-servlet.xml hinzu:

<tx:annotation-driven transaction-manager="yourTransactionBeanID"/>
0
Majid

Meine Lösung bestand darin (mit Spring), die fehlgeschlagene Methode in eine andere Methode zu setzen, die die Transaktion erstellt und festschreibt.

Dafür habe ich zuerst folgendes injiziert:

@Autowired
private PlatformTransactionManager transactionManager;

Und schließlich tat dies:

public void newMethod() {
    DefaultTransactionDefinition definition = new DefaultTransactionDefinition();
    TransactionStatus transaction = transactionManager.getTransaction(definition);

    oldMethod();

    transactionManager.commit(transaction);
}
0
Aliuk

Mein ähnliches Problem wurde mit zwei Ansätzen behoben.

  1. Durch manuelle Abwicklung von Transaktionen.

    Sitzung session = sessionFactory.getCurrentSession ();

    Transaktion tx = session.beginTransaction ();

    UserInfo user = (UserInfo) session.get (UserInfo.class, 1);

    tx.commit ();

  2. Teilen Sie Spring mit, dass Sie Transaktionen in Ihren web.xml-Filtern öffnen und verwalten und stellen Sie sicher, dass Sie @Repository @Transactional verwenden

    <filter> <filtername> hibernateFilter </ filtername> <filter-class> org.springframework.orm.hibernate5.support.OpenSessionInViewFilter </ filter-class> <init-param> <param-name> sessionFactory <Parameterwert> session.factory </ init-param> </ filter> <Filterzuordnung> <filtername> hibernateFilter </ filtername> <url-pattern>/* </ url-pattern> </ filter-mapping>

Bitte entschuldigen Sie die falsche Formatierung.

0

Überprüfen Sie Ihre Dao-Klasse. Es muss so sein: 

Session session = getCurrentSession();
Query query = session.createQuery(GET_ALL);

Und Anmerkungen:

@Transactional
@Repository
0