代码之家  ›  专栏  ›  技术社区  ›  DDD

tomEE jpa持久化单元

  •  0
  • DDD  · 技术社区  · 3 年前

    我正在尝试在9.0.0版本中启动一个TomEE服务器,并部署一个简单的网络应用程序。

    我使用Hibernate 6.2.2作为jpa和postgres的提供者

    当我部署.war时,它会给我以下错误(堆栈很长,我只是把严重的放在那里):

     SEVERE [http-nio-8080-exec-3] jdk.internal.reflect.NativeMethodAccessorImpl.invoke Error destroying child org.apache.catalina.LifecycleException: An invalid Lifecycle transition was attempted ([before_destroy]) for component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/servlet-jsp-jdbc-jpa]] in state [STARTING_PREP]
    ---------------------
    SEVERE [http-nio-8080-exec-3] org.apache.openejb.assembler.classic.Assembler.destroyApplication undeployException original cause java.lang.Exception: deployment not found: servlet-jsp-jdbc-jpa.Comp669096535
    -------------------------
    SEVERE [http-nio-8080-exec-3] org.apache.openejb.assembler.classic.Assembler.destroyApplication undeployException original cause java.lang.Exception: persistence-unit: pu 1912458056localhost: Name "openejb/PersistenceUnit/pu 1912458056localhost" not found. 
    .... 
    Caused by: javax.naming.NameNotFoundException: Name "openejb/PersistenceUnit/pu 1912458056localhost" not found.
    ---------------------------
    SEVERE [http-nio-8080-exec-3] org.apache.tomee.catalina.TomcatWebAppBuilder.startInternal Unable to deploy collapsed ear in war StandardEngine[Catalina].StandardHost[localhost].StandardContext[/servlet-jsp-jdbc-jpa] org.apache.openejb.OpenEJBException: Creating application failed: C:\apache-tomee-microprofile-9.0.0\webapps\servlet-jsp-jdbc-jpa: UUID 
    .......... 
    Caused by: java.lang.NoSuchFieldError: UUID
    ----------------------------
    SEVERE [http-nio-8080-exec-3] jdk.internal.reflect.NativeMethodAccessorImpl.invoke Error deploying web application archive [C:\apache-tomee-microprofile-9.0.0\webapps\servlet-jsp-jdbc-jpa.war] java.lang.IllegalStateException: Error starting child 
    ........ 
    Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/servlet-jsp-jdbc-jpa]] .............. 
    Caused by: org.apache.tomee.catalina.TomEERuntimeException: org.apache.openejb.OpenEJBException: Creating application failed: C:\apache-tomee-microprofile-9.0.0\webapps\servlet-jsp-jdbc-jpa: UUID 
    .........
     Caused by: org.apache.openejb.OpenEJBException: Creating application failed: C:\apache-tomee-microprofile-9.0.0\webapps\servlet-jsp-jdbc-jpa: UUID 
    .......... 
    Caused by: java.lang.NoSuchFieldError: UUID 
    .........
    

    结构为:

    • 网络应用程序

      • 元-英寸

        • 持久性.xml

        • 上下文.xml

      • 网络接口

        • 网页.xml

        类(我把所有编译的类放在那里)

        • 利卜

          • hibernate-core-6.2.2.最终.jar
      • 索引html

    persistence.xml:

    <?xml version="1.0" encoding="UTF-8"?>
    <persistence version="2.2"
                 xmlns="http://xmlns.jcp.org/xml/ns/persistence"
                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                 xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence
                                     http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
    
        <!-- NO JNDI -->
        <persistence-unit name="pu" transaction-type="RESOURCE_LOCAL">
            <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
            <properties>
                <property name="jakarta.persistence.jdbc.driver" value="org.postgresql.Driver"/>
                <property name="jakarta.persistence.jdbc.url" value="jdbc:postgresql://localhost/MVC?currentSchema=public&amp;ssl=false"/>
                <property name="jakarta.persistence.jdbc.user" value="******"/>
                <property name="jakarta.persistence.jdbc.password" value="********"/>
                <property name="hibernate.show_sql" value="true" />
            </properties>
        </persistence-unit>
    
    </persistence>
    

    上下文.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <Context path="/servlet-jsp-jdbc-jpa" >
    </Context>
    

    网页.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app>
        <display-name>servlet_jsp_jdbc_jpa</display-name>
    </web-app>
    

    这些是使用持久性单元的类

    package jpa;
    
    import jakarta.persistence.EntityManagerFactory;
    import jakarta.persistence.Persistence;
    import jakarta.persistence.PersistenceUnit;
    
    public class PersistenceManager {
    
        //@PersistenceUnit(unitName="JTA-pu")
        private static final EntityManagerFactory emf;
    
        static {
            emf = Persistence.createEntityManagerFactory("pu");
        }
    
        private PersistenceManager() {
        }
    
        public static EntityManagerFactory getEmf() {
            return emf;
        }
    }
    
    package filters;
    
    import jakarta.persistence.EntityManager;
    import jakarta.persistence.EntityManagerFactory;
    import jakarta.persistence.PersistenceContext;
    import jakarta.persistence.PersistenceUnit;
    import jakarta.servlet.*;
    import jakarta.servlet.annotation.WebFilter;
    import jakarta.servlet.http.HttpFilter;
    import jakarta.servlet.http.HttpServletRequest;
    import jakarta.servlet.http.HttpServletResponse;
    import jpa.PersistenceManager;
    
    import java.io.IOException;
    
    @WebFilter(value="/*")
    public class SessionBinderFilter extends HttpFilter {
    
        // @PersistenceUnit(unitName="JTA-pu")
        private EntityManagerFactory emf = PersistenceManager.getEmf();
    
        // @PersistenceContext(unitName="JTA-pu")
        private EntityManager em = emf.createEntityManager();
    
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
    
            if (!(request instanceof HttpServletRequest) || !(response instanceof HttpServletResponse)) {
                throw new ServletException("non-HTTP request or response");
            }
    
            request.setAttribute("EntityManager", em);
    
            filterChain.doFilter(request, response);
    
            if (em.isOpen()) {
                em.close();
            }
        }
    }
    

    我不能理解这个问题,因为我是jpa的新手,我搜索了很多,但没有找到任何东西。

    我也尝试过使用JTA和带有JNDI的RESOURCE_LOCAL,但都不起作用,问题是一样的。

    欢迎提供任何建议或信息

    0 回复  |  直到 3 年前
        1
  •  1
  •   rzo1    3 年前

    TomEE 9.0.0与雅加达EE 9.1兼容,后者包括JPA 3.0。

    Hibernate 6.2.x实现了JPA 3.1,其中包括 API changes such as introducing UUID generators

    这些规范更改不包括在TomeE9中使用的API阴影中。为了解决您的问题,您需要将Hibernate降级到它的6.1系列,该系列符合JPA3.0。