多语言持久性:带有MongoDB和Derby的EclipseLink

从现在开始,多语种持久性一直是新闻。 从2011年底开始,在著名的Fowler帖子的推动下,我看到了更多更好的主意。 最新的一个是公司内部的学生项目,我们在其中使用Scala作为后端数据,将数据持久存储到MongoDB,Derby和Solar中。 我不是Scala的忠实拥护者,并且还记得EclipseLink对NoSQL数据库的日益增长的支持 。 鉴于我只需要尝试一下。

从哪儿开始?

最大的问题是缺少的示例。 您发现了很多有关如何使用EclipseLink更改数据容器(NoSQL或RDBMS)的知识,但是您找不到一个完全无缝地同时使用两种技术的数据容器。 感谢Shaun Smith和Gunnar Wagenkrnecht,我们在JavaOne上进行了关于Polyglot持久性的精彩演讲:EclipseLink JPA for NoSQL,Relational和Beyond正是在此进行了讨论。 不幸的是,消息来源仍然没有被推送到任何地方,我不得不从演讲中重新构建它,因此,功劳归功于Shaun和Gunnar。

神奇的解决方案称为持久性单元组成 。 每个数据容器都需要一个持久性单元。 看起来像下面的基本示例。 每个PU中都有几个实体,并且复合PU是保护伞。


我们走吧

在开始这个小教程示例之前,您应该已经安装了MongoDB 。 启动NetBeans并创建两个Java项目。 让我们称它们为polyglot-persistence-nosql-pu和polyglot-persistence-rational-pu。 将以下实体放入nosql-pu:客户,地址,订单和订单行。 (大部分取自
EclipseLink nosql示例 ),然后将Product实体放入Rational-pu。

单个产品进入Derby,而其他所有实体都保留在MongoDB中。 有趣的部分是,OrderLine与产品具有一对一关系:

@OneToOne(cascade = {CascadeType.REMOVE, CascadeType.PERSIST})
private Product product;

这是两个世界融合在一起的点。 以后再说。

两个PU都必须是transaction-type ='RESOURCE_LOCAL',并且需要在persistence.xml中包含以下行:

<property name='eclipselink.composite-unit.member' value='true'/>

不要忘记添加数据库特定的配置。 对于MongoDB,这是

<property name='eclipselink.nosql.property.mongo.port' value='27017'/>
<property name='eclipselink.nosql.property.mongo.host' value='localhost'/>
<property name='eclipselink.nosql.property.mongo.db' value='mydb'/>

对于德比,这是这样的:

<property name='javax.persistence.jdbc.url' value='jdbc:derby://localhost:1527/mydb'/>
<property name='javax.persistence.jdbc.password' value='sa'/>
<property name='javax.persistence.jdbc.driver' value='org.apache.derby.jdbc.ClientDriver'/>
<property name='javax.persistence.jdbc.user' value='sa'/>

现在,我们需要一些东西来将这两个PU链接在一起。 Combined-pu驻留在示例polyglot-persistence-web模块中,如下所示:

<persistence-unit name='composite-pu' transaction-type='RESOURCE_LOCAL'><provider>org.eclipse.persistence.jpa.PersistenceProvider</provider><jar-file>\lib\polyglot-persistence-rational-pu-1.0-SNAPSHOT.jar</jar-file><jar-file>\lib\polyglot-persistence-nosql-pu-1.0-SNAPSHOT.jar</jar-file><properties><property name='eclipselink.composite-unit' value='true'/></properties>
</persistence-unit>
</persistence>

注意jar文件的路径。 我们将其打包在一个战争存档中,因此,nosql-pu和有理-pu将进入WEB-INF / lib文件夹。 如您所见,我的示例是使用Maven构建的。 确保使用最新的EclipseLink依赖项。 甚至GlassFish 3.1.2.2仍附带较低版本。 从2.4开始增加了对MongoDB的支持。

<dependency><groupId>org.eclipse.persistence</groupId><artifactId>eclipselink</artifactId><version>2.4.1</version></dependency>

除此之外,还需要翻转GlassFish的类加载器:

<class-loader delegate='false'/>

不用担心细节。 我把一切都放在
github.com/myfear,因此,您稍后可能会自行研究完整的示例。

测试它

让我们用它做一些非常简短的测试。 创建一个不错的Demo servlet,然后将Composite-pu注入其中。 从中创建一个EntityManager并获取交易。 现在开始创建产品,客户,订单和单独的订单行。 所有普通的JPA。 这里没有进一步的魔术:

@PersistenceUnit(unitName = 'composite-pu')private EntityManagerFactory emf;protected void processRequest() // [...]{EntityManager em = emf.createEntityManager();em.getTransaction().begin();// Products go into RDBMSProduct installation = new Product('installation');em.persist(installation);Product shipping = new Product('shipping');em.persist(shipping);Product maschine = new Product('maschine');em.persist(maschine);// Customer into NoSQLCustomer customer = new Customer();customer.setName('myfear');em.persist(customer);// Order into NoSQLOrder order = new Order();order.setCustomer(customer);order.setDescription('Pinball maschine');// Order Lines mapping NoSQL --- RDBMSorder.addOrderLine(new OrderLine(maschine, 2999));order.addOrderLine(new OrderLine(shipping, 59));order.addOrderLine(new OrderLine(installation, 129));em.persist(order);em.getTransaction().commit();String orderId = order.getId();em.close();

如果将正确的日志记录属性放在适当的位置,您可以看到正在发生的情况:

将几个序列分配给创建的产品实体(GeneratedValue)。 客户实体通过MappedInteraction持久化到Mongo中。 实体映射到MongoDB中的集合。

FINE: Executing MappedInteraction()
spec => null
properties => {mongo.collection=CUSTOMER, mongo.operation=INSERT}
input => [DatabaseRecord(
CUSTOMER._id => 5098FF0C3D9F5D2CCB3CFECF
CUSTOMER.NAME => myfear)]

之后,您将看到产品被插入到Derby中,然后又被插入到MappedInteraction中,该订单将订单插入MongoDB中。 真正酷的部分在于OrderLines:

ORDER.ORDERLINES => [DatabaseRecord(LINENUMBER => 1COST => 2999.0PRODUCT_ID => 3), DatabaseRecord(LINENUMBER => 2COST => 59.0PRODUCT_ID => 2), DatabaseRecord(LINENUMBER => 3COST => 129.0PRODUCT_ID => 1)]

订单行具有一个对象,该对象具有为相关产品实体生成的product_id。 进一步,您还可以找到相关的订单并遍历产品并获得其描述:

Order order2 = em.find(Order.class, orderId);
for (OrderLine orderLine : order2.getOrderLines()) {String desc = orderLine.getProduct().getDescription();}

不错的小演示如下所示:

感谢Shaun,感谢Gunnar提供的这个好例子。 现在去github.com/myfear弄脏你的手:)

参考: Polyglot持久性: JCG合作伙伴 Markus Eisele在Java企业软件开发博客上的EclipseLink与MongoDB和Derby 。

翻译自: https://www.javacodegeeks.com/2012/11/polyglot-persistence-eclipselink-with-mongodb-and-derby.html

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

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

相关文章

web前端开发最佳实践--(笔记之JavaScript最佳实践)

如何避免全局变量污染&#xff1f; 避免定义全局变量或全局函数用一个变量进行封装&#xff0c;并返回外部需要访问的接口如何写出高维护的js代码 配置数据和代码逻辑分离 如&#xff1a; 改成&#xff1a; ---用js模板mustachehandlebarsjsMVC的数据模式 model&#xff1a;数据…

yum mysql5.7位置_CentOS yum 安装 Mysql5.7

1 Steps for a Fresh Installation of MySQL# wget https://dev.mysql.com/get/mysql57-community-release-el6-9.noarch.rpm# yum localinstall mysql57-community-release-el6-9.noarch.rpm以上步骤其实是把 MySQL Yum repository 添加到了系统的 repository list 里去了。ll…

HTML/CSS基础知识(四)

WEB标准和W3C的理解与认识 Web标准是一系列标准的集合。 网页主要由三部分组成&#xff1a;结构&#xff08;Structure&#xff09;、表现&#xff08;Presentation&#xff09;和行为&#xff08;Behavior&#xff09;。 对应的标准也分三方面&#xff1a;结构化标准语言主要包…

python做一个系统代码_python初学者,用python3实现基本的学生管理系统代码实例...

这篇文章分享了管理系统&#xff0c;python学生管理系统的使用&#xff0c;这篇文章非常详细地介绍了通过示例代码实现的学生管理系统&#xff0c;该系统对每个人的研究或工作都有一定的参考学习价值。 这个是用python实现的基本的增删改查的学生管理系统吧&#xff0c;其中主要…

Python入门笔记

Python变量和数据类型 数据类型 print语句 注释 Python的注释以 # 开头&#xff0c;后面的文字直到行尾都算注释 # 这一行全部都是注释... print hello # 这也是注释 什么是变量 定义字符串 字符串可以用或者""括起来表示。 如果字符串本身包含怎么办&#xff1f;比如…

1058. 选择题(20)

原题: https://www.patest.cn/contests/pat-b-practise/1058 思路: 本题主要就是怎么读取数据的问题, 一定要注意scanf函数匹配到 空格或者回车会结束当前变量的赋值, 并且会丢弃这个空格或回车. 关于如何判断一项答题是否正确, 可以采用循环一个一个判断, 也可拼成 字符串用st…

使用Spring和Hibernate进行集成测试有多酷

我有罪&#xff0c;直到现在才写集成测试&#xff08;至少针对数据库相关事务&#xff09;。 因此&#xff0c;为了消除内感&#xff0c;我阅读了如何在周末以最少的努力实现这一目标。 提供了一个小示例&#xff0c;描述了如何使用Spring和Hibernate轻松实现这一目标。 通过集…

假设mysql数据表t1有字段_使用ROMA Connect集成数据

概述ROMA Connect支持接入多种类型的数据源&#xff0c;并通过数据集成任务实现源端到目标端的数据集成转换。ROMA Connect支持相同结构数据之间进行集成转换&#xff0c;也支持异构数据之间进行集成转换。本章节通过完成一个SQL Server到MySQL的数据集成配置样例&#xff0c;帮…

vue-wechat-title

html中的title安装&#xff1a;npm install vue-wechat-title --save1.在mian.js中//网页titleimport VueTitle from vue-wechat-title Vue.use(VueTitle);2. 路由中加下 title { path: /, component: Index, meta: { title: 首页 } }3. 在app.vue 中修改 router-view &a…

如何保证input的输入值不会随着提交 而变空_如何对web界面的应用进行测试?

一、输入框&#xff1a;1、字符型输入框&#xff1a;&#xff08;1&#xff09;字符型输入框&#xff1a;英文全角、英文半角、数字、空或者空格、特殊字符“~&#xff01;#&#xffe5;%……&*&#xff1f;[]{}”特别要注意单引号和&符号。禁止直接输入特殊字符时&…

CentOS6.x下,tomcat - web项目部署

1. 安装tomcat tomcat安装方法&#xff1a;http://www.cnblogs.com/vurtne-lu/p/6478440.html 2. 配置tomcat 修改server.xml文件 <!-- 使用 80 端口 (也可以使用其它端口)--> <Connector port"80" protocol"HTTP/1.1"connectionTimeout"200…

dedecms列表页面随机缩略图调用

如果要利用dedecms制作扁平化主题&#xff0c;大概也能够遇到相似的问题&#xff0c;那就是dedecms的缩略图机制&#xff0c;在没有缩略图的情况下显示单一的默认图片&#xff0c;如果是wordpress可以很方便的定义函数调用随机的缩略图&#xff0c;即便是在没有设置缩略图并且文…

使用地图触发功能处理相干事件

本文介绍如何通过使用映射触发器来处理一致性事件。 基本上&#xff0c;建议使用Oracle Coherence中的分布式数据管理来研究Oracle Coherence API的基本配置和实现。 映射触发器是Oracle Coherence提供最高度定制的缓存管理系统的最重要功能之一。 MapTrigger代表一个功能代理…

阿里云服务器mysql莫名丢失_mysql数据库丢失

mysql数据库丢失云服务器(Elastic Compute Service&#xff0c;简称ECS)是阿里云提供的性能卓越、稳定可靠、弹性扩展的IaaS(Infrastructure as a Service)级别云计算服务。云服务器ECS免去了您采购IT硬件的前期准备&#xff0c;让您像使用水、电、天然气等公共资源一样便捷、高…

01-HTML深入

1.1 浏览器的工作原理 把一些标签解析成用户可视化的页面 1.2 HTML中的标签与元素 在HTML中以<xx>开始&#xff0c;以</xx>结束&#xff0c;比如<html></html>等。 标签和其内容统称为元素&#xff0c;比如&#xff1a;<xx>h5</xx> 元素…

gitlab使用_使用 Docker 部署 Gitlab

GitLab 是一个用于仓库管理系统的开源项目&#xff0c;使用Git作为代码管理工具&#xff0c;并在此基础上搭建起来的web服务&#xff0c;具有wiki和issue跟踪功能。GitLab是当前应用非常广泛的源代码管理系统。1. 安装docker引擎并启动2. 获取gitlab镜像包查看下载好的镜像3. 在…

js--webSocket入门

Websocket 1.websocket是什么&#xff1f; WebSocket是为解决客户端与服务端实时通信而产生的技术。其本质是先通过HTTP/HTTPS协议进行握手后创建一个用于交换数据的TCP连接&#xff0c; 此后服务端与客户端通过此TCP连接进行实时通信。 2.websocket的优点 以前我们实现推送技术…

node.js继承

person.js module.exports function(){   this.name "person";   this.sleep function(){     console.log("sleep in the night");   }   this.eat function(){     console.log(eat food);   }} student.js var util require(&qu…

研究死锁–第5部分:使用显式锁定

在我的上一个博客中&#xff0c;我研究了使用Java的传统synchronized关键字和锁排序来修复破碎的&#xff0c;死锁的余额转移示例代码。 但是&#xff0c;有一种替代方法称为显式锁定。 这里&#xff0c;将锁定机制称为显式而非隐式的想法是&#xff0c; 显式表示它不是Java语…

mysql 经典入门教程_MySQL 经典入门教程

MySQL 经典入门教程1 定义数据库中的表&#xff1a;一行叫一条记录。每一列叫一个属性&#xff0c;或一个字段。主键&#xff1a;表中的某个特殊字段&#xff0c;具有唯一的确定的值&#xff0c;可以根据该字段唯一的确定一条记录外键&#xff1a;表中的某个字段的值为另一张表…