java - 在 odi 映射对象中设置上下文

标签 java groovy oracle-data-integrator

由于项目要求,我们需要从不同的服务器导入项目映射和其他对象。但是我们发现所有的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)
}

有了这些断言,您也许能够更详细地了解您的代码真正失败的地方。

我注意到 IOdiInterfaceFindermarked as deprecated ,因此它可能无法很好地与 Oracle 12c 配合使用。检查你的版本。

如果您尝试用更更新的版本替换已弃用的代码,可能会更好。我在 this page 中找到了一些与您类似的代码, 所以它可能会有用。

更新: 更新代码以使用 Mapping 类。因为它有 setDefaultContext(IContext ctx) 方法并且 OdiContext 实现了 IContext,也许它可以工作。

关于java - 在 odi 映射对象中设置上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59468096/

相关文章:

recursion - Groovy::Map Find Recursive

maven-2 - Maven依赖项解析

linux - 无法使用 ODIExportMaster 工具创建目录

linux - ODI-2012更新计划时发生错误:ODI-10147:存储库类型不匹配

java - Java 中删除数组的最高值和最低值

Java向下兼容性说明

java - 即使在轴上自动量程,我能否保留完整的刻度线?

java - 如何创建包含多个 set 子句的 update 语句?

sql-server - 如何使用 JPA/Hibernate 设置 XACT_ABORT?

使用 ORACLE 关键字作为列的 XML 模型在逆向工程时未翻译