继续这个问题:
Apache Cayenne: user-defined tables: examples?
作为我设计的一部分,我打算允许在运行时修改数据库架构的操作。正如上面的问题所讨论的那样,Cayenne似乎支持这一点。
我对如何在不使用文件系统的情况下向ServerRuntime提供新项目定义感兴趣。
在查看源代码后,看起来我有两个选择:
(1)实现自定义类加载器,将其设置为线程本地类加载器,并允许Cayenne使用ClassLoaderResourceLocator查找它。
(2)实现自定义ResourceLocator,并使用注入将其绑定。
我很清楚如何做(1)但可以说(2)有点整洁,因为它不依赖于ClassLoaderResourceLocator的行为。
(2)是否合理,我将如何编码?
答案 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中解开这两种用途。