将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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/356463.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c java 系统开发_java开发系统内核:使用C语言开发系统应用程序

更详细的讲解和代码调试演示过程&#xff0c;请参看视频用java开发C语言编译器如果你对机器学习感兴趣&#xff0c;请参看一下链接&#xff1a;机器学习&#xff1a;神经网络导论我们的操作系统通过增添内核接口导出机制后&#xff0c;已经可以作为平台&#xff0c;运行应用程序…

php 跨二级域名 设置cookie

登入也设置cookie setcookie(user_id, authlogin("user_id", "ENCODE"), time()(3600*24*30), "/", ".lfb365.com"); authlogin()方法为将user_id进行编码&#xff0c;非内置方法 退出页清除cookie setcookie("user_id", &q…

java jbutton文字_java JButton 改变按钮文字

展开全部因为 i 和 j 是局部变量&#xff0c;62616964757a686964616fe78988e69d8331333337383933在内部类中不允许访问局部变量&#xff0c;如果要访问必须添加 final。所以有个折中的办法&#xff0c;再声明两个中间变量&#xff0c;并定义为 final 类型的&#xff0c;你在内部…

抑制java对修饰符的检查_Java 7对抑制异常的支持

抑制java对修饰符的检查在JDK 7中 &#xff0c;向Throwable类&#xff08; Exception和Error类的父类&#xff09;添加了一个新的构造函数和两个新方法。 添加了新的构造函数和两个新方法以支持“抑制的异常”&#xff08;不要与吞咽或忽略异常的不良做法相混淆&#xff09;。 …

win7下装ubuntu14.04双系统

一、给ubuntu准备安装空间计算机--右键--管理-磁盘管理--选择一个空余空间较多的磁盘--右键--压缩卷--压缩大概60G空间&#xff08;接下来ubuntu就会装到这60G里面&#xff09;二、制作启动u盘用ultraiso将ubuntu14.04镜像写入u盘&#xff0c;制作启动u盘三、u盘启动&#xff0…

java bundle_java.util.ResourceBundle国际化用法详解

初识国际化和ResourceBundle这个类主要用来解决国际化和本地化问题。国际化和本地化可不是两个概念&#xff0c;两者都是一起出现的。可以说&#xff0c;国际化的目的就是为了实现本地化&#xff0c;详细的介绍可以看本文的最后。比如对于“取消”&#xff0c;中文中我们使用“…

编写基于事件的CQRS读取模型

关于事件源和CQRS的讨论似乎通常集中在CQRS上下文中的整体系统架构或领域驱动设计的各种形式。 但是&#xff0c;尽管也有一些有趣的考虑&#xff0c;但读取模型经常被忽略。 在本文中&#xff0c;我们将展示一个通过使用事件流填充视图模型的示例实现。 总览 读取模型的想法…

JSP数据交互

JSP数据交互 一、jsp中java小脚本 1.<% java代码段%> 2.<% java表达式%>不能有分号 3.<%!成员变量和函数声明%>二、注释 1.<!--html注释-->客户端可以看到 2.<%--jsp注释--%>客户端不能看到三、jsp页面的的执行过程 1.客户端请求&#xff08;输入…

java else if和switch_如何优雅地优化代码中的的if else和switch

引言一般来说&#xff0c;随着我们项目的迭代以及业务的越来越复杂&#xff0c;项目中的分支判断会原来越多。当项目中涉及到复杂的业务判断或者分支逻辑时&#xff0c;我们就需要考虑是否需要对项目进行重构了&#xff0c;或者if else和switch case是否能够满足当前项目的复杂…

jQuery data

一个简单的Cache (function(){var __cache {},Cache {get: function(__name){return __cache[__name] || undefined;}, set: function(__name, __value){return (__cache[__name] __value)}};this.Cache Cache; })();alert(Cache.get("name")); //undefine…

flink 复杂事件_复杂的(事件)世界

flink 复杂事件这篇博客文章试图总结CEP领域中的技术&#xff0c;并介绍它们的主要功能和不足。 有时似乎过度使用了CEP一词&#xff08;就像ESB一样&#xff09;&#xff0c;下面的内容反映了我们对它的理解和理解。 ESPER&#xff08; http://esper.codehaus.org/ &#xff0…

设计模式(中介者模式-对象去耦)

声明&#xff1a;本系列文章内容摘自《iOS设计模式》 中介者模式 用一个对象来封装一系列对象的交互方式。中介者使个对象不需要显式地相互调用&#xff0c;从而使其耦合松散&#xff0c;而且可以独立地改变它们之间的交互。 何时使用中介者模式 1.对象间的交互虽定义明确然而非…

java flash截图_求大神们帮助, 如何在java中实现文字数据转换成图片或flash显示

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException{response.setContentType("image/jpeg");createImage(response.getOutputStream());} private …

Spring Cloud Sidecar –节点初始化

在上一篇博客文章中&#xff0c;我描述了Sidecar应用程序如何用于在Eureka中注册Cassandra节点&#xff0c;并且更普遍地可以用于在Eureka中注册任何非JVM应用程序。 在本文中&#xff0c;我将介绍应用程序如何查询Sidecar注册节点。 发现注册的节点–初始化后 如果在Bean初始…

windows服务器的DDOS防御,

抵御 SYN 攻击 SYN 攻击利用了 TCP/IP 连接建立机制中的安全漏洞。要实施 SYN 洪水攻击&#xff0c;攻击者会使用程序发送大量 TCP SYN 请求来填满服务器上的挂起连接队列。这会禁止其他用户建立网络连接。 要保护网络抵御 SYN 攻击&#xff0c;请按照下面这些通用步骤操作&…

java传.net datetime_.net调java写的webService传过去的datetime,int等非string类型为null的问题...

使用.NET向webService传double、int、DateTime 服务器得到的数据时null的问题 收藏用C#.NET调用Java开发的WebService时&#xff0c;先在客户端封装的带有int属性的对象&#xff0c;当将该对象传到服务器端时&#xff0c;服务器端可以得到string类型的属性值&#xff0c;却不能…

arcengine,深入理解游标Cursors,实现数据的快速查找,插入,删除,更新

风过无痕 原文 arcengine,深入理解游标Cursors&#xff0c;实现数据的快速查找&#xff0c;插入&#xff0c;删除&#xff0c;更新 深入理解游标Cursors&#xff0c;实现数据的快速查找&#xff0c;插入&#xff0c;删除&#xff0c;更新 1、查找数据Search Cursors //by yl …

guice 框架_玩! 框架+ Google Guice

guice 框架在我目前正在工作的项目中&#xff0c;我们开始使用Google Guice。 对于那些不知道的人&#xff0c; Google Guice是一个依赖项注入框架。 依赖项注入的基本思想是提供一个其依赖的类&#xff0c;而不是使依赖类负责实例化它所依赖的对象。 Play具有用于整合Guice的模…

js中,实现对键盘按键的监听:

<script>function keyUp(e) { var currKey0,ee||event; currKeye.keyCode||e.which||e.charCode; var keyName String.fromCharCode(currKey); alert("按键码: " currKey " 字符: " keyName); } document.onkeyup keyUp;</scrip…

java程序运行结果题_2016年关于Java编程与程序运行结果笔试题

2016年关于Java编程与程序运行结果笔试题1.Java编程,打印昨天的当前时刻public class YesterdayCurrent{public void main(String[] args){Calendar cal Calendar.getInstance();cal.add(Calendar.DATE, -1);System.out.println(cal.getTime());}}2.文件读写,实现一个计数器pu…