使用一个实体的规则,在流口水中是否有可能调用与第二个实体相关的方法?
使用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;
}
}
我在数据库中也有两个用户组Store
和Accounts
。现在,我想要做的是,当用户创建类型为Task
的{{1}}时,我想将受让人组设置为Accounts
组,同样将{{1} },类型为Accounts
。
我将规则定义为
Task
这很好用。但是现在,我想做类似的事情
Store
到目前为止,我只发现了一些示例,这些示例要么像上面所做的那样在drools规则文件中打印出消息,要么为原始数据类型的字段调用setter。我如何(甚至有可能)为引用不同实体的字段调用设置器?如果这还不算是最佳做法,请告诉我。我只是开始流口水,所以我在这里没什么主意。
答案 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。