mongodb 持久性

从现在开始,多语种持久性一直是新闻。 从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和Rational-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

mongodb 持久性

mongodb 持久性_多语言持久性:带有MongoDB和Derby的EclipseLink相关推荐

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

    从现在开始,多语种持久性一直是新闻. 从2011年底开始,在著名的Fowler帖子的推动下,我看到了更多更好的主意. 最新的一个是公司内部的学生项目,我们在其中使用Scala作为后端数据,将数据持久存 ...

  2. python mongodb 异步_【转】Python操作MongoDB数据库

    前言 MongoDB GUI 工具 PyMongo(同步) Motor(异步) 后记 前言 最近这几天准备介绍一下 Python 与三大数据库的使用,这是第一篇,首先来介绍 MongoDB 吧,,走起 ...

  3. mongodb 启动_程序员看过来:如何下载和安装MongoDB数据库?

    我们将介绍如何下载安装MongoDB数据库以及如何在Windows上对该数据库进行访问. A.1 下载并安装MongoDB数据库 请访问MongoDB官网查找并下载适用于你的操作系统的MongoDB数 ...

  4. mongodb 启动_精心总结--mongodb分片集群启动与关闭

    概述 网上教程有点坑啊,很多bug,今天刚好涉及到所以抽空整理了下mongodb分片集群启动与关闭方面的教程.希望对大家有点帮助. 基础环境配置 192.168.240.145 测试Nosql服务器1 ...

  5. mongodb时间范围查询少8个小时_为何要对开源mongodb数据库内核做二次开发

    关于作者 前滴滴出行技术专家,现任OPPO文档数据库mongodb负责人,负责oppo千万级峰值TPS/十万亿级数据量文档数据库mongodb内核研发及运维工作,一直专注于分布式缓存.高性能服务端.数 ...

  6. core 实例化接口_实例讲解Springboot整合MongoDB进行CRUD操作的两种方式

    1 简介 Springboot是最简单的使用Spring的方式,而MongoDB是最流行的NoSQL数据库.两者在分布式.微服务架构中使用率极高,本文将用实例介绍如何在Springboot中整合Mon ...

  7. mongodb卸载_如何在Windows上安装MongoDB,启动,卸载

    mongodb卸载 Today we will learn how to install MongoDB on Windows. Most of us use Windows for our pers ...

  8. mongodb java连接 集群_java连接mongodb集群

    MongoDb 的分片拓展与副本集 Mongodb 数据库分片是通过并行处理数据实现负载均衡的一种重要手段[12],同时也是数据库集群 实现分布式计算的关键技术.在生产环境中,...... 本地数据访 ...

  9. 如何确认mongodb数据插入是否成功_go连接mongodb

    mongodb介绍 mongodb是基于分布式文件存储的数据库,一条数据存储为一个文档document,数据结构是由key-value对组成,文档类类似于平时使用的json对象.文档中字段值可以包含其 ...

最新文章

  1. Java开发人员可以从Spring框架中学到编程技巧
  2. Linux-服务管理命令chkconfig
  3. Layout anchors徒手写AutoLayout Swift
  4. 配置javaw.exe双击运行jar包
  5. 用ffmpeg将wav转换为PCM音频
  6. 常见概率抽样方法及其适用场景总结(简单随机抽样、分层抽样、整群抽样、系统抽样)
  7. python练习题003:圆的面积
  8. 从这里开始你的游戏黑客入门的之旅吧
  9. 语言的流变_拔剑-浆糊的传说_新浪博客
  10. 设置透明主题引起动画失效以及打开其他应用闪现桌面图标的问题
  11. Android 国内阿里云镜像
  12. Power BI_柱状图中间空一列_横坐标显示
  13. anaconda安装多环境
  14. 2019 年最佳 Linux 笔记本电脑发行版 top10
  15. C++中fstream 的使用一
  16. VUE如何快速做一个轮播图
  17. 名词解释P2P计算机网络技术,计算机三级网络技术P2P网络知识考点
  18. Xcode_修改默认名称和公司
  19. 万物互联 | 你的企业可能需要这样一个物联网平台
  20. 使用telnet登陆smtp服务发邮件

热门文章

  1. java多线程之:SynchronousQueue队列
  2. java中你知道的这四种代码块吗?
  3. 你喜欢什么样的课堂?
  4. Springmvc入门案例(1)
  5. Cookie和Session 登录
  6. spring data jpa是什么?
  7. ServletActionContext.getRequest().getSession() 和 ActionContext.getContext().getSession()的区别
  8. python实现倒n字形排列_Leetcode问题库——Z形变换(Python),补充X形变换,字形
  9. VMnet1和VMnet8 未识别的网络的解决方法
  10. okta使用_使用Okta的单点登录保护您的Vert.x服务器