Я создал приложение с spring + hibernate, но всегда получаю эту ошибку. Это мое первое приложение с гибернацией, я прочитал несколько руководств, но не могу решить эту проблему. Где я делаю не так?
Это код моего приложения
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()
транзакция отключится. Потому что это разные сеансы. > Добавить аннотацию @Transactional of spring в класс service @Patrikoko правильно! см. этот вопрос: stackoverflow.com/questions/15620355/… пример:@Transactional(readOnly = true, propagation = Propagation.REQUIRED, rollbackFor = {java.lang.Exception.class})
Ответы:
Вы должны включить поддержку транзакций (
<tx:annotation-driven>
или@EnableTransactionManagement
) и объявитьtransactionManager
и он должен работать черезSessionFactory
.Вы должны добавить
@Transactional
в свой@Repository
С
@Transactional
вашей@Repository
Spring может применять поддержку транзакций в репозиторий.В вашем
Student
классе нет аннотаций @ javax.persistence. *, Как@Entity
я предполагаю, что конфигурация сопоставления для этого класса была определена через XML.источник
У меня была такая же проблема, но в классе, который не был частью уровня обслуживания. В моем случае диспетчер транзакций был просто получен из контекста
getBean()
методом, а класс принадлежал к уровню представления - мой проект используетOpenSessionInView
технику.sessionFactory.getCurrentSession()
Метод, причиняли такое же исключение , как автор. Решение для меня было довольно простым.Если
getCurrentSession()
метод не срабатывает, то всеopenSession()
должно получиться.источник
sessionFactory.getCurrentSession();
успеха сеанс не должен закрываться, но в случаеsessionFactory.openSession();
успеха он должен быть закрытFunction<Session,T>
означающую «если бы у меня был сеанс, я бы использовал его для выполнения X». Затем метод обрабатывает подготовку и (при необходимости) деинициализацию сеанса и просто возвращает T. Таким образом, внешние потребители службы фактически никогда не получат доступ к сеансуДобавьте аннотацию @Transactional of spring в класс service
источник
В вашем xyz.DAOImpl.java
Проделайте следующие шаги:
источник
Я добавил эту конфигурацию в web.xml, и она мне подходит!
Кроме того, самый ранжированный ответ дает мне подсказки, чтобы предотвратить панику приложения при первом запуске.
источник
Вам необходимо разрешить транзакцию для вашего метода DAO. Добавить,
над вашими методами дао. И
@Transactional
должно быть из упаковки:источник
У меня тоже была эта ошибка, потому что в файле, где я использовал
@Transactional
аннотацию, я импортировал неправильный классВместо javax используйте
источник
Мое решение (с использованием Spring) помещало метод, который не работает, в другой метод, который создает и фиксирует транзакцию.
Для этого я сначала ввел следующее:
И вот наконец сделал это:
источник
@Transactional =javax.transaction.Transactional
. Положи это рядом@Repository
.источник
Моя конфигурация была такой. У меня были QuartzJob , Service Bean и Dao. как обычно, он был настроен с помощью LocalSessionFactoryBean (для гибернации) и SchedulerFactoryBean для структуры Quartz. при написании задания Quartz я по ошибке аннотировал его с помощью @ Service , я не должен был этого делать, потому что я использовал другую стратегию для подключения QuartzBean с помощью AutowiringSpringBeanJobFactory, расширяющего SpringBeanJobFactory .
Итак, что на самом деле происходило, так это то, что из-за Quartz Autowire TX вводился в объект Job Bean, и в то же время контекст Tx был установлен с помощью аннотации @ Service, и, следовательно, TX не синхронизировался !!
Я надеюсь, что это поможет тем, для кого вышеуказанные решения действительно не решили проблему. Я использовал Spring 4.2.5 и Hibernate 4.0.1,
Я вижу, что в этом потоке есть ненужное предложение добавить аннотацию @ Transactional к DAO (@ Repository ), это бесполезное предложение, потому что @ Repository имеет все, что ему нужно, не нужно специально устанавливать этот @ transactional на DAO, так как DAO вызываются из служб, которые уже были введены @Trasancational . Надеюсь, это может быть полезно людям, которые вместе используют Quartz, Spring и Hibernate.
источник
Добавить
transaction-manager
в свой<annotation-driven/>
в весенне-servlet.xml:источник
Проверьте свой класс дао. Должно быть так:
И аннотации:
источник
Я столкнулся с той же проблемой и, наконец, обнаружил, что
<tx:annotaion-driven />
не был определен в[dispatcher]-servlet.xml
элементе where component-scan включен@service
аннотированном классе .Проще говоря,
<tx:annotaion-driven />
вместе с элементом сканирования компонента проблема исчезла.источник
Моя аналогичная проблема была исправлена с помощью двух подходов.
1) Ручная обработка транзакций:
2) Скажите Spring открывать и управлять транзакциями для вас в ваших
web.xml
фильтрах и убедитесь, что вы используете@Repository
@Transactional
:источник
Спасибо за комментарий mannedear. Я использую springmvc, и в моем случае я должен использовать как
и я также добавляю spring-context в pom.xml, и он работает
источник
Я была такая же проблема. Я решил это следующим образом:
Добавьте в
dispatcher-servlet
файл эту строку :Проверьте
<beans>
раздел выше в том же файле. Эти две строки должны присутствовать:Также убедитесь, что вы добавили
@Repository
и@Transactional
где используетеsessionFactory
.источник
В этом классе выше
@Repository
просто размещена еще одна аннотация, и@Transactional
она будет работать. Если все работает, ответьте (Y
/N
):источник