我正在开发一个java ee应用程序,使用jpa来控制mysql db和struts。 不幸的是,当我在 tomcat 服务器上运行该项目时,出现此错误。
javax.persistence.PersistenceException: No Persistence provider for EntityManager named prova javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:56) javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:34) test.testing.initEntityManager(testing.java:37) test.testing.add(testing.java:16) 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) com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:440) com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:279) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:242) com.googlecode.s2hibernate.struts2.plugin.s2hibernatevalidator.interceptor.HibernateValidatorInterceptor.intercept(HibernateValidatorInterceptor.java:38) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:163) com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:122) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:195) com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:148) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:93) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:235) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:89) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:128) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) org.apache.struts2.interceptor.ProfilingActivationInterceptor.intercept(ProfilingActivationInterceptor.java:104) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:267) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:126) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:148) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:138) com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:128) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:176) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:52) org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:468) org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77) org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:76)
我已经在网上搜索了解决方案,但没有解决我的问题。 以下是文件:
src/test/Libro.java
src/test/testing.java
src/META-INF/persistence.xml
src/struts.xml
WebContent/WEB-INF/web.xml
WebContent/index.xml
项目
查看:
库:
感谢您的帮助:)
最佳答案
主要问题
从屏幕截图Lib我们可以看到您有一个非常“混合”的库组合。问题就出在这里!您不能混合使用不同 API 级别的 JPA。您将非常旧/早期的版本 1.x 与 JPA 2.2 的最新变体混合在一起。 .
将 persistence-api-1.0.2.jar
和 javax.persistence-api-2.2.jar
放入 lib 目录中在项目的 WEB-INF
中。这会导致运行时发生冲突。
因此:
- 从文件夹中删除过时的
persistence-api-1.0.2.jar
并检查是否可以解决观察到的异常。如果发生其他异常,则运行时与您的设置会出现更多不一致。
其他评论和更改
您在 createPlaces()
方法中的类 testing
中错误地使用了事务处理的概念。您的代码是:
em.persist();
em.getTransaction().begin();
em.getTransaction().commit();
这会将 persist()
调用置于您在该行之后打开的受控事务之外。您应该更好地重新表述这些行,如下所示,而不是像上面那样坚持下去。该代码片段将 persist
操作移至事务边界内:
EntityTransaction tx = null;
try {
tx = em.getTransaction();
tx.begin();
// Only within a tx to prevent inconsistent states in the DB if sth fails here!
em.persist();
tx.commit();
} catch(RuntimeException) {
if(if(tx != null && tx.isActive()) {
tx.rollback();
}
}
有关更多详细信息,请查看另一个 answer on transaction handling我曾经写过。它引用了 JPA 2.2,并让您进一步深入了解该主题。
希望有帮助。
关于java - jpa 和 struts 项目中持久性提供程序的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54026543/