java - 为什么我在运行时使用 jre websphere 而不是正常的 jre 1.7 工作时会出现这个问题?
问题描述
我正在使用 JPA,并且我有一个在 n 方案上重复的表。查询是用 jpql 编写的,我需要根据需要指定不同的方案以避免创建重复代码。更准确地说,我想 @Table (name = "nameofTable", schema = "nameofSchema")
在运行时更改注释的 nameOfSchema 的值,然后执行查询。在这方面我写了下面的方法。在使用普通的 JRE 1.7 运行时,它可以正常工作,但是当我使用 websphere JRE 1.7 运行该方法时,出现运行时错误。
`public void changeTableSchema(final String schema,Class<?> entityWithTable) throws Exception {
try {
final String ANNOTATIONS = "annotations";
Table anntotationToChange = entityWithTable.getAnnotation(Table.class);
final Table anntotationToChangeCopy = anntotationToChange;
anntotationToChange = new Table() {
@Override
public Class<? extends Annotation> annotationType() {
return anntotationToChangeCopy.annotationType();
}
@Override
public UniqueConstraint[] uniqueConstraints() {
return anntotationToChangeCopy.uniqueConstraints();
}
@Override
public String schema() {
return schema;
}
@Override
public String name() {
return anntotationToChangeCopy.name();
}
@Override
public String catalog() {
return anntotationToChangeCopy.catalog();
}
};
Field annotations = Class.class.getDeclaredField(ANNOTATIONS);
annotations.setAccessible(true);
Map<Class<? extends Annotation>, Annotation> map = (Map<Class<? extends Annotation>, Annotation>) annotations
.get(entityWithTable.class);
map.put(Table.class, anntotationToChange);
} catch (Exception e) {
e.printStackTrace();
}
} `
错误是:
java.lang.NoSuchFieldException: 在 it.solarisistemi.awondo.be.web.Prova 的 java.lang.Class.getDeclaredField(Class.java:720) 的 java.lang.Class.getDeclaredFieldImpl(Native Method) 的注释.changeTableSchema(Prova.java:106) 在 it.solarisistemi.awondo.be.web.Prova.main(Prova.java:23)
解决方案
出现此错误的原因是因为您在 的实现中侵入了一个不可见的字段java.lang.Class
,并且 Java 类的实现可能会根据不同的 JDK 发行版(例如 Oracle 与 IBM JDK 与 OpenJDK)而有所不同。
更重要的是,这些内部字段可能会在同一供应商的 JDK 版本(例如 IBM JDK 7 到 IBM JDK 8)之间更改或消失,恕不另行通知,因为它们从未打算公开访问。
我会推荐以下解决方案之一,而不是侵入注释值:
- 在 DB 端设置表别名
- 用新值重新编译必要的应用程序类
@Table.name()
推荐阅读
- python - 如何与机器人命令一起运行 loop.create_task()?
- css - 背景图像仅在 Edge 中显示截断
- batch-file - For 循环使用用户输入来组合文件 - 使用命令
- intellij-idea - GDSL 用于在注解中定义闭包的委托
- python - 创建新列但在熊猫中获得收入
- c - 部分不受信任的应用程序中的地址检查
- azure-functions - 使用 Azure 函数进行更新以挂接到 SignalR 广播
- android - 我的 Gradle 插件如何修改 AGP 7.0.0 的打包选项?
- r - 仅当尚未在列表中(来自多个数据集)时,如何将元素添加到列表中
- ios - 在 NSData 的 UnsafeRawPointer 上使用 deallocate 时内存泄漏?