JDO + datanucleus API增强

时间:2014-12-31 17:31:43

标签: jdo datanucleus

我想动态加载不在类路径中的XML元数据文件(启动我的应用程序后将生成XML元数据文件)。 我以为我可以调用方法

MetaDataManager.registerFile(java.lang.String fileURLString, FileMetaData filemd, ClassLoaderResolver clr)

然后,我尝试了API增强,所以我添加了以下几行:

        JDOEnhancer enhancer = JDOHelper.getEnhancer();
        enhancer.setVerbose(true);          
        enhancer.addClasses(ClassToPersist.class.getName()).enhance();
        getClass().getClassLoader().loadClass(ClassToPersist.class.getName());

以下jar类在类路径中:datanucleus-api-jdo.jar,datanucleus-connectionpool.jar,datanucleus-core.jar datanucleus-rdbms.jar,jdo-api.jar,asm.jar。 但是当我启动我的应用程序时,我得到了这个例外:

Caused by: mypackage.MyException:
org.datanucleus.api.jdo.exceptions.ClassNotPersistenceCapableException: The class "mypackage.ClassToPersist" is not persistable. This means that it either hasnt been enhanced, or that the enhanced version of the file is not in the CLASSPATH (or is hidden by an unenhanced version), or the Meta-Data/annotations for the class are not found.

你知道怎么解决这个问题吗? PS:我也注意到方法增强返回0表示该类没有被增强(我们可以排除其他选项)

由于

2 个答案:

答案 0 :(得分:0)

因此,您对loadClass的调用已经加载了未增强的类(因为它可能已被加载以便大概执行增强),并且您没有按照{{3}提供的教程进行操作}}

答案 1 :(得分:0)

我想我找到了解决这个问题的简单方法。 在运行时,我创建了一个包含更新的元数据文件的jar,如META-INF / package.jdo。然后我按照here所述将这个jar添加到类路径中 使用这个hacks,我不需要重新加入我的类,因为它在编译后得到了增强。

(但是为了获取信息,我不得不调用JDOEnhancer.addFiles()来增强我的课程。)