Ich habe eine Anwendung mit spring + hibernate erstellt, erhalte jedoch immer diesen Fehler. Dies ist meine erste Anwendung im Ruhezustand. 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.springframework.context.support.ClassPathXmlApplicationContext@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)
);
sessionFactory.openSession()
die Transaktion wird deaktiviert. Weil sie nicht dieselbe Sitzung sind. > Fügen Sie die Anmerkung @Transactional of spring in den Klassendienst @Patrikoko ein! siehe diese Frage: stackoverflow.com/questions/15620355/… Beispiel:@Transactional(readOnly = true, propagation = Propagation.REQUIRED, rollbackFor = {java.lang.Exception.class})
Antworten:
Sie müssen aktivieren Sie die Transaktionsunterstützung (
<tx:annotation-driven>
oder@EnableTransactionManagement
) und erklären das ,transactionManager
und es sollte durch die ArbeitSessionFactory
.Sie müssen
@Transactional
in Ihre hinzufügen@Repository
Mit
@Transactional
in your@Repository
Spring können Sie Transaktionsunterstützung in Ihrem Repository anwenden.Ihre
Student
Klasse hat keine @ javax.persistence. * Anmerkungen wie@Entity
, ich gehe davon aus, dass die Zuordnungskonfiguration für diese Klasse über XML definiert wurde.quelle
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 verwendetOpenSessionInView
Technik.Die
sessionFactory.getCurrentSession()
Methode hat dieselbe Ausnahme verursacht wie die des Autors. Die Lösung war für mich ziemlich einfach.Wenn die
getCurrentSession()
Methode fehlschlägt,openSession()
sollte der den Trick machen.quelle
sessionFactory.getCurrentSession();
erfolgreich, die Sitzung nicht geschlossen werden sollte, aber wennsessionFactory.openSession();
erfolgreich ist, muss sie geschlossen werdenFunction<Session,T>
was bedeutet "Wenn ich eine Sitzung hätte, würde ich es verwenden, um X zu tun". Dann behandelt die Methode die Bereitstellung und (falls erforderlich) die Bereitstellung der Sitzung und gibt nur das T zurück. Externe Verbraucher des Dienstes erhalten also nie eine Sitzung in die HändeFügen Sie die Annotation @Transactional of spring zum Klassendienst hinzu
quelle
In Ihrer xyz.DAOImpl.java
Führen Sie die folgenden Schritte aus:
quelle
Ich habe diese Konfiguration in web.xml hinzugefügt und es funktioniert gut für mich!
Darüber hinaus gibt mir die am besten bewertete Antwort Hinweise, um zu verhindern, dass die Anwendung beim ersten Durchlauf in Panik gerät.
quelle
Sie müssen die Transaktion für Ihre DAO-Methode zulassen. Hinzufügen,
über Ihre Dao-Methoden. Und
@Transactional
sollte aus dem Paket sein:quelle
Ich hatte auch diesen Fehler, weil ich in der Datei, in der ich
@Transactional
Annotation verwendet habe, die falsche Klasse importiert habeVerwenden Sie anstelle von Javax
quelle
Meine Lösung bestand darin, (mithilfe von Spring) die fehlgeschlagene Methode in eine andere Methode zu integrieren, mit der die Transaktion erstellt und festgeschrieben wird.
Dazu habe ich zuerst folgendes injiziert:
Und schließlich tat dies:
quelle
@Transactional =javax.transaction.Transactional
. Stell es einfach daneben@Repository
.quelle
Meine Konfiguration war so. Ich hatte einen QuartzJob , eine Service Bean und Dao. Wie üblich wurde es mit LocalSessionFactoryBean (für den Ruhezustand) und SchedulerFactoryBean für das Quartz-Framework konfiguriert. während die Arbeit Quartz schreiben, kommentierte ich versehentlich es mit @ - Service , sollte ich das getan haben , nicht , weil ich eine andere Strategie wurde mit der verdrahten QuartzBean mit AutowiringSpringBeanJobFactory erstreckt SpringBeanJobFactory .
Was also tatsächlich geschah, war, dass TX aufgrund von Quartz Autowire in die Job Bean injiziert wurde und gleichzeitig der Tx-Kontext aufgrund der @ Service- Annotation festgelegt wurde und daher der TX nicht mehr synchron war !!
Ich hoffe, es hilft denen, für die die oben genannten Lösungen das Problem wirklich nicht gelöst haben. Ich habe Spring 4.2.5 und Hibernate 4.0.1 verwendet.
Ich sehe , dass in diesem Thread @ es ein unnötiger Vorschlag hinzuzufügen , ist Transactional Anmerkung zu dem DAO (@ Repository ), das ist eine nutzlose Vorschlag Ursache @ Repository hat alles , was es nicht speziell festgelegt haben muss müssen , dass @ Transaktions auf DAOs, wie die DAOs von den Diensten aufgerufen werden, die bereits von @Trasancational injiziert wurden . Ich hoffe, dass dies hilfreiche Leute sein können, die Quarz, Frühling und Winterschlaf zusammen verwenden.
quelle
Fügen Sie
transaction-manager
Ihrer<annotation-driven/>
in spring-servlet.xml hinzu:quelle
Überprüfen Sie Ihre Dao-Klasse. Es muss so sein:
Und Anmerkungen:
quelle
Ich bin auf dasselbe Problem gestoßen und habe schließlich herausgefunden, dass das
<tx:annotaion-driven />
nicht in der Klasse annotiert ist, in der[dispatcher]-servlet.xml
das Komponenten-Scan-Element aktiviert ist@service
.Einfach zusammengesetzt
<tx:annotaion-driven />
mit dem Komponenten-Scan-Element, verschwand das Problem.quelle
Mein ähnliches Problem wurde mit weniger als 2 Ansätzen behoben.
1) Durch manuelle Abwicklung von Transaktionen:
2) Weisen Sie Spring an, Transaktionen in Ihren
web.xml
Filtern für Sie zu öffnen und zu verwalten, und stellen Sie sicher, dass Sie Folgendes verwenden@Repository
@Transactional
:quelle
Danke für den Kommentar von mannedear. Ich benutze springmvc und in meinem Fall muss ich als verwenden
und ich füge auch pom.xml spring-context hinzu und es funktioniert
quelle
Ich hatte das gleiche Problem. Ich habe es folgendermaßen gelöst:
Fügen Sie diese Zeile zur
dispatcher-servlet
Datei hinzu:Überprüfen Sie den obigen
<beans>
Abschnitt in derselben Datei. Diese beiden Zeilen müssen vorhanden sein:Stellen Sie außerdem sicher, dass Sie hinzugefügt haben
@Repository
und@Transactional
wo Sie verwendensessionFactory
.quelle
In dieser Klasse oben wurde
@Repository
nur eine weitere Anmerkung platziert@Transactional
, die funktioniert. Wenn es funktioniert, antworte zurück (Y
/N
):quelle