No EntityManager with a real transaction available for the current thread - cannot reliably handle a persist call
when I do a test with JUnit, the persist method works, and I see that my object is inserted, but when I call the method through my controller, it does not work
here is my project:
applicationContext.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:tx="http://www.springframework.org/schema/tx" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:util="http://www.springframework.org/schema/util" xmlns:task="http://www.springframework.org/schema/task" xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.2.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.2.xsd"> <context:component-scan base-package="com.app.sqli" /> <mvc:annotation-driven /> <bean id="entityManagerFactoryBean" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="packagesToScan" value="com.app.sqli.entities" /> <property name="jpaVendorAdapter"> <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" /> </property> <property name="jpaProperties"> <props> <prop key="hibernate.hbm2ddl.auto">validate</prop> <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop> </props> </property> </bean> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/sqli" /> <property name="username" value="root" /> <property name="password" value="" /> </bean> <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> <property name="entityManagerFactory" ref="entityManagerFactoryBean" /> </bean> <tx:annotation-driven /> </beans>
my model class:
package com.app.sqli.models; import javax.persistence.Entity; import javax.persistence.Id; @Entity public class Collaborateur { @Id private int id; private String nom; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getNom() { return nom; } public void setNom(String nom) { this.nom = nom; } }
my class is DAO
package com.app.sqli.dao; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import org.springframework.stereotype.Repository; import com.app.sqli.models.Collaborateur; @Repository public class CollaborateurDao implements IcollaborateurDao{ @PersistenceContext private EntityManager em; @Override public void addCollaborateur(Collaborateur c) { em.persist(c); } }
My class of service
package com.app.sqli.services; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.app.sqli.dao.IcollaborateurDao; import com.app.sqli.models.Collaborateur; @Service @Transactional public class CollaborateurService implements IcollaborateurService{ @Autowired private IcollaborateurDao cdao; @Override public void addCollaborateur(Collaborateur c) { cdao.addCollaborateur(c); } }
And my controller
package com.app.sqli.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import com.app.sqli.models.Collaborateur; import com.app.sqli.services.IcollaborateurService; @org.springframework.stereotype.Controller public class Controller { @Autowired private IcollaborateurService cserv; @RequestMapping(value = "/index") public String index(Model m) { System.out.println("insertion ..."); Collaborateur c = new Collaborateur(); c.setId(11); c.setNom("nom"); cserv.addCollaborateur(c); return "index"; } }
source share