Saya mendapatkan kesalahan ini ketika mencoba memanggil metode "bertahan" untuk menyimpan model entitas ke database di aplikasi web Spring MVC saya. Tidak dapat menemukan pos atau laman mana pun di internet yang dapat dikaitkan dengan kesalahan khusus ini. Sepertinya ada sesuatu yang salah dengan kacang EntityManagerFactory tapi saya cukup baru untuk pemrograman Spring jadi bagi saya sepertinya semuanya diinisialisasi dengan baik dan menurut berbagai artikel tutorial di web.
dispatcher-servlet.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:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:jpa="http://www.springframework.org/schema/data/jpa"
xsi:schemaLocation="
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/jdbc
http://www.springframework.org/schema/jdbc/spring-jdbc-3.2.xsd
http://www.springframework.org/schema/data/jpa
http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd
http://www.springframework.org/schema/data/repository
http://www.springframework.org/schema/data/repository/spring-repository-1.5.xsd
http://www.springframework.org/schema/jee
http://www.springframework.org/schema/jee/spring-jee-3.2.xsd">
<context:component-scan base-package="wymysl.Controllers" />
<jpa:repositories base-package="wymysl.repositories"/>
<context:component-scan base-package="wymysl.beans" />
<context:component-scan base-package="wymysl.Validators" />
<bean
class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />
<bean class="org.springframework.orm.hibernate4.HibernateExceptionTranslator"/>
<bean id="passwordValidator" class="wymysl.Validators.PasswordValidator"></bean>
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
<property name="url" value="jdbc:oracle:thin:@localhost:1521:xe" />
<property name="username" value="system" />
<property name="password" value="polskabieda1" />
</bean>
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceXmlLocation" value="classpath:./META-INF/persistence.xml" />
<property name="dataSource" ref="dataSource" />
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="databasePlatform" value="org.hibernate.dialect.H2Dialect" />
<property name="showSql" value="true" />
<property name="generateDdl" value="false" />
</bean>
</property>
<property name="jpaProperties">
<props>
<prop key="hibernate.max_fetch_depth">3</prop>
<prop key="hibernate.jdbc.fetch_size">50</prop>
<prop key="hibernate.jdbc.batch_size">10</prop>
</props>
</property>
</bean>
<mvc:annotation-driven />
<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basename" value="classpath:messages" />
</bean>
<bean name="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix">
<value>/WEB-INF/jsp/</value>
</property>
<property name="suffix">
<value>.jsp</value>
</property>
</bean>
<mvc:resources mapping="/resources/**" location="/resources/" />
<mvc:resources mapping="/resources/*" location="/resources/css/"
cache-period="31556926"/>
</beans>
RegisterController.java
@Controller
public class RegisterController {
@PersistenceContext
EntityManager entityManager;
@Autowired
PasswordValidator passwordValidator;
@InitBinder
private void initBinder(WebDataBinder binder) {
binder.setValidator(passwordValidator);
}
@RequestMapping(value = "/addUser", method = RequestMethod.GET)
public String register(Person person) {
return "register";
}
@RequestMapping(value = "/addUser", method = RequestMethod.POST)
public String register(@ModelAttribute("person") @Valid @Validated Person person, BindingResult result) {
if(result.hasErrors()) {
return "register";
} else {
entityManager.persist(person);
return "index";
}
}
java
spring
spring-mvc
web-applications
Michał Bil
sumber
sumber
@Transaction
.Jawaban:
Saya memiliki masalah yang sama dan saya menjelaskan metode yang digunakan
@Transactional
dan berhasil.UPDATE: memeriksa dokumentasi pegas sepertinya secara default PersistenceContext bertipe Transaction, jadi itu sebabnya metode tersebut harus bersifat transaksional ( http://docs.spring.io/spring/docs/current/spring-framework-reference/ html / orm.html ):
sumber
@Transactional
annosi memanggil metode dengan@Transactional
anotasi di classfile yang sama, Anda juga akan terkejut oleh kesalahan ini (itulah yang saya hadapi).@Transactional
, yang juga berfungsi. Tidak yakin apakah itu cara yang tepat untuk pergi tetapi sepertinya itu berfungsi dengan baik ...Saya mendapat pengecualian ini ketika mencoba menggunakan metode kustom deleteBy di repositori data spring. Operasi itu dicoba dari kelas uji JUnit.
Pengecualian tidak terjadi saat menggunakan
@Transactional
anotasi di tingkat kelas JUnit.sumber
@Transactional
di tingkat kelas dapat menutupi kemungkinan masalah pengujian yang memanipulasi transaksi berbeda di layanan Anda.@Trasactional
metode repositori karena ini adalah tempat saya berinteraksi dengan database dan berfungsi dengan baik.Kesalahan ini membuat saya rubah selama tiga hari, situasi yang saya hadapi menghasilkan kesalahan yang sama. Mengikuti semua saran yang bisa saya temukan, saya bermain dengan konfigurasi tetapi tidak berhasil.
Akhirnya saya menemukannya, bedanya, Layanan yang saya jalankan terkandung dalam tabung yang sama, masalahnya ternyata AspectJ tidak memperlakukan instantiasi Layanan yang sama. Akibatnya proksi hanya memanggil metode yang mendasarinya tanpa semua sihir Spring normal dieksekusi sebelum metode memanggil.
Pada akhirnya, anotasi @Scope yang ditempatkan pada layanan sesuai contoh menyelesaikan masalah:
Metode yang saya posting adalah metode delete tetapi penjelasannya mempengaruhi semua metode kegigihan dengan cara yang sama.
Saya harap pos ini membantu orang lain yang mengalami masalah yang sama saat memuat layanan dari toples
sumber
@Scope(proxyMode = ScopedProxyMode.INTERFACES)
ke kelas DAO yang mengimplementasikan antarmuka sangat penting. Saya menghabiskan sepanjang hari untuk mencari tahu kesalahan ini dan solusi Anda adalah satu-satunya yang berfungsi. Terima kasih banyak!Saya memiliki kesalahan yang sama karena saya beralih dari konfigurasi XML ke java.
Intinya, saya tidak melakukan migrasi
<tx:annotation-driven/>
tag, seperti yang disarankan oleh Stone Feng.Jadi saya baru saja menambahkan
@EnableTransactionManagement
seperti yang disarankan di sini Menyiapkan Anotasi Didorong Transaksi di Spring di @Configuration Class , dan berfungsi sekarangsumber
boardRepo.deleteByBoardId (id);
Menghadapi masalah yang sama. GOT javax.persistence.TransactionRequiredException: Tidak Ada Pengelola Entitas dengan transaksi aktual yang tersedia untuk utas saat ini
Saya mengatasinya dengan menambahkan penjelasan @Transaksional di atas controller / service.
sumber
Aku punya masalah yang sama dan saya menambahkan
tx:annotation-driven
dalamapplicationContext.xml
dan bekerja.sumber
Saya memiliki kesalahan yang sama ketika mengakses metode yang sudah transaksional-dijelaskan dari metode non-transaksional dalam komponen yang sama:
Saya memperbaiki kesalahan dengan memanggil executeQuery () pada komponen referensi-sendiri:
sumber
Menambahkan
org.springframework.transaction.annotation.Transactional
anotasi di tingkat kelas untuk kelas tes memperbaiki masalah bagi saya.sumber
Hanya catatan untuk pengguna lain yang mencari jawaban untuk kesalahan Anda. Masalah umum lainnya adalah:
(Ada cara dan cara menggunakan AspectJ tetapi refactoring akan jauh lebih mudah)
Jadi Anda akan membutuhkan kelas panggilan dan kelas yang memegang
@transactional
metode.sumber
Bagi kami, masalahnya datang ke pengaturan konteks yang sama di beberapa file konfigurasi. Periksa Anda tidak menduplikasi yang berikut dalam beberapa file konfigurasi.
sumber
Saya memiliki kode kesalahan yang sama ketika saya menggunakan
@Transaction
metode / actionlevel yang salah.Saya harus meletakkan
@Transactional
tepat di atas metodemethodWithANumberOfDatabaseActions()
, tentu saja.Itu memecahkan pesan kesalahan dalam kasus saya.
sumber
Saya menghapus mode dari
untuk membuat ini bekerja
sumber
Saya memiliki masalah ini selama berhari-hari dan tidak ada yang saya temukan di mana pun di internet yang membantu saya, saya memposting jawaban saya di sini jika itu membantu orang lain.
Dalam kasus saya, saya sedang mengerjakan layanan microser yang dipanggil melalui remoting, dan penjelasan @Transaksional saya di tingkat layanan tidak diambil oleh proxy jarak jauh.
Menambahkan kelas delegasi antara layanan dan lapisan dao dan menandai metode delegasi sebagai transaksional memperbaikinya untuk saya.
sumber
Ini membantu kami, mungkin itu bisa membantu orang lain di masa depan.
@Transaction
tidak bekerja untuk kita, tetapi ini berhasil:@ConditionalOnMissingClass("org.springframework.orm.jpa.JpaTransactionManager")
sumber
Jika Anda memiliki
dan kelas super
dan kamu menelepon
Anda tidak akan mendapatkan Spring TransactionInterceptor (yang memberi Anda transaksi).
Ini adalah hal yang perlu kamu lakukan:
Luar biasa tapi benar.
sumber