由于项目要求,我们需要从其他服务器导入项目映射和其他对象。但是我们发现所有映射上下文都变得不确定。
我正在尝试编写一个普通的程序来设置上下文。我已经编写了下面的代码,但由于某种原因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
的行不会引发任何错误,也不会填充文件夹中所有接口的所需接口列表。
因此m.setOptimizationContext(context)
未执行。
如果我将该行替换为:
def OdiMappingList = odiInstance.getTransactionalEntityManager().findAll( Mapping.class)
在for ... loop
内,我可以访问映射,但是我不知道如何设置其上下文OdiMappingList
,因为setOptimizationContext
是接口的方法。
答案 0 :(得分:4)
由于我没有可以测试的环境,因此我无法重提您的案件,但我仍然认为我可以提供帮助。
首先,我重构了您的代码,使其更具趣味性:
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
,因此也许可行。