将JPA Hibernate与OptaPlanner集成
我們一直在改進OptaPlanner與JEE其余部分的集成,因此,構建可以正常工作的最終用戶應用程序更加容易。 讓我們看一下改進的JPA Hibernate集成。
基礎
JPA Hibernate和OptaPlanner都可以在POJO(普通的舊Java對象)上工作,因此只需在域對象上添加一些JPA批注以使其與JPA Hibernate保持一致,并添加一些OptaPlanner批注即可解決OptaPlanner的優化問題。
在每個問題事實類上,通常只有JPA批注:
@Entity // JPA annotation public class Computer {private int cpuPower;private int memory;private int networkBandwidth;private int cost;... }在每個計劃實體類上,都有JPA和OptaPlanner批注:
@PlanningEntity // OptaPlanner annotation @Entity // JPA annotation public class Process {private int requiredCpuPower;private int requiredMemory;private int requiredNetworkBandwidth;@PlanningVariable(...) // OptaPlanner annotation@ManyToOne() // JPA annotationprivate Computer computer;... }不要將JPA實體(任何持久存儲在數據庫中的對象)與OptaPlanner規劃實體(在解決過程中由OptaPlanner更改的對象)混淆。
堅持得分
默認情況下,JPA Hibernate將通過Java序列化將Score放在BLOB列中。 這是不希望的,因為它阻止了在JPA-QL查詢中使用分數。 此外,在升級OptaPlanner版本時,它還會觸發數據庫問題。
因此,OptaPlanner 6.4.0.Beta1具有一個新的jar optaplanner-persistence-jpa ,其中包含每種評分類型的Hibernate類型。 像這樣使用它:
@PlanningSolution // OptaPlanner annotation @Entity // JPA annotation @TypeDef(defaultForType = HardSoftScore.class, typeClass = HardSoftScoreHibernateType.class) // Hibernate annotation public class CloudBalance implements Solution<HardSoftScore> {@Columns(columns = {@Column(name = "hardScore"), @Column(name = "softScore")}) // JPA annotationprivate HardSoftScore score;... }這會將HardSoftScore放入2個INTEGER列,而不是BLOB列。 OptaPlanner參考手冊包含有關如何正確處理BigDecimal和/或可彎曲分數的更多信息。
克隆陷阱
在JPA模型中,問題事實通常引用計劃解決方案,這可能會破壞計劃克隆(如果使用默認計劃克隆器)。
為了克服這個問題,只需使用@DeepPlanningClone注釋注釋引用計劃解決方案或計劃實體的問題事實類:
@DeepPlanningClone // OptaPlanner annotation: Force the default planning cloner to planning clone this class too @Entity // JPA annotation public class Computer {@ManyToOneprivate CloudBalance cloudBalance;... }這樣, Computer類也正在計劃克隆,并且克隆的cloudBalance字段將指向CloudBalance克隆。
結論
您可以對JPA Hibernate和OptaPlanner使用相同的域類,無需重復您的域!
翻譯自: https://www.javacodegeeks.com/2015/09/integrating-jpa-hibernate-with-optaplanner.html
總結
以上是生活随笔為你收集整理的将JPA Hibernate与OptaPlanner集成的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 现货白银怎么开户?
- 下一篇: 编写基于事件的CQRS读取模型