繁体   English   中英

jakarta.persistence.PersistenceException:尝试创建 EntityManagerFactory 时,没有 EntityManager 的持久性提供程序命名错误

[英]jakarta.persistence.PersistenceException: No Persistence provider for EntityManager named error when trying to createEntityManagerFactory

我正在尝试使用 eclipse 动态 Web 项目设置后端,并且此后端将使用 Hibernate ORM 访问 MariaDB。创建实体管理器工厂时遇到问题。 这是我的项目的结构:项目结构

这是我包含的图书馆列表:图书馆 1图书馆 2

这是我的 web.xml 的内容:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="https://jakarta.ee/xml/ns/jakartaee" xmlns:web="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd http://xmlns.jcp.org/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="5.0">
  <display-name>trakteur-backend2</display-name>
    <servlet>
    <servlet-name>Jersey Web app</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer
        </servlet-class>
    <init-param>
      <param-name>jersey.config.server.provider.packages</param-name>
      <param-value>service</param-value>
    </init-param>
    <init-param>
      <param-name>jersey.config.server.provider.scanning.recursive</param-name>
      <param-value>true</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  
    <servlet-mapping>
    <servlet-name>Jersey Web app</servlet-name>
    <url-pattern>/*</url-pattern>
  </servlet-mapping>

</web-app>

下面是我坚持xml的内容:

<?xml version="1.0" encoding="UTF-8"?>

<persistence version="2.2"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence
http://xmlns.jcp.org/xml/ns/persistence/persistence_2_2.xsd">
    <persistence-unit name="persistUnit">
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
        <class> entities.TrakteurFilm </class>
        <class> entities.TrakteurUser </class>
        <class> entities.TrakteurComment </class>
        <properties>
            <property name="javax.persistence.jdbc.driver"
                value="com.mysql.jdbc.Driver" />
            <property name="javax.persistence.jdbc.url"
                value="jdbc:mysql://localhost:3306/trakteur?serverTimezone=UTC" />
            <property name="javax.persistence.jdbc.user"
                value="user" />
            <property name="javax.persistence.jdbc.password"
                value="password" />
            <property name="hibernate.id.new_generator_mappings"
                value="false" />
        </properties>
    </persistence-unit>
</persistence>

我的 DAO class 现在只是以下内容:

package jpaDAO;

import java.util.List;

import entities.*;
import jakarta.persistence.*;

public class DAO{
    private EntityManagerFactory emf;
    
    public DAO()
    {
        emf = Persistence.createEntityManagerFactory("persistUnit");
    }
    
    public EntityManager getEntityManager()
    {
        return emf.createEntityManager();
    }
}

在我的 Tomcat 10 服务器上执行项目时出现的错误如下:

jakarta.persistence.PersistenceException: No Persistence provider for EntityManager named persistUnit
    jakarta.persistence.Persistence.createEntityManagerFactory(Persistence.java:86)
    jakarta.persistence.Persistence.createEntityManagerFactory(Persistence.java:55)
    jpaDAO.DAO.<init>(DAO.java:13)
    service.ServiceTrakteur.<clinit>(ServiceTrakteur.java:14)
    java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77)
    java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
    java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480)
    org.glassfish.hk2.utilities.reflection.ReflectionHelper.makeMe(ReflectionHelper.java:1356)
    org.jvnet.hk2.internal.ClazzCreator.createMe(ClazzCreator.java:248)
    org.jvnet.hk2.internal.ClazzCreator.create(ClazzCreator.java:342)
    org.jvnet.hk2.internal.SystemDescriptor.create(SystemDescriptor.java:466)
    org.glassfish.jersey.inject.hk2.RequestContext.findOrCreate(RequestContext.java:59)
    org.jvnet.hk2.internal.Utilities.createService(Utilities.java:2103)
    org.jvnet.hk2.internal.ServiceLocatorImpl.internalGetService(ServiceLocatorImpl.java:769)
    org.jvnet.hk2.internal.ServiceLocatorImpl.internalGetService(ServiceLocatorImpl.java:732)
    org.jvnet.hk2.internal.ServiceLocatorImpl.getService(ServiceLocatorImpl.java:702)
    org.glassfish.jersey.inject.hk2.AbstractHk2InjectionManager.getInstance(AbstractHk2InjectionManager.java:160)
    org.glassfish.jersey.inject.hk2.ImmediateHk2InjectionManager.getInstance(ImmediateHk2InjectionManager.java:30)
    org.glassfish.jersey.internal.inject.Injections.getOrCreate(Injections.java:105)
    org.glassfish.jersey.server.model.MethodHandler$ClassBasedMethodHandler.getInstance(MethodHandler.java:260)
    org.glassfish.jersey.server.internal.routing.PushMethodHandlerRouter.apply(PushMethodHandlerRouter.java:51)
    org.glassfish.jersey.server.internal.routing.RoutingStage._apply(RoutingStage.java:86)
    org.glassfish.jersey.server.internal.routing.RoutingStage._apply(RoutingStage.java:89)
    org.glassfish.jersey.server.internal.routing.RoutingStage._apply(RoutingStage.java:89)
    org.glassfish.jersey.server.internal.routing.RoutingStage._apply(RoutingStage.java:89)
    org.glassfish.jersey.server.internal.routing.RoutingStage._apply(RoutingStage.java:89)
    org.glassfish.jersey.server.internal.routing.RoutingStage.apply(RoutingStage.java:69)
    org.glassfish.jersey.server.internal.routing.RoutingStage.apply(RoutingStage.java:38)
    org.glassfish.jersey.process.internal.Stages.process(Stages.java:173)
    org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.java:247)
    org.glassfish.jersey.internal.Errors$1.call(Errors.java:248)
    org.glassfish.jersey.internal.Errors$1.call(Errors.java:244)
    org.glassfish.jersey.internal.Errors.process(Errors.java:292)
    org.glassfish.jersey.internal.Errors.process(Errors.java:274)
    org.glassfish.jersey.internal.Errors.process(Errors.java:244)
    org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:265)
    org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:234)
    org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:684)
    org.glassfish.jersey.servlet.WebComponent.serviceImpl(WebComponent.java:394)
    org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:346)
    org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:358)
    org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:311)
    org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:205)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)

无论我的 DAO 中有什么方法,或者无论我从服务 package 发出什么 REST 请求,我都会收到此错误。

我确定它来自emf = Persistence.createEntityManagerFactory("persistUnit");在我的 DAO 中,因为如果我删除这一行,我的所有方法(显然不需要使用数据库)都可以工作。 有了这条线,它们都不起作用。

我找不到我的设置失败的地方。 我在这个问题上进行了很多搜索,但没有找到与我的情况相对应的案例。 显然,似乎找不到 persistence.xml 或持久性单元,但它在这里并且没有错误。 我的 object 类(TrakteurComment、TrakteurUser 和 TrakteurFilm)没有任何错误。

你知道它可能是什么吗? 在此先感谢您的帮助或任何答案。 祝你有美好的一天

这可能是因为在您的 persistence.xml 中,您指定的是版本 2.2(这是一个旧的 javax 版本),而 Jakarta 是 3.x。 我假设这是 Hibernate 6. 请参阅此处: https://itnext.io/whats-new-in-jakarta-persistence-3-1-by-examples-81b292e8b3a4

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM