java - jpa 和 struts 项目中持久性提供程序的问题

标签 java eclipse jpa struts jpa-2.2

我正在开发一个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

enter image description here

src/test/testing.java

enter image description here

src/META-INF/persistence.xml

enter image description here

src/struts.xml

enter image description here

WebContent/WEB-INF/web.xml

enter image description here

WebContent/index.xml

enter image description here

项目

查看:

enter image description here

库:

enter image description here

感谢您的帮助:)

最佳答案

主要问题

屏幕截图Lib我们可以看到您有一个非常“混合”的库组合。问题就出在这里!您不能混合使用不同 API 级别的 JPA。您将非常旧/早期的版本 1.x 与 JPA 2.2 的最新变体混合在一起。 .

persistence-api-1.0.2.jarjavax.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/

相关文章:

java - 安卓Java : How do I update an object inside a method?

java - 在 Jenkins 插件中使用 Maven 进行 JUnit 测试

java - Hibernate - 实体审计

java - 在 Spring MVC 中自动生成 id

java - 如何更改TomEE上@WebService生成的 'webservices'路径

java - 使用 Endless RecyclerView 作为日历

java - 如何在Android中使用DialogFragment进行文本输入?

java - Optaplanner - benchmarkConfigResource 不作为类路径资源存在于类加载器中

Android - <include layout=.../> 返回错误

java - Hibernate 抛出 MultipleBagFetchException - 不能同时获取多个包