我已经进入了这个阶段,而且 – 虽然我正在学习很多 – 开始绝望.
我已经尝试了关于这个很好的问题的所有建议:
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?