当前位置: 首页 > 知识库问答 >
问题:

带Hibernate的Optaplanner-一些DRL规则不起作用

邵畅
2023-03-14

我正在使用Optaplanner申请员工排班。没有毅力,一切都很好。现在,我想添加Hibernate集成。我想从MySQL数据库中获取信息,并将其用作时间表输入。

在数据库中,我有位置和技能表。

员工数据、时隙和工作分配现在已在应用程序中硬编码。

我的域类,技能:

import javax.persistence.*;

@Entity
@Table(name = "SKILL")
public class Skill {

    private long skillId;
    private String name;

    public Skill(String name) {
        this.name = name;
    }

    public Skill() {}

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "SKILL_ID")
    public long getSkillId() {
        return this.skillId;
    }

    public void setSkillId(long skillId) {
        this.skillId = skillId;
    }

    @Column(name = "SKILL_NAME", nullable = false, length=250)
    public String getSkillName() {
        return this.name;
    }

    public void setSkillName(String skillName) {
        this.name = skillName;
    }

    @Override
    public String toString() {
        return name;
    }

}

和职位:

import javax.persistence.*;

@Entity
@Table(name = "POSITION")
public class Position {

    private long positionId;
    private String name;
    private Skill requiredSkill;

    public Position(String name, Skill requiredSkill) {
        this.name = name;
        this.requiredSkill = requiredSkill;
    }

    public Position() {}

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "POSITION_ID")
    public long getPositionId() {
        return this.positionId;
    }

    public void setPositionId(long positionId) {
        this.positionId = positionId;
    }

    @Column(name="POSITION_NAME", nullable=false, length = 100)
    public String getPositionName() {
        return this.name;
    }

    public void setPositionName(String positionName) {
        this.name = positionName;
    }

    @OneToOne(cascade = CascadeType.ALL)
    public Skill getRequiredSkill() {
        return this.requiredSkill;
    }

    public void setRequiredSkill(Skill requiredSkill) {
        this.requiredSkill = requiredSkill;
    }

    @Override
    public String toString() {
        return name;
    }
}

不起作用的规则:

rule "Employee works only on positions with skills he has"
    when
        Assignment(
                employee != null,
                !getEmployee().getSkillSet().contains(getPosition().getRequiredSkill()))
    then
        scoreHolder.addHardConstraintMatch(kcontext, -100);
end

我认为数据库还可以,因为其中的数据以前是用这个应用程序创建的。此外,我还有另一个DRL规则正在运行。我没有收到任何警告/错误-只是在求解过程中没有考虑上述规则。

在解决我得到:

08:40:11.453 [main] DEBUG org.drools.core.common.DefaultAgenda - State was INACTIVE is now FIRING_ALL_RULES
08:40:11.453 [main] DEBUG org.drools.core.common.DefaultAgenda - State was FIRING_ALL_RULES is now HALTING
08:40:11.453 [main] DEBUG org.drools.core.common.DefaultAgenda - State was HALTING is now INACTIVE
08:40:11.453 [main] DEBUG org.optaplanner.core.impl.constructionheuristic.DefaultConstructionHeuristicPhase -     CH step (1), time spent (134), score (-14init/-202hard/0soft), selected move count (7), picked move (domain.Assignment@4d354a3e {null -> domain.Employee@1511d157}).

此外,在乞讨会上,我收到了以下警告:

Failed to add the foreign key constraint. Missing index for constraint 'FKqx7n7alhjrnaw173dc48i47y0' in the referenced table 'skill'

共有1个答案

范浩荡
2023-03-14

看看我们是如何在optaweb员工名册中添加JPA-hibernate持久性的。

具体来说,对Shift类的乐观锁定提供了一个挑战,我们像这样修复了它。

 类似资料:
  • 问题内容: 我有一个嵌套的flexbox布局(使用bootstrapv4),可根据横向/纵向模式更改方向。第一层(由flexbox使用该属性放置)包含5个用作按钮的图标。我无法在这些图标上正常使用该属性。 如果我不使用属性,则图标将按照自然顺序进行布局;但是,如果我尝试使用该属性对其进行布局,则无法正常工作。在代码中,()应该是最后一个元素。不是。我可以通过更改源中的顺序来获得所需的顺序。但是,我

  • 更新: 如果我使用注释和路径:/*和/api/*-site可以很好地工作。但是因为我使用全局静态IP,所以我不能为每个IP创建一个以上的入口。如果我使用-site返回错误:

  • 我有一个Firestore集合,结构如下: 但是,当我试图保护集合以只允许上面的快照(而不是对集合中其他文档的请求)时,我的权限是不正确的。这是我尝试过的: 我也试过: 它似乎有效,但不允许我访问文档的子集合。我需要rules方法才能工作。 在我列出答案之前,我会给一些时间,以防更有经验的人有更好的解决方案。

  • 构造函数验证的代码: 如何测试对象: 我不知道为什么JavaScript版本与groovy版本的行为不同,我已经尝试更改了我能想到的所有组合,包括:、、、、和

  • 我试图将我的流程变量放入业务规则任务中,并在该任务中更改该变量,但值保持不变。我做错了什么?流程是在kie工作台中开发的,不使用Eclipse。 在触发规则之前,我的变量在脚本任务中初始化,如 谢谢你的帮助!

  • 在为我的项目实现了一些规则之后,我做了一个“ScoreConsistencyCheck”,以确保规则得到了正确的实现。 表示实现我自己的方法,该方法将在我提前终止求解或通过配置终止后调用,输出预期分数。该方法的参数是一个实例,基于解决方案的状态计算预期分数,然后将其与来自解决方案实例的“分数”变量的分数进行比较。 当我使用时,它不会抛出异常,但是当我这样尝试时,我有时会在构建启发式或本地搜索的特定