getFactHandle 方法 returns null 对于 Drools 中的任何事实

getFactHandle method returns null for any fact in Drools

我有如下一段代码:

KieSession kSession = JPAKnowledgeService.loadStatefulKnowledgeSession(someId, kieBase, null, env)

for (FactHandle f : kSession.getFactHandles()) {
    Object sessionObject = kSession.getObject(f);
    logger.info(String.format("Fact:  %s", sessionObject.toString()));
}

kSession.insert(someFact);

// Let's loop again to see if our fact is indeed there
for (FactHandle f : kSession.getFactHandles()) {
    Object sessionObject = kSession.getObject(f);
    logger.info(String.format("Fact:  %s", sessionObject.toString()));
}

// Do something else with someFact, insert it into some db

// factHandle is null
FactHandle factHandle = kSession.getFactHandle(someFact);

基本上,我正在加载我的持久性 KieSession,向其添加一个事实,遍历事实以检查新添加的事实确实存在,但是当我尝试取回它时,factHandle 对象为空。我正在尝试将 Drools 与基于身份的断言模式结合使用。所以我的相关问题是:

  1. 为什么我的事实句柄为空? someFact 在内存中的位置可能在 Do something else with someFact, insert it into some db 阶段发生了变化,对问题有影响吗?
  2. Drools 如何比较身份?我在我的 someFact 对象上有一个 private long id 归档,用 @Id.
  3. 注释
  4. 我正在创建 KieContainerKieBase,如下所示:

```

@Bean
public KieServices kieServices() {
    return KieServices.Factory.get();
}

@Bean
public KieContainer kieContainer() throws IOException {

    final KieRepository kieRepository = kieServices().getRepository();

    kieRepository.addKieModule(new KieModule() {
        @Override
        public ReleaseId getReleaseId() {
            return kieRepository.getDefaultReleaseId();
        }
    });

    KieFileSystem kfs = kieServices().newKieFileSystem();
    PathMatchingResourcePatternResolver pmrs = new PathMatchingResourcePatternResolver();
    Resource[] files = pmrs.getResources("classpath*:com/company/**/rules/*.drl");

    for(Resource file : files) {
        String myString = IOUtils.toString(file.getInputStream(), "UTF-8");
        kfs.write("src/main/resources/"+ file.getFilename(), myString);
    }

    KieBuilder kieBuilder = kieServices().newKieBuilder(kfs);
    kieBuilder.buildAll();
    return kieServices().newKieContainer(kieRepository.getDefaultReleaseId());
}

@Bean
public KieBase kieBase() throws IOException {
    KieBaseConfiguration kieBaseConfiguration = kieServices().newKieBaseConfiguration();
    kieBaseConfiguration.setProperty("assertBehaviour", "equality");
    return KnowledgeBaseFactory.newKnowledgeBase(kieBaseConfiguration);
}

```

如果我必须切换到基于相等的断言,我已经在我的对象上实现了 equalshashCode 方法,但找不到定义我的 KieBase 的方法'断言为 EQUALITY。我该怎么做?

  1. 只是 someFact 在内存中的位置在 Do something else with someFact, insert it into some db 中发生了变化,因此 Drools 无法使用身份模式进行比较。
  2. 内存中的位置。不是 Javax @Id 注释。
  3. 以下是将引擎置于相等模式的方法:

    KieBaseConfiguration kieBaseConfiguration = kieServices().newKieBaseConfiguration();
        kieBaseConfiguration.setOption(EqualityBehaviorOption.EQUALITY);
        return kieContainer().newKieBase(kieBaseConfiguration);