Apache Cayenne:提供动态生成的项目定义

时间:2015-06-16 08:27:17

标签: apache-cayenne

继续这个问题:

Apache Cayenne: user-defined tables: examples?

作为我设计的一部分,我打算允许在运行时修改数据库架构的操作。正如上面的问题所讨论的那样,Cayenne似乎支持这一点。

我对如何在不使用文件系统的情况下向ServerRuntime提供新项目定义感兴趣。

在查看源代码后,看起来我有两个选择:

(1)实现自定义类加载器,将其设置为线程本地类加载器,并允许Cayenne使用ClassLoaderResourceLocator查找它。

(2)实现自定义ResourceLocator,并使用注入将其绑定。

我很清楚如何做(1)但可以说(2)有点整洁,因为它不依赖于ClassLoaderResourceLocator的行为。

(2)是否合理,我将如何编码?

1 个答案:

答案 0 :(得分:1)

假设您的动态项目定义仍然是XML,自定义ResourceLocator绑定非常简单,可能就是这样。因此,如果你有自己的XyzResourceLocator,你只需要这样做:

// using lambda for the Module interface (assumes java 8)
ServerRuntime r = new ServerRuntime(
    "somelocation", 
     binder -> binder.bind(ResourceLocator.class)
                     .to(XyzResourceLocator.class));

如何实现XyzResourceLocator取决于动态生成的项目定义所在的位置。

另外,看一下源代码,我看到一个小警告。 ResourceLocator(错误的IMO)在不同的上下文中用于加载一些内部Cayenne XML描述符。因此,当您实现自己的定位器时,您可能需要执行以下检查:

if(name.endsWith("types.xml")) { .. revert to ClassLoaderResourceLocator ..}
else { .. use your own algorithm .. }

我们最终需要在Cayenne中解开这两种用途。