Jakarta ee 使用EntityManager和EntityManagerFactory将异常强制转换为实体对象

Jakarta ee 使用EntityManager和EntityManagerFactory将异常强制转换为实体对象,jakarta-ee,jpa,persistence,Jakarta Ee,Jpa,Persistence,我无法将@PersistenceContext与我创建的新bean一起使用,导致entity manager变量始终为null 所以我在网上搜索这个问题的解决方案,但没有结果。 相反,我尝试使用EntityManagerFactory,它可以完美地返回数据,但无法将数据传输到同一实体类型的新变量 我注意到的是,l.get(0)的内容除了正常的Products对象字段外,还有一些额外的字段,如_persistence\u listener、_persistence\u primaryKey等,然后

我无法将@PersistenceContext与我创建的新bean一起使用,导致entity manager变量始终为null

所以我在网上搜索这个问题的解决方案,但没有结果。 相反,我尝试使用EntityManagerFactory,它可以完美地返回数据,但无法将数据传输到同一实体类型的新变量

我注意到的是,l.get(0)的内容除了正常的Products对象字段外,还有一些额外的字段,如_persistence\u listener、_persistence\u primaryKey等,然后转换就不成功了

如何在不引发异常“com.jogogestao.entity.Product不能转换为com.jogogestao.entity.Product”的情况下再次将结果转换为Products对象

Tkx

守则:

public Product getProduct (int ProductId){
        private EntityManager em;
    private static EntityManagerFactory emf = javax.persistence.Persistence.createEntityManagerFactory("JogoGestao-ejbPU"); 
        Product p = null;

        em = emf.createEntityManager();
        Query querysql = em.createQuery("select p from Product p where p.idProduct=" + ProductId);
        List<Product> l = querysql.getResultList();
        p=l.get(0); //The error occurs here
}
错误:

Caused by: java.lang.ClassCastException: com.jogogestao.entity.Product cannot be cast to com.jogogestao.entity.Product
    at com.jogogestao.ejb.DataAccess.getProduct(DataAccess.java:57)
    at com.jogogestao.ejb.JogoGestaoSession.addProduct(JogoGestaoSession.java:67)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at org.glassfish.ejb.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1052)
    at org.glassfish.ejb.security.application.EJBSecurityManager.invoke(EJBSecurityManager.java:1124)
    at com.sun.ejb.containers.BaseContainer.invokeBeanMethod(BaseContainer.java:5366)
    at com.sun.ejb.EjbInvocation.invokeBeanMethod(EjbInvocation.java:619)
    at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:800)
    at com.sun.ejb.EjbInvocation.proceed(EjbInvocation.java:571)
    at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.doAround(SystemInterceptorProxy.java:162)
    at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.aroundInvoke(SystemInterceptorProxy.java:144)
    at sun.reflect.GeneratedMethodAccessor199.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.intercept(InterceptorManager.java:861)
    at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:800)
    at com.sun.ejb.containers.interceptors.InterceptorManager.intercept(InterceptorManager.java:370)
    at com.sun.ejb.containers.BaseContainer.__intercept(BaseContainer.java:5338)
    at com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:5326)
    at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:214)
    ... 47 more

不知何故,您遇到了类加载问题<代码>列表l=querysql.getResultList()此处产品是使用diffirent类加载器加载的,然后是您的代码。我认为问题在这里
private static EntityManagerFactory emf=javax.persistence.persistence.createEntityManagerFactory(“JogoGestao ejbPU”)

  • 尝试从代码中获取EntityManagerFactory(而不是静态初始化),并查看问题是否已解决

  • 检查如何定义持久性的使用,以及它们使用的是哪个类加载器。我认为问题在于加载
    javax.persistence.*
    类时使用了错误的类加载器


  • 如果方法
    getProduct
    位于
    servlet
    ManagedBean
    EJB
    中,则让容器通过注入来管理PersistenceContext的生命周期:

        @PersistenceContext private EntityManager em;
    
    如果在
    Persistence.xml
    和容器中正确定义了持久性单元,这就足够了


    为了了解企业bean的用法,请仔细阅读

    glassfish服务器上的项目发生了一些非常奇怪的事情,因此我用一个新名称重新构建了整个项目,相同的代码现在可以正常工作了……如图所示
        @PersistenceContext private EntityManager em;