为什么我在运行时使用 jre websphere 而不是正常工作的 jre 1.7 会遇到这个问题?
Why do I get this problem at runtime with the jre websphere instead with a normal jre 1.7 working properly?
我正在使用 JPA,我有一个 table 在 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();
}
} `
The error is:
java.lang.NoSuchFieldException: annotations
at java.lang.Class.getDeclaredFieldImpl(Native Method)
at java.lang.Class.getDeclaredField(Class.java:720)
at it.solarisistemi.awondo.be.web.Prova.changeTableSchema(Prova.java:106)
at 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)之间更改或消失,恕不另行通知,因为它们从未打算公开访问。
我会推荐以下解决方案之一,而不是破解注释值:
- 在数据库端设置一个 table 别名
- 使用
@Table.name()
的新值重新编译必要的应用程序 类
我正在使用 JPA,我有一个 table 在 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();
}
} `
The error is:
java.lang.NoSuchFieldException: annotations at java.lang.Class.getDeclaredFieldImpl(Native Method) at java.lang.Class.getDeclaredField(Class.java:720) at it.solarisistemi.awondo.be.web.Prova.changeTableSchema(Prova.java:106) at 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)之间更改或消失,恕不另行通知,因为它们从未打算公开访问。
我会推荐以下解决方案之一,而不是破解注释值:
- 在数据库端设置一个 table 别名
- 使用
@Table.name()
的新值重新编译必要的应用程序 类