我编写了一个自定义类加载器,以便能够为更新过程的每个步骤动态加载域模型。在更新的每一步中,都会创建一个新线程,以确保不仅 contextClassloader,而且当前的类加载器也指向我自己的 ClassLoader。
这听起来有点复杂,但效果很好。
最新的域模型作为静态依赖项添加到项目中,所有以前的域模型作为 jar 添加到资源文件夹。自定义类加载器从这些 jar 文件加载域类。
所有域类和 eclipselink 类都由我的类加载器加载。但是我仍然得到以下异常,我不太明白,为什么?
Exception [EclipseLink-59] (Eclipse Persistence Services - 2.1.3.v20110304-r9073): org.eclipse.persistence.exceptions.DescriptorException
Exception Description: The instance variable [hospitalization] is not defined in the domain class [example.role.Patient], or it is not accessible.
Internal Exception: java.lang.NoSuchFieldException: hospitalization
Mapping: org.eclipse.persistence.mappings.DirectToFieldMapping[hospitalization-->Patient.hospitalization]
Descriptor: RelationalDescriptor(example.role.Patient --> [DatabaseTable(Role), DatabaseTable(Patient)])
域类由我的类加载器加载,并且没有缺少的住院字段。没关系,它应该是这样工作的,但是 eclipselink 以某种方式加载了静态链接到项目的不正确的域版本,并从中加载了字段名称。
我已经开始深入研究 eclipselink 代码,但尤其是这个映射部分并不是很简单。