使用一个实体的流口水规则来调用与第二个实体相关的方法

时间:2018-11-23 12:18:12

标签: spring-boot drools kie

使用一个实体的规则,在流口水中是否有可能调用与第二个实体相关的方法?

使用Spring Boot,我具有以下Task实体。

@Entity
public class Task extends AbstractPersistable<Long> {

    private String title;
    private String description;

    @ManyToOne
    @JoinColumn(name = "assignee_group_id")
    private UserGroup assigneeGroup;

    @Enumerated(EnumType.STRING)
    private TaskType type;

    //getters and setters
}

还有UserGroup实体

@Entity
public class UserGroup extends AbstractPersistable<Long> {

    private String name;

    @OneToMany(targetEntity = Task.class, mappedBy = "assigneeGroup", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    private Set<Task> tasks;

    //getters and setters
}

TaskType枚举定义为

public enum TaskType {

    STORE("Store"), ACCOUNTS("Accounts");

    private String formattedName;

    TaskType(String formattedName) {
        this.formattedName = formattedName;
    }

    public String getFormattedName() {
        return formattedName;
    }

}

我在数据库中也有两个用户组StoreAccounts。现在,我想要做的是,当用户创建类型为Task的{​​{1}}时,我想将受让人组设置为Accounts组,同样将{{1} },类型为Accounts

我将规则定义为

Task

这很好用。但是现在,我想做类似的事情

Store

到目前为止,我只发现了一些示例,这些示例要么像上面所做的那样在drools规则文件中打印出消息,要么为原始数据类型的字段调用setter。我如何(甚至有可能)为引用不同实体的字段调用设置器?如果这还不算是最佳做法,请告诉我。我只是开始流口水,所以我在这里没什么主意。

1 个答案:

答案 0 :(得分:0)

经过一些研究,我已经解决了这个问题。 This post确实很有帮助。我在findByNameOrCreate中定义了一个UserGroupService方法,该方法接受userGroup名称并返回一个userGroup实例。然后在定义kieSession的地方,将全局设置为UserGroupService,如下所示:

public Task save(Task task) {
    KieSession kieSession = kieContainer.newKieSession("rulesSession");
    KieRuntime kieRuntime = (KieRuntime) kieSession;
    kieRuntime.setGlobal("userGroupService", userGroupService);
    kieSession.insert(task);
    kieSession.fireAllRules();
    kieSession.dispose();
    return taskRepository.save(task);
}

然后我将规则定义为

package rules

import com.packagename.domain.Task
import com.packagename.service.UserGroupService

global UserGroupService userGroupService;

rule "Task for Store"
    when
        taskObject: Task(type.formattedName=="Store");
    then
        taskObject.setAssigneeGroup(userGroupService.findByNameOrCreate("Store"));
    end

rule "Task for Accounts"
    when
        taskObject: Task(type.formattedName=="Accounts");
    then
        taskObject.setAssigneeGroup(userGroupService.findByNameOrCreate("Accounts"));
    end

现在,每当调用save方法时,都会使用该名称将该任务分配给正确的userGroup。