Hibernate EntityManagerFactoryWrapper无法强制转换为SessionFactoryImplementor

Hibernate EntityManagerFactoryWrapper无法强制转换为SessionFactoryImplementor,hibernate,multi-tenant,jpa-2.1,Hibernate,Multi Tenant,Jpa 2.1,我正在努力学习JavaEE7上的jpa多租户。我遵循这个教程 https://developers.redhat.com/blog/2020/06/15/jakarta-ee-multitenancy-with-jpa-on-wildfly-part-1/ 但我得到了以下错误: at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:545) at java.lang.T

我正在努力学习JavaEE7上的jpa多租户。我遵循这个教程

https://developers.redhat.com/blog/2020/06/15/jakarta-ee-multitenancy-with-jpa-on-wildfly-part-1/
但我得到了以下错误:

at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:545)
at java.lang.Thread.run(Thread.java:748)
Caused by: javax.ejb.TransactionRolledbackLocalException: Exception thrown from bean
at com.sun.ejb.containers.EJBContainerTransactionManager.checkExceptionClientTx(EJBContainerTransactionManager.java:662)
at com.sun.ejb.containers.EJBContainerTransactionManager.postInvokeTx(EJBContainerTransactionManager.java:507)
at com.sun.ejb.containers.BaseContainer.postInvokeTx(BaseContainer.java:4566)
at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:2074)
... 125 more
Caused by: java.lang.ClassCastException: com.sun.enterprise.container.common.impl.EntityManagerFactoryWrapper cannot be cast to org.hibernate.jpa.internal.EntityManagerFactoryImpl
at net.rhuanrocha.dao.Dao.getEntityManager(Dao.java:21)
at net.rhuanrocha.dao.JobDao.findAll(JobDao.java:13)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
内部Dao.java->getEntityManager()

我的Maven依赖项如下所示:

  • 提供javax javaee web api 7.0
  • org.hibernate hibernate entitymanager 5.0.7.Final jar
  • 我使用GlassFish4.1作为服务器和JDK8。 进口货物如下:

  • 导入org.hibernate.engine.spi.SessionFactoryImplementor
  • 导入org.hibernate.jpa.internal.EntityManagerFactoryImpl
  • 导入javax.persistence.EntityManagerFactory
  • 导入javax.persistence.PersistenceUnit
  • 导入javax.persistence.EntityManager
    这很有效。我使用的后端是Jakarta EE 8、Hibernate 5.4和Payara 2021。我认为你的版本也应该有效

    import com.dao.multitenancy.MultitenancyResolver;
    import javax.persistence.EntityManager;
    import javax.persistence.EntityManagerFactory;
    import javax.persistence.PersistenceUnit;
    //import org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl;
    import org.hibernate.engine.spi.SessionFactoryImplementor;
    
    /**
     *
     * @author Peter
     */
    public abstract class Dao {
    
        @PersistenceUnit
        private EntityManagerFactory emf;
    
        public EntityManager getEM(final String tenantId) {
    
            //EntityManagerFactory entityManagerFactory = entityManagerFactory();
           final SessionFactoryImplementor sf = emf.unwrap(SessionFactoryImplementor.class);
              
            final MultitenancyResolver tenantResolver = (MultitenancyResolver) sf.getCurrentTenantIdentifierResolver();
            tenantResolver.setTenantIdentifier(tenantId);
    
            return emf.createEntityManager();
        }
    
    }
    
    参考: