Apache Cayenne:用户定义表:示例?
Apache Cayenne: user-defined tables: examples?
我正在考虑将 Apache Cayenne 作为新应用程序的 ORM 层。
我的部分数据库模型将在编译时已知的固定模型中定义。
但是,模型的另一部分将在 运行 时由某些有限的用户操作定义。因此,这些操作将产生创建某些简单表、从这些表中添加和删除列、删除表等的效果。
Cayenne 似乎非常适合这个,基于它的通用持久对象特性。
https://cayenne.apache.org/docs/3.1/cayenne-guide/persistent-objects-objectcontext.html
我正在寻找一些示例,说明如何将用户定义的 DbEntity 引入 Cayenne 运行时间,生成和 运行 CREATE / ALTER / DROP SQL , 然后指定某些通用持久对象由某些用户定义的表支持。
是的,Cayenne 通用对象可以在 运行 时间内更改您的模型。您还面临着更新实际模式的额外挑战。描述中有一些未知数(底层数据库是否由多个 apps/users 共享;模式更改的并发性;应用更改后是否需要将更改保留在底层 Cayenne 模型中)。但这是我将如何处理这个问题的粗略想法:
每当用户准备好进行新更改时,使用 cayenne-project.jar library.
从 ServerRuntime 单独加载受影响的 cayenne-project.xml
Injector i = DIBootstrap.createInjector(new CayenneProjectModule());
ProjectLoader loader = i.getInstance(ProjectLoader.class);
Project p = loader.loadProject(new URLResource(..));
进行更改:
ConfigurationNodeVisitor mapChangeAction = .. // implement this to make your changes
p.getRootNode().acceptVisitor(mapChangeAction);
保存回文件系统:
i.getInstance(ProjectSaver.class).save(p);
现在您可以使用新模型创建第二个 ServerRuntime,然后使用 org.apache.cayenne.merge 包中的 API 运行 针对数据库进行迁移。您可以使用 DbAdapter.mergerFactory() 根据您在上面所做的更改创建 MergeToken,然后执行它们:
DataDomain domain = newRuntime.getDataDomain();
DataNode node = domain.getDataNode("nodename");
DataMap map = domain.getDataMap("mapname");
List<MergerToken> tokens = ...
MergerContext mergerContext = new ExecutingMergerContext(map, node);
for (MergerToken tok : tokens) {
tok.execute(mergerContext);
}
最后用 'newRuntime'.
替换具有旧模型的原始 ServerRuntime
我正在考虑将 Apache Cayenne 作为新应用程序的 ORM 层。
我的部分数据库模型将在编译时已知的固定模型中定义。
但是,模型的另一部分将在 运行 时由某些有限的用户操作定义。因此,这些操作将产生创建某些简单表、从这些表中添加和删除列、删除表等的效果。
Cayenne 似乎非常适合这个,基于它的通用持久对象特性。
https://cayenne.apache.org/docs/3.1/cayenne-guide/persistent-objects-objectcontext.html
我正在寻找一些示例,说明如何将用户定义的 DbEntity 引入 Cayenne 运行时间,生成和 运行 CREATE / ALTER / DROP SQL , 然后指定某些通用持久对象由某些用户定义的表支持。
是的,Cayenne 通用对象可以在 运行 时间内更改您的模型。您还面临着更新实际模式的额外挑战。描述中有一些未知数(底层数据库是否由多个 apps/users 共享;模式更改的并发性;应用更改后是否需要将更改保留在底层 Cayenne 模型中)。但这是我将如何处理这个问题的粗略想法:
每当用户准备好进行新更改时,使用 cayenne-project.jar library.
从 ServerRuntime 单独加载受影响的 cayenne-project.xmlInjector i = DIBootstrap.createInjector(new CayenneProjectModule());
ProjectLoader loader = i.getInstance(ProjectLoader.class);
Project p = loader.loadProject(new URLResource(..));
进行更改:
ConfigurationNodeVisitor mapChangeAction = .. // implement this to make your changes
p.getRootNode().acceptVisitor(mapChangeAction);
保存回文件系统:
i.getInstance(ProjectSaver.class).save(p);
现在您可以使用新模型创建第二个 ServerRuntime,然后使用 org.apache.cayenne.merge 包中的 API 运行 针对数据库进行迁移。您可以使用 DbAdapter.mergerFactory() 根据您在上面所做的更改创建 MergeToken,然后执行它们:
DataDomain domain = newRuntime.getDataDomain();
DataNode node = domain.getDataNode("nodename");
DataMap map = domain.getDataMap("mapname");
List<MergerToken> tokens = ...
MergerContext mergerContext = new ExecutingMergerContext(map, node);
for (MergerToken tok : tokens) {
tok.execute(mergerContext);
}
最后用 'newRuntime'.
替换具有旧模型的原始 ServerRuntime