"Keine Sitzung gefunden für den aktuellen thread" Ausnahme bei der Verwendung von getCurrentSession()
Bin ich mit Spring MVC 4.0.6 und Hibernate 4.3.5 . Ich bin versucht, das einfügen von Werten zu meiner Datenbank-Tabelle, aber ich bekomme diese Fehlermeldung:
HTTP Status 500 - Request-Verarbeitung ist fehlgeschlagen; verschachtelte Ausnahme ist org.hibernate.HibernateException: Keine Sitzung gefunden für den aktuellen thread
Derzeit bin ich mit sessionFactory.getCurrentSession()
zu meine Daten speichern , aber wenn ich getSessionFactory().openSession();
es funktioniert perfekt. Ich habe gehört, ich sollte verwenden getCurrentSession
statt getSessionFactory().openSession();
denn es schafft eine neue Sitzung jedes mal, wenn ich eine Datenbank Abfrage.
Könntest du bitte siehe meinen code unten und sagen Sie mir, was ich falsch mache und wie man sessionFactory.getCurrentSession()
arbeiten ?
GradeServiceImpl:
@Service
@Transactional
public class GradeServiceImpl implements GradeService {
@Autowired
private GradeDao gradeDao;
@Override
public void addGrade(Grade grade) {
gradeDao.addGrade(grade);
}
}
GradeDaoImpl
@Repository
@Transactional
public class GradeDaoImpl implements GradeDao {
@Autowired
private SessionFactory sessionFactory;
public SessionFactory getSessionFactory() {
return sessionFactory;
}
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
@Override
public void addGrade(Grade grade) {
sessionFactory.getCurrentSession().save(grade);
}
}
servlet-context.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns:beans="http://www.springframework.org/schema/beans" xmlns="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<annotation-driven />
<context:annotation-config />
<context:component-scan base-package="com.spring" />
<resources mapping="/resources/**" location="/resources/" />
<!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<beans:property name="prefix" value="/WEB-INF/views/" />
<beans:property name="suffix" value=".jsp" />
</beans:bean>
<beans:bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
<beans:property name="driverClassName" value="com.mysql.jdbc.Driver" />
<beans:property name="url" value="jdbc:mysql://localhost:3306/java" />
<beans:property name="username" value="root" />
<beans:property name="password" value="" />
</beans:bean>
<beans:bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<beans:property name="basename" value="resources/messages" />
<beans:property name="defaultEncoding" value="UTF-8" />
</beans:bean>
<beans:bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<beans:property name="dataSource" ref="dataSource" />
<!-- <beans:property name="configLocation">
<beans:value>classpath:hibernate.cfg.xml</beans:value>
</beans:property> -->
<beans:property name="packagesToScan" value="com.spring" />
<beans:property name="hibernateProperties">
<beans:props>
<beans:prop key="dialect">org.hibernate.dialect.MySQLDialect</beans:prop>
<beans:prop key="show_sql">true</beans:prop>
<beans:prop key="hibernate.hbm2ddl.auto">create</beans:prop>
<beans:prop key="hibernate.show_sql">true</beans:prop>
</beans:props>
</beans:property>
</beans:bean>
<beans:bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<beans:property name="sessionFactory" ref="sessionFactory" />
</beans:bean>
</beans:beans>
Web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.5" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<!-- The definition of the Root Spring Container shared by all Servlets and Filters -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/root-context.xml</param-value>
</context-param>
<!-- Creates the Spring Container shared by all Servlets and Filters -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- Processes application requests -->
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>appServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
Update - Stack-trace
Ausnahme
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.hibernate.HibernateException: No Session found for current thread
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:973)
org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:863)
javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
Ursache
org.hibernate.HibernateException: No Session found for current thread
org.springframework.orm.hibernate4.SpringSessionContext.currentSession(SpringSessionContext.java:106)
org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:1014)
com.spring.org.dao.GradeDaoImpl.addGrade(GradeDaoImpl.java:33)
com.spring.org.service.GradeServiceImpl.addGrade(GradeServiceImpl.java:25)
com.spring.org.GradeController.saveGrade(GradeController.java:32)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
java.lang.reflect.Method.invoke(Unknown Source)
org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:215)
org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132)
org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:749)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:689)
org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:83)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:938)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:870)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961)
org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:863)
javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
Meines Wissens nach, dein problem ist es ist fein, wenn der von der Anwendung verwaltete Transaktion verwendet wird, aber nicht fein auf, JTA-verwaltete Transaktion. Ich glaube, Sie müssen ordnungsgemäß konfiguriert werden, JTA gelungen ist, wenn Sie verwenden möchten
sessionFactory.getCurrentSession()
!!!wenn Sie meinte zu sehen, wie meine
web.xml
Datei, überprüfen Sie bitte die aktualisierte code oben.Sie können auch fügen Sie Ihre stack-trace? In diesem Fall erhalten Sie die Fehlermeldung?
Mischen Sie den servlet-Kontext und root-Kontext. Root-Kontext: definiert gemeinsame Ressourcen für alle sichtbar, andere web-Komponenten, DispatcherServlet Kontext: definiert das servlet die request-Verarbeitung-Infrastruktur. Alle Ihre Hibernate-Konfiguration sollte im root-Kontext. Aber ich glaube nicht, das löst das problem aber.
InformationsquelleAutor black_belt | 2014-09-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
in Ihrem Ruhezustand Eigenschaften, fügen Sie diese Zeile.
damit Ihre hibernateProperties sieht so aus,
die Sie benötigen, um eine Transaktion zu öffnen.
So wie das tun.
}
org.hibernate.HibernateException: save is not valid without active transaction org.hibernate.context.internal.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:352) com.sun.proxy.$Proxy30.save(Unknown Source) com.spring.org.dao.GradeDaoImpl.addGrade(GradeDaoImpl.java:33) com.spring.org.service.GradeServiceImpl.addGrade(GradeServiceImpl.java:25) com.spring.org.GradeController.saveGrade(GradeController.java:32)
versuchen Sie dies, die Sie benötigen, um eine Transaktion zu öffnen.
Nun, ich denke, es wird schließlich arbeiten, aber Sie tun von hand was spring für dich tun kann, automatisch.
InformationsquelleAutor Killer
Ich hatte das gleiche problem.
War ich mit annotation-basierte Konfiguration, die ich konfiguriert haben, sessionfactory, datasource und Transaktions-manager jedes Ding. aber ich habe nicht geben @EnableTransactionManagement Anmerkung AppConfig-Klasse.
Der code sieht wie folgt aus nach dem hinzufügen der Transaktion annotation.
Den oben genannten Anmerkungen gelöst mein problem.
Bitte Stimmen Sie bis wenn dies Ihr problem löst, so dass es hilfreich sein wird für andere.
InformationsquelleAutor Anil
Entfernen Sie die @Transactional annotation auf die DAO-Implementierung. Statt in Ihrem Service-Methode;
Nur die service-Implementierung benötigt @Transactional für alle Datenbank-Operationen.
InformationsquelleAutor SPACE _PRO
Hier ist was passiert:
Wenn Sie
sessionFactory.getCurrentSession()
stattsessionFactory.openSession()
hibernate würde mich über eine session-Instanz gebunden Anwendungskontext thread (in anderen Worten eine einzige session-Instanz verwaltet werden, die von hibernate und zurückgegeben, wenn getCurrentSession() aufgerufen wird, auf session-factory) .Nun konfigurieren eine session gebunden Anwendungskontext thread müssen Sie es in den Ruhezustand Eigenschaften. Sie können tun es, indem Sie folgende Eigenschaft in
hibernateProperties
:Den Grund
sessionFactory.openSession()
funktioniert gut, ohne über hibernate Eigenschaft hibernate nicht für einesession
gebunden Anwendungskontext, die es braucht, um erstellen Sie eine neue session-Instanz jedes mal, wenn Sie rufenopenSession()
aufsessionFactory
.Hoffe, dies hilft Ihnen.
org.hibernate.HibernateException: save is not valid without active transaction org.hibernate.context.internal.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:352) com.sun.proxy.$Proxy30.save(Unknown Source) com.spring.org.dao.GradeDaoImpl.addGrade(GradeDaoImpl.java:33) com.spring.org.service.GradeServiceImpl.addGrade(GradeServiceImpl.java:25) com.spring.org.GradeController.saveGrade(GradeController.java:32)
InformationsquelleAutor Darshan Lila
Genannte Narmer, geben Sie alle Ihre Datenbank-Konfiguration im
servlet-context.xml
wenn es gehen sollteroot-context.xml
. Aber die eigentliche Ursache des Problems (oder ein symptom) ist, dass Sie keine Transaktions-proxy, wie man im stacktrace :GradeController.saveGrade
direkt aufruftGradeServiceImpl.addGrade
, die wiederum direkt aufruftGradeDaoImpl.addGrade
.Normalerweise sollte die
@Transactional
annotation nur im service layer, und nicht in der dao-Schicht (nur eine Transaktions-Schicht). Und Sie sollten sicherstellen, dass Sie autowire der Dienst von der Steuerung alsVersuchen Sie bitte, nur eine Transaktions-Schicht und sagen, wenn stacktrace zeigt eine Transaktions-proxy-Nutzung.
Edit :
Gibt es ein weiteres problem in deiner config : du hast keine
<tx:annotation-driven/>
tag, wenn es notwendig ist für das Frühjahr richtig verarbeiten@Transactional
Anmerkungen.Haben Sie entfernen die transactional-annotation aus dem DAO ?
Ballesta, ich habe versucht, das entfernen der transactional-annotation aus dem DAO, aber es hat nicht differnece. Dank
Habe ich gerade gefunden habe ein anderes problem und aktualisierte meine Antwort. Könnten Sie bitte versuchen und berichten, ob es funktioniert ?
InformationsquelleAutor Serge Ballesta
versuchen, verwenden eine ältere version von Frühling... Im mit Frühjahr 3.2.8.RELEASE mit hibernate 4.2.11.Finale...
InformationsquelleAutor LetItRock