Jakarta ee 使用EntityManager和EntityManagerFactory将异常强制转换为实体对象
我无法将@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 守则: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等,然后
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;