当前位置: 首页 > 面试题库 >

头脑风暴:奇怪的JPA问题,可能是类路径或jar版本控制问题?

麹高义
2023-03-14
问题内容

我看到一个奇怪的错误消息,并且正在寻找一些有关问题可能出在哪里的想法。我是使用JPA的新手。

我有一个应用程序,在其中使用Spring的实体管理器工厂(LocalContainerEntityManagerFactoryBean),EclipseLink作为我的ORM提供程序,并连接到MySQL数据库并由Maven构建。我不确定这是否重要.....

当我将此应用程序部署到Glassfish时,该应用程序将按预期工作。

问题是,我创建了一组独立的单元测试,以在无法正常运行的Glassfish之外运行。我收到以下错误( 我已经稍微编辑了类名

com.xyz.abc.services.persistence.entity.MyEntity cannot be cast to com.xyz.abc.services.persistence.entity.MyEntity

对象不能转换为相同类型的类吗?怎么可能?

这是错误的代码片段

Query q = entityManager.createNamedQuery("MyEntity.findAll");
List entityObjects = q.getResultList();
for (Object entityObject: entityObjects) {
   com.xyz.abc.services.persistence.entity.MyEntity entity = (com.xyz.abc.services.persistence.entity.MyEntity) entityObject;

以前,我有这段代码会产生相同的错误:

CriteriaQuery cq = entityManager.getCriteriaBuilder().createQuery();
cq.select(cq.from(com.xyz.abc.services.persistence.entity.MyEntity.class));
List entityObjects = entityManager.createQuery(cq).getResultList();
for (Object entityObject: entityObjects) {
   com.xyz.abc.services.persistence.entity.MyEntity entity = (com.xyz.abc.services.persistence.entity.MyEntity) entityObject;

此代码的问题与我已部署到服务器的问题相同。

如果有帮助,这是最里面的例外

Caused by: java.lang.ClassCastException: com.xyz.abc.services.persistence.entity.MyEntity cannot be cast to com.xyz.abc.services.persistence.entity.MyEntity
    at com.xyz.abc.services.persistence.entity.factory.MyEntityFactory.createBeans(MyEntityFactory.java:47)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:115)
    ... 37 more

我猜我在Glassfish中使用的某个罐子与我在测试中使用的罐子不同。我已经查看了所有列为“提供”的罐子,并且可以肯定它们与Glassfish的罐子相同。

让我知道您是否曾经看过这个奇怪的问题,或者有任何纠正建议。


问题答案:

这也可能是类加载问题。由两个不同的类加载器加载的相同的类定义被JVM视为不同的类。

您可以尝试这样做以获得有关游戏中类加载器的信息:

Query q = entityManager.createNamedQuery("MyEntity.findAll");
List entityObjects = q.getResultList();

ClassLoader loader1 = 
    com.xyz.abc.services.persistence.entity.MyEntity.getClass().getClassLoader();
System.out.println("MyEntity's class loader is " + loader1);
for (Object entityObject: entityObjects) {
  ClassLoader loader2 = entityObject.getClass().getClassLoader();
  System.out.println("Class loader of entity " + entityObject + " is " + loader2);
}

System.out.println当然,可以使用对首选日志记录框架的调用来代替。

这是一系列有关类加载的详细信息。



 类似资料:
  • 我在firebase云功能中遇到了一个情况,其中只有第一个控制台。执行日志或firestore更新语句。 我还有其他类似的函数,在处理响应的方式上略有不同,但这没有任何问题 我已经检查了谷歌云控制台/Firebase控制台等,源代码似乎已经正确上传 我看到了另一个与这种情况相反的帖子。有人知道为什么会这样吗?

  • 我开始学习java,在使用java之后遇到了这样一个问题。当我使用java时,这个代码会弹出。我在网上搜索,发现了许多类似的问题,但最终都没有任何帮助,有些问题由于我的英语很差,根本无法理解。问题代码和屏幕截图附在下面。希望你能帮助解决这个问题。 这个在控制台弹出

  • 问题内容: 我有两节课: MyApplication 库 该库已被编译为Library.class,并且源代码不再可用。我现在正在尝试从源代码编译MyApplication。MyApplication取决于库。该库的软件包名称为org.myCompany。我尝试将我的类路径设置为以下内容: 产生以下javac编译器错误消息: 所以我将类路径更改为: 产生完全相同的错误消息。 如何设置Windows

  • 我的Maven build在一个项目中遇到了一个奇怪的问题。由于某种原因,它在构建(在eclipse中运行为->Java Application)时给了我一个错误:“无法找到或加载main Class”。 奇怪的是,pom中的清单是100%正确的。 回到Eclipse Run As->Java application:Now也给出了main类错误,直到重新清理和构建。 这听起来是不是有人耳熟??

  • Creative Cloud 可以保留一份您对文件所做的每个更改的副本,并通过 Creative Cloud 桌面应用程序或 Creative Cloud Assets 网站进行同步。Adobe 会在服务器上将这些过去的版本保留十天时间。如果您意外修改了某个文件,或者协作者覆盖了您所执行的操作,只需点击几下即可将其恢复。 有关版本控制的详细信息,请参阅以下常见问题解答。 如何查看过去的文件版本?

  • 我在设置Java开发环境时遇到了一个问题。在过去,我安装了Java,然后安装了IDE,然后开始编写代码。我现在开始设置我的笔记本电脑,使用命令行编译和记事本作为我的代码编辑器。这是我第一次尝试纠正错误。 我运行javac,它创建了我的。类文件没有问题,但是我尝试用java A运行类文件,它抛出了一个错误: c:\工作区 我的类路径设置为C:\Program Files\Java\jdk-14.0.