由于项目要求,我们需要从不同的服务器导入项目映射和其他对象。但是我们发现所有的mapping context都变成了undefined。
我正在尝试编写一个常规程序来批量设置上下文。我已经编写了以下代码,但不知何故 interfaceList
为空,因此无法执行 odiInterface.setOptimizationContext(context);
。
下面是我的代码。为简洁起见,我没有提到包 stmt。
def all the variables like url,driver,schema etc
def all variables like MasterInfo, auth, transaction, etc
def OdiContext context = ((IOdiContextFinder) odiInstance.getTransactionalEntityManager().getFinder(OdiContext.class)).findByCode("CTX_ANN1_S4")
for (p in odiProjectList) {
if (p.getName() == "PrjDemo_TA") {
def OdiFolderList = p.getFolders()
for (f in OdiFolderList) {
if (f.getName() == "TrgDemoMod_Comn_TA_S4") {
// def OdiInterfaceList2 = f.getInterfaces()
// def OdiMappingList = odiInstance.getTransactionalEntityManager().findAll( Mapping.class)
def OdiInterfaceList = ((IOdiInterfaceFinder) odiInstance.getTransactionalEntityManager().getFinder(OdiInterface.class)).findByProject(projectCode, folderName)
for (m in OdiInterfaceList2) {
println(m.getName() + "|" + m.getClass()) //+ "|" + m.getParent() + "|" + m.getFolder() )
m.setOptimizationContext(context)
}
tm.commit(txnStatus)
}
}
}
}
初始化 OdiInterfaceList
的行不会抛出任何错误,也不会填充文件夹中所有接口(interface)的所需接口(interface)列表。
所以 m.setOptimizationContext(context)
没有被执行。
如果我将该行替换为:
def OdiMappingList = odiInstance.getTransactionalEntityManager().findAll( Mapping.class)
在 for ... 循环
中,我可以访问映射,但我不知道如何将其上下文 OdiMappingList
设置为 setOptimizationContext
是接口(interface)的方法。
最佳答案
我无法重现您的案例,因为我没有测试它的环境,但我仍然认为我可以提供帮助。
首先,我重构了您的代码,使其更符合常规:
def OdiContext context = ((IOdiContextFinder) odiInstance.getTransactionalEntityManager().getFinder(OdiContext.class)).findByCode("CTX_ANN1_S4")
// Looking for the project
def prjDemo = odiProjectList.find { it.name == "PrjDemo_TA" }
assert prjDemo : "Unable to find ODI project"
//Getting the Mappings
def mappingList = odiInstance.getTransactionalEntityManager().findAll( Mapping.class)
assert ! mappingList.toList().empty : "Mappings not found"
// Printing interfaces
mappingList.each {
it.setDefaultContext(context as IContext)
}
有了这些断言,您也许能够更详细地了解您的代码真正失败的地方。
我注意到 IOdiInterfaceFinder
是 marked as deprecated ,因此它可能无法很好地与 Oracle 12c 配合使用。检查你的版本。
如果您尝试用更更新的版本替换已弃用的代码,可能会更好。我在 this page 中找到了一些与您类似的代码, 所以它可能会有用。
更新:
更新代码以使用 Mapping
类。因为它有 setDefaultContext(IContext ctx)
方法并且 OdiContext
实现了 IContext
,也许它可以工作。
关于java - 在 odi 映射对象中设置上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59468096/