多語言持久性:帶有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.pswp.cn/news/370560.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/370560.shtml
英文地址,請注明出處:http://en.pswp.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;表中的某個字段的值為另一張表…