0

从这个问题开始:

Apache Cayenne:用户定义表:示例?

作为我设计的一部分,我打算允许在运行时修改数据库模式的操作。正如上述问题中所讨论的,Cayenne 似乎确实支持这一点。

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

查看源代码后,我似乎有两个选择:

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

(2) 实现一个自定义的ResourceLocator,并使用注入绑定它。

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

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

4

1 回答 1

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 中解耦这两种用途。

于 2015-06-17T18:05:38.847 回答