Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ClassCastException:JPA->;Bean值(不同的类加载器)_Jpa_Eclipselink_Classcastexception - Fatal编程技术网

ClassCastException:JPA->;Bean值(不同的类加载器)

ClassCastException:JPA->;Bean值(不同的类加载器),jpa,eclipselink,classcastexception,Jpa,Eclipselink,Classcastexception,将JPA中的对象分配给ManagedBean的属性时,我得到一个ClassCastException: Object r = query.getSingleResult(); // javax.persistence.Query ClassLoader c1 = this.getClass().getClassLoader(); ClassLoader c2 = r.getClass().getClassLoader(); user = (User) r; // blubb.model.User

将JPA中的对象分配给ManagedBean的属性时,我得到一个ClassCastException:

Object r = query.getSingleResult(); // javax.persistence.Query
ClassLoader c1 = this.getClass().getClassLoader();
ClassLoader c2 = r.getClass().getClassLoader();
user = (User) r; // blubb.model.User
问题在于c1(ManagedBean)和c2(EclipseLink)是不同的类装入器:

c1:WebappClassLoader(delegate=true;repositories=WEB-INF/classes/)
c2:WebappClassLoader(委托=true)


如何修复此问题?

您的环境是什么?您在使用JavaEE、Spring和OSGi吗?WLS是哪台服务器,GF

你重新部署了你的应用程序吗?持久化单元是托管的还是非托管的


可能是您重新部署了应用程序,但从未关闭EntityManagerFactory,因此它仍然与旧类一起部署。

我也遇到了同样的问题。Glassfish 4.1.1中包含EclipseLink 2.5.2 JPA的简单JSF项目


通过正确关闭
EntityManager工厂
解决。我建议使用
ServletContextListener
@WebListener
)(查看或)。

为什么这些类加载了两个不同的类加载程序?我也这样问自己。我没有指定任何关于类加载器的内容。尽管如此,您确定对象r的类型是User,对吗?我的意思是,如果您打印ln r.getClass(),它是一个用户,对吗?是的,相同的类,不同的类加载器-这就是强制转换失败的原因。您是否尝试过将
query.getSingleResult()
包装到使用泛型并直接赋值的方法中?好。。。您可能会得到相同的运行时异常。但是它有利于抽象和减少耦合。JSF与GlassFish上的EclipseLink和PrimeFaces。你说得对,我只是在重新部署后有时会出错。