Ich erhalte diese Fehlermeldung, wenn ich versuche, die Methode "persist" aufzurufen, um das Entitätsmodell in meiner Spring MVC-Webanwendung in der Datenbank zu speichern. Ich kann im Internet keinen Beitrag oder keine Seite finden, die sich auf diesen bestimmten Fehler beziehen können. Es scheint, als ob etwas mit der EntityManagerFactory-Bean nicht stimmt, aber ich bin ziemlich neu in der Spring-Programmierung. Für mich scheint alles gut initialisiert zu sein und entspricht verschiedenen Tutorial-Artikeln im 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
quelle
quelle
@Transaction
.Antworten:
Ich hatte das gleiche Problem und habe die Methode wie kommentiert
@Transactional
und es hat funktioniert.UPDATE: Wenn Sie die Spring-Dokumentation überprüfen, sieht es so aus, als ob der PersistenceContext standardmäßig vom Typ Transaction ist. Deshalb muss die Methode transaktional sein ( http://docs.spring.io/spring/docs/current/spring-framework-reference/). html / orm.html ):
quelle
@Transactional
Annotation eine Methode mit der@Transactional
Annotation in derselben Klassendatei aufruft, werden Sie ebenfalls von diesem Fehler betroffen sein (das war es, was mir bevorstand).@Transactional
, das funktioniert auch. IchIch habe diese Ausnahme beim Versuch, eine benutzerdefinierte Methode deleteBy im Spring-Datenrepository zu verwenden. Die Operation wurde aus einer JUnit-Testklasse versucht.
Die Ausnahme tritt nicht auf, wenn die
@Transactional
Annotation auf JUnit-Klassenebene verwendet wird.quelle
@Transactional
Auf Klassenebene können mögliche Testprobleme maskiert werden, die unterschiedliche Transaktionen in Ihren Diensten manipulieren.@Trasactional
die Repository-Methode verwendet, da sie der Ort ist, an dem ich tatsächlich mit der Datenbank interagiere, und sie funktioniert einwandfrei.Dieser Fehler hatte mich drei Tage lang gefesselt, die Situation, mit der ich konfrontiert war, führte zu demselben Fehler. Nach allen Ratschlägen, die ich finden konnte, spielte ich mit der Konfiguration, aber ohne Erfolg.
Schließlich fand ich es, der Unterschied, dass der Dienst, den ich ausführte, in einem gemeinsamen Glas enthalten war. Es stellte sich heraus, dass AspectJ die Service-Instanziierung nicht gleich behandelte. Tatsächlich rief der Proxy einfach die zugrunde liegende Methode auf, ohne dass die gesamte normale Spring-Magie vor dem Methodenaufruf ausgeführt wurde.
Am Ende löste die @ Service-Annotation, die gemäß dem Beispiel auf dem Dienst platziert wurde, das Problem:
Die von mir veröffentlichte Methode ist eine Löschmethode, aber die Anmerkungen wirken sich auf alle Persistenzmethoden auf dieselbe Weise aus.
Ich hoffe, dieser Beitrag hilft jemand anderem, der mit dem gleichen Problem zu kämpfen hat, wenn er einen Dienst aus einem Glas lädt
quelle
@Scope(proxyMode = ScopedProxyMode.INTERFACES)
zur DAO-Klasse, die eine Schnittstelle implementiert, ist wirklich wichtig. Ich habe den ganzen Tag damit verbracht, diesen Fehler herauszufinden, und Ihre Lösung ist die einzige, die funktioniert. Vielen Dank!Ich hatte den gleichen Fehler, weil ich von XML- zu Java-Konfiguration gewechselt habe.
Der Punkt war, ich habe kein
<tx:annotation-driven/>
Tag migriert, wie Stone Feng vorschlug.Also habe ich gerade hinzugefügt,
@EnableTransactionManagement
wie hier vorgeschlagen. Einrichten von annotationsgesteuerten Transaktionen im Frühjahr in der @ Configuration-Klasse , und es funktioniert jetztquelle
boardRepo.deleteByBoardId (id);
Konnte das gleiche Problem. GOT javax.persistence.TransactionRequiredException: Kein EntityManager mit tatsächlicher Transaktion für aktuellen Thread verfügbar
Ich habe es behoben, indem ich @Transactional Annotation über dem Controller / Service hinzugefügt habe .
quelle
Ich hatte das gleiche Problem und ich fügte
tx:annotation-driven
inapplicationContext.xml
und es funktionierte.quelle
Ich hatte den gleichen Fehler beim Zugriff auf eine bereits mit Transaktionen versehene Methode von einer nicht-transaktionsbezogenen Methode innerhalb derselben Komponente:
Ich habe den Fehler behoben, indem ich executeQuery () für die selbstreferenzierte Komponente aufgerufen habe:
quelle
Das Hinzufügen der
org.springframework.transaction.annotation.Transactional
Anmerkung auf Klassenebene für die Testklasse hat das Problem für mich behoben.quelle
Nur eine Notiz für andere Benutzer, die nach Antworten auf diesen Fehler suchen. Ein weiteres häufiges Problem ist:
(Es gibt Mittel und Wege, AspectJ zu verwenden, aber das Refactoring wird viel einfacher sein.)
Sie benötigen also eine aufrufende Klasse und eine Klasse, die die
@transactional
Methoden enthält.quelle
Für uns war das Problem auf dieselben Kontexteinstellungen in mehreren Konfigurationsdateien zurückzuführen. Stellen Sie sicher, dass Sie Folgendes nicht in mehreren Konfigurationsdateien dupliziert haben.
quelle
Ich hatte den gleichen Fehlercode, als ich
@Transaction
auf einer falschen Methode / Aktionsebene verwendet habe.Ich musste das natürlich
@Transactional
direkt über der Methode platzierenmethodWithANumberOfDatabaseActions()
.Das hat die Fehlermeldung in meinem Fall gelöst.
quelle
Ich habe den Modus aus entfernt
um diese Arbeit zu machen
quelle
Ich hatte dieses Problem seit Tagen und nichts, was ich irgendwo online gefunden habe, hat mir geholfen. Ich poste meine Antwort hier, falls es jemand anderem hilft.
In meinem Fall arbeitete ich an einem Microservice, der über Remoting aufgerufen wurde, und meine @ Transactional-Annotation auf Serviceebene wurde vom Remote-Proxy nicht erfasst.
Das Hinzufügen einer Delegatenklasse zwischen der Service- und der Dao-Ebene und das Markieren der Delegatenmethode als Transaktionsmethode haben dies für mich behoben.
quelle
Das hat uns geholfen, vielleicht kann es in Zukunft anderen helfen.
@Transaction
arbeitete nicht für uns, aber das tat:@ConditionalOnMissingClass("org.springframework.orm.jpa.JpaTransactionManager")
quelle
Wenn Sie haben
und superklasse
und du rufst an
Sie erhalten keinen Spring TransactionInterceptor (der Ihnen eine Transaktion gibt).
Folgendes müssen Sie tun:
Unglaublich aber wahr.
quelle