Java – spring boot: persistence cannot be used
I've entered this stage, and - although I'm learning a lot - I'm starting to despair
I've tried all the suggestions on this good question:
No Persistence provider for EntityManager named
I have a job using the ubiquitous hibernateutil class, but was told to move to a simple JPA style here:
Spring RESTful controller method improvement suggestions
Unfortunately, I can't make bean injection work in spring boot This is my attempt:
Spring JPA (Hibernate) No qualifying bean of type: javax. persistence. EntityManagerFactory
After so much work, I finally found a zero entity manager I found this and began to think it wouldn't work:
Using JPA2 in Tomcat 6: @PersitenceContext doesn’t work,EntityManager is null
In my opinion, an entitymanagerfactory should definitely be a bean, regardless of any environment created by spring boot, but... Anyway I think this will at least work:
Application startup:
@Configuration @ComponentScan @EnableAutoConfiguration public class Application { public static void main(String[] args) { SpringApplication.run(Application.class,args); } }
controller:
@Controller public class GetController { private static final String PERSISTENCE_UNIT_NAME = "cpJpaPu"; @RequestMapping(value = "/user",method = RequestMethod.GET) public @ResponseBody User getUser(@RequestParam(value="id",required=true) int id) { User user = null; EntityManagerFactory emf = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME); EntityManager em = emf.createEntityManager(); UserDAO userDao = new UserDAO(); userDao.setEntityManager(em); user = userDao.load(id); return user; } }
DAO:
public class UserDAO { public EntityManager entityManager; public void setEntityManager(EntityManager entityManager) { this.entityManager = entityManager; } public EntityManager getEntityManager() { return entityManager; } public void insert(User user) { entityManager.persist(user); } public User load(int id) { return entityManager.find(User.class,id); } }
/src/main/resources/persistence. xml:
<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0"> <persistence-unit name="cpJpaPu" transaction-type="RESOURCE_LOCAL"> <provider>org.hibernate.ejb.HibernatePersistence</provider> <class>com.mydomain.User</class> <properties> <property name="hibernate.dialect" value="org.hibernate.dialect.PostgresqlDialect"/> <property name="hibernate.connection.driver_class" value="org.postgresql.Driver"/> <property name="hibernate.show_sql" value="false"/> <property name="hibernate.connection.username" value="user"/> <property name="hibernate.connection.password" value=""/> <property name="hibernate.connection.url" value="jdbc:postgresql://localhost:5432/mydb"/> </properties> </persistence-unit> </persistence>
It does not work:
javax.persistence.PersistenceException: No Persistence provider for EntityManager named cpJpaPu javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:61) javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:39) com.mydomain.GetController.getUser(GetController.java:25) sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) sun.reflect.NativeMethodAccessorImpl.invoke(UnkNown Source) sun.reflect.DelegatingMethodAccessorImpl.invoke(UnkNown Source) java.lang.reflect.Method.invoke(UnkNown Source) org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:214) org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132) org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104) org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:748) org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:689) org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:83) org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:947) org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:878) org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:946) org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:837) javax.servlet.http.HttpServlet.service(HttpServlet.java:621) org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:822) javax.servlet.http.HttpServlet.service(HttpServlet.java:728) org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77) org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:108)
- add information -
POM:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.mygroup</groupId> <artifactId>myartifact</artifactId> <version>0.1.0</version> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>0.5.0.M6</version> </parent> <dependencies> <!-- Spring framework --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- Hibernate --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>4.3.0.Final</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-entitymanager</artifactId> <!-- Must override version or face stack traces --> <version>4.3.0.Final</version> </dependency> <!-- Spring ORM,works with Hibernate --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> </dependency> <!-- Spring implementation of Jackson for RESTful JSON --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </dependency> <!-- JDBC --> <dependency> <groupId>postgresql</groupId> <artifactId>postgresql</artifactId> <version>9.1-901.jdbc4</version> </dependency> <!-- Logging --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </dependency> <!-- Prevent logging conflicts --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> <scope>compile</scope> <exclusions> <exclusion> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> </exclusion> </exclusions> </dependency> </dependencies> <properties> <start-class>com.cloudfordev.controlpanel.Application</start-class> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.7</source> <target>1.7</target> </configuration> </plugin> </plugins> </build> <repositories> <repository> <id>spring-snapshots</id> <url>http://repo.spring.io/libs-snapshot</url> <snapshots><enabled>true</enabled></snapshots> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>spring-snapshots</id> <url>http://repo.spring.io/libs-snapshot</url> <snapshots><enabled>true</enabled></snapshots> </pluginRepository> </pluginRepositories> </project>
Solution
JPA has some functions and can only work in XML configuration. Unfortunately, I can't see your content I don't think persistence XML is loaded by default, so this may be the problem So why not use processes and Java and application Properties configure entity manager? JPA sample from spring boot has everything you need to get started It uses spring data JPA, and your code only uses JPA API, but you can easily remove the spring data dependency in the example to this level
The recent spring boot snapshot has a feature that allows you to create your own localentitymanagerfactorybean so that you can add custom XML configurations, but you can manually execute all JPA configurations at most if you need to customize the entitymanager
Note: you don't really use dependency injection in the controller – why not inject userdao?