Saya membuat aplikasi dengan musim semi + hibernasi, tetapi saya selalu mendapatkan kesalahan ini. Ini adalah aplikasi pertama saya dengan hibernate, saya membaca beberapa panduan tetapi saya tidak dapat menyelesaikan masalah ini. Dimana saya melakukan kesalahan?
Ini adalah kode aplikasi saya
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()
transaksi akan dinonaktifkan. Karena mereka bukanlah sesi yang sama. > Tambahkan anotasi @Transactional of spring di layanan kelas @Patrikoko benar! lihat pertanyaan ini: stackoverflow.com/questions/15620355/… contoh:@Transactional(readOnly = true, propagation = Propagation.REQUIRED, rollbackFor = {java.lang.Exception.class})
Jawaban:
Anda harus mengaktifkan dukungan transaksi (
<tx:annotation-driven>
atau@EnableTransactionManagement
) dan menyatakan yangtransactionManager
dan harus bekerja melaluiSessionFactory
.Anda harus menambahkan
@Transactional
ke dalam@Repository
Dengan
@Transactional
di@Repository
Spring dapat menerapkan dukungan transaksional ke dalam repositori Anda.Student
Kelas Anda tidak memiliki penjelasan @ javax.persistence. * Bagaimana@Entity
, saya mengasumsikan Konfigurasi Pemetaan untuk kelas itu telah ditentukan melalui XML.sumber
Saya memiliki masalah yang sama, tetapi di kelas yang bukan bagian dari lapisan layanan. Dalam kasus saya, manajer transaksi hanya diperoleh dari konteks dengan
getBean()
metode, dan kelas termasuk dalam lapisan tampilan - proyek saya menggunakanOpenSessionInView
teknik.The
sessionFactory.getCurrentSession()
metode, telah menyebabkan pengecualian yang sama sebagai penulis yang. Solusi bagi saya cukup sederhana.Jika
getCurrentSession()
metode ini gagal,openSession()
trik seharusnya berhasil.sumber
sessionFactory.getCurrentSession();
berhasil maka sesi tidak boleh ditutup tetapi jikasessionFactory.openSession();
berhasil harus ditutupFunction<Session,T>
berarti "jika saya memiliki sesi, saya akan menggunakannya untuk melakukan X". Kemudian metode menangani penyediaan dan (Jika perlu) mencabut akses sesi, dan hanya mengembalikan T. Jadi konsumen eksternal layanan tidak pernah benar-benar mendapatkan sesi merekaTambahkan anotasi @Transactional of spring di layanan kelas
sumber
Di xyz.DAOImpl.java Anda
Lakukan langkah-langkah berikut:
sumber
Saya menambahkan konfigurasi ini di web.xml dan berfungsi dengan baik untuk saya!
Selain itu, jawaban dengan peringkat tertinggi memberi saya petunjuk untuk mencegah aplikasi panik saat pertama kali dijalankan.
sumber
Anda perlu mengizinkan transaksi ke metode DAO Anda. Menambahkan,
atas metode dao Anda. Dan
@Transactional
harus dari paket:sumber
Saya mengalami kesalahan ini juga karena di file tempat saya menggunakan
@Transactional
anotasi, saya mengimpor kelas yang salahAlih-alih javax, gunakan
sumber
Solusi saya adalah (menggunakan Spring) meletakkan metode yang gagal di dalam metode lain yang membuat dan melakukan transaksi.
Untuk melakukan itu saya pertama kali menyuntikkan berikut ini:
Dan akhirnya melakukan ini:
sumber
@Transactional =javax.transaction.Transactional
. Taruh di samping@Repository
.sumber
Konfigurasi saya seperti ini. Saya memiliki QuartzJob , Service Bean, dan Dao. seperti biasa itu dikonfigurasi dengan LocalSessionFactoryBean (untuk hibernate), dan SchedulerFactoryBean untuk kerangka Quartz. saat menulis pekerjaan Quartz, saya secara tidak sengaja memberi anotasi dengan @ Service , saya seharusnya tidak melakukannya karena saya menggunakan strategi lain untuk menghubungkan QuartzBean menggunakan AutowiringSpringBeanJobFactory dengan memperpanjang SpringBeanJobFactory .
Jadi yang sebenarnya terjadi adalah karena Quartz Autowire, TX disuntikkan ke Job Bean dan pada saat yang sama Tx Context ditetapkan berdasarkan anotasi @ Service dan karenanya TX tidak sinkron !!
Saya berharap ini membantu mereka yang solusi di atas benar-benar tidak menyelesaikan masalah. Saya menggunakan Spring 4.2.5 dan Hibernate 4.0.1,
Saya melihat bahwa di utas ini ada saran yang tidak perlu untuk menambahkan anotasi @ Transaksional ke DAO (@ Repository ), itu adalah saran yang tidak berguna karena @ Repositori memiliki semua yang diperlukannya tidak harus secara khusus mengatur @ transaksional itu pada DAO, sebagai DAO dipanggil dari layanan yang telah diinjeksi oleh @Trasancational . Saya harap ini bisa membantu orang-orang yang menggunakan Quartz, Spring dan Hibernate bersama-sama.
sumber
Tambahkan
transaction-manager
ke Anda<annotation-driven/>
di spring-servlet.xml:sumber
Periksa kelas dao Anda. Ini harus seperti ini:
Dan anotasi:
sumber
Saya mengalami masalah yang sama dan akhirnya menemukan bahwa
<tx:annotaion-driven />
itu tidak didefinisikan dalam kelas beranotasi di[dispatcher]-servlet.xml
mana elemen pemindaian komponen diaktifkan@service
.Sederhananya
<tx:annotaion-driven />
dengan elemen pemindaian komponen, masalah tersebut menghilang.sumber
Masalah serupa saya diperbaiki dengan 2 pendekatan di bawah ini.
1) Melalui penanganan transaksi secara manual:
2) Beri tahu Spring untuk membuka dan mengelola transaksi untuk Anda di
web.xml
filter Anda dan Pastikan untuk menggunakan@Repository
@Transactional
:sumber
Terima kasih atas komentar mannedear. Saya menggunakan springmvc dan dalam kasus saya, saya harus menggunakan sebagai
dan saya juga menambahkan konteks pegas ke pom.xml dan berhasil
sumber
Saya memiliki masalah yang sama. Saya menyelesaikannya dengan melakukan hal berikut:
Tambahkan baris ini ke
dispatcher-servlet
file:Periksa
<beans>
bagian di atas di file yang sama. Kedua baris ini harus ada:Juga pastikan Anda menambahkan
@Repository
dan di@Transactional
mana Anda menggunakansessionFactory
.sumber
Di kelas ini di atas
@Repository
hanya menempatkan satu penjelasan lagi@Transactional
itu akan berfungsi. Jika berhasil, balas kembali (Y
/N
):sumber