Использование правила drools одного объекта для вызова методов, связанных со вторым объектом - PullRequest
0 голосов
/ 23 ноября 2018

Используя правила для одной сущности, можно ли в drools вызывать методы, связанные со второй сущностью?

Используя загрузку Spring, у меня есть следующая сущность 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;
    }

}

У меня также есть две группы пользователей Store и Accounts вбаза данных.Теперь то, что я хочу сделать, - это когда пользователь создает Task типа Accounts, я хотел бы установить группу уполномоченных как группу Accounts, и аналогично для Task типа Store.

Я определил правила как

rule "Task for Store"
    when 
        taskObject: Task(type.formattedName=="Store")
    then
        System.out.println("task for store invoked");
    end

rule "Task for Accounts"
    when 
        taskObject: Task(type.formattedName=="Accounts")
    then
        System.out.println("task for accounts invoked");
    end

Это прекрасно работает.Но теперь я хочу сделать что-то вроде

rule "Task for Store"
    when 
        taskObject: Task(type.formattedName=="Store")
    then
        //find user group with name Store
        //set this user group as the assignee group
    end

rule "Task for Accounts"
    when 
        taskObject: Task(type.formattedName=="Accounts")
    then
        //find user group with name Accounts
        //set this user group as the assignee group
    end

Пока что я нашел только примеры, которые либо распечатывали сообщение в файле правил drools, как я это делал выше, либо вызывали сеттеры для полей примитивного типа данных.,Как я могу (или вообще возможно) вызывать сеттеры для полей, ссылающихся на другую сущность?Пожалуйста, дайте мне знать, если это даже не считается лучшей практикой.Я только начинаю пускать слюни, поэтому у меня нет особых идей.

1 Ответ

0 голосов
/ 26 ноября 2018

Я решил проблему после некоторого исследования. Этот пост был действительно полезен.Я определил 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 метод вызывается с использованием имени, задача назначается правильной группе пользователей.

...