我已经进入了这个阶段,而且 – 虽然我正在学习很多 – 开始绝望.
我已经尝试了关于这个很好的问题的所有建议:
No Persistence provider for EntityManager named
我有一个使用无处不在的HibernateUtil类的工作,但被告知要移动到一个简单的JPA风格在这里:
Spring RESTful controller method improvement suggestions
不幸的是,我不能让bean注入在spring-boot中正常工作.这是我的尝试:
Spring JPA (Hibernate) No qualifying bean of type: javax.persistence.EntityManagerFactory
经过这么多工作后,我终于找到了一个零实体经理.我发现这一点,开始认为它不行:
Using JPA2 in Tomcat 6: @PersitenceContext doesn’t work,EntityManager is null
在我看来,像EntityManagerFactory绝对应该是一个bean,无论是spring-boot创建的任何环境,但是…无论如何.我会认为这至少会有效:
应用启动:
- @Configuration
- @ComponentScan
- @EnableAutoConfiguration
- public class Application {
- public static void main(String[] args) {
- SpringApplication.run(Application.class,args);
- }
- }
控制器:
- @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>
它不工作:
- 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)
—添加信息—
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>
解决方法
JPA有一些功能,只能在XML配置中工作不幸,但是我看不到你的内容.我不认为persistence.xml是默认加载的,所以可能是这个问题.那么为什么不用流程和使用Java和application.properties配置实体管理器?
JPA sample from Spring Boot拥有开始使用所需的一切.它使用Spring数据JPA,而您的代码仅使用JPA API,但您可以通过删除示例中的Spring数据依赖关系轻松地将其删除到该级别.
最近的Spring Boot快照有一个功能,可以让您创建自己的LocalEntityManagerfactorybean,以便您可以添加自定义XML配置,但是最多可以在需要自定义EntityManager的情况下手动执行所有JPA配置.
注:您在控制器中没有真正使用依赖注入 – 为什么不注入UserDao?