Morphia和MongoDB:不斷發展的文檔結構

在上一篇有關Morphia的文章中 ,我介紹了一些典型用法,并提到了一些已知問題的警告和解決方法。 我展示了使用Morphia多么容易,以及它與Java世界的交互方式。

為了跟進該帖子,我將討論如何處理一些現實生活中的需求:處理更改的架構并自定義映射以處理諸如只讀字段之類的事情,并用復雜的對象替換簡單的字段。

變更架構

幾乎所有在開發領域中使用過數據庫的人都知道,模式一直在發展。 不推薦使用或完全刪除字段,廢棄表,添加新字段等等。

盡管通過使用像MongoDB這樣的無模式數據存儲可以避免很多麻煩,但有時我們仍然需要對更改進行特殊處理,就Morphia而言,我們本質上已經定義了模式,因此我們必須找到處理方法。這個。 最好的一點是,Morphia使它非常干凈和容易,比您在任何ORM中所看到的都要容易。

棄用字段

一個很好的例子是已被另一個字段替換的不推薦使用的字段。 假設您有一個錯誤跟蹤系統,其中包含如下所示的文檔:

{_id:1,desc: "IE Rendering broken on intranet site",componentName: "INTRANET",dateCreated: ISODate("2011-09-06T20:52:50.258Z")
}

這是Morphia的定義:

@Entity("issues")
class Issue {@Id private long id;private String desc;private String componentName;private Date dateCreated = new Date();
}

現在想象一下,我們決定取消組件字段,并使其成為更通用的自由文本字段,用戶可以在其中輸入多個組件,版本或其他有用信息。 我們不想僅僅將其放在組件字段中,因為那樣會導致混亂。

值得慶幸的是,我們在Morphia工具包中有專門針對此目的的東西– @AlsoLoad批注。 此批注允許我們用多個可能的來源之一填充POJO字段。 我們只需更新Morphia映射以指示舊字段名稱,就可以輕松刪除對舊字段的引用而不會破壞任何內容。 這樣可以使我們的代碼和文檔保持整潔。

@Entity("issues")
class Issue {@Id private long id;private String desc;@AlsoLoad("componentName") // handle old componentName fieldprivate String affects;private Date dateCreated = new Date();
}

因此,這里我們定義了舊字段的自動翻譯,而無需更新文檔或在POJO類中編寫特殊邏輯以根據創建時間的不同來處理文檔。

一個重要的提示:在這個例子中,如果這兩個領域的影響和舊的組件名稱字段存在,嗎啡會拋出異常,所以不要嘗試使用這種比自嘲領域,或者填充單場有兩個相互排斥的任何其他屬性。

僅支持不贊成使用的字段

另一種可能性是,您只需要在文檔中支持應用程序不再寫的舊字段即可。 這是一個非常簡單的方法:使用@NotSaved批注。 當您在字段上使用它時,數據將被加載,但Morphia不會寫入。

在前面的示例中,我們很容易決定僅支持舊字段的顯示,而不將其填充到情感字段中,因此讓我們對Morphia POJO進行一些更改以顯示如何使用@NotSaved

@Entity("issues")
class Issue {@Id private long id;private String desc;private String affects;@NotSaved("componentName") // load old componentName field for display onlyprivate String componentNameprivate Date dateCreated = new Date();
}

用嵌入式對象替換字段

現在,如果我們的componentName 字段實際上已更改為具有名稱,版本和內部版本號的復雜組件對象? 這有點棘手,因為我們想用多個替換一個字段。 我們不能嘗試從多個來源加載字段,因為它們的結構不同。 當然,我們可以使用嵌入式對象來存儲復雜的組件信息,但是如何使我們的代碼無縫地工作而不用更新我們的文檔呢?

在這種情況下,最簡單的方法是使用三個注釋的組合。 首先,我們將使用@NotSaved批注標記舊字段,并引入一個新的嵌入式組件 ? 對象使用@Embedded注釋 ,最后利用Morphia提供的另一個注釋– @PostLoad 。 這使我們有了一種從MongoDB填充POJO之后執行的方法。

這是示例:

@Entity("issues")
class Issue {@Id private long id;private String desc;private String affects;@NotSaved("componentName") // load old componentName to convert to componentprivate String componentName@Embedded // our new complex Componentprivate Component component;private Date dateCreated = new Date();// getters and setters ...@PostLoadprotected void handleComponent() {if (component == null && componentName != null) {component = new Component(componentName, null, null);}}
}class Component {private String componentName;private Long version;private Long buildNumber;public Component(String componentName, Long version, Long buildNumber) {// ...}// getters and setters ...
}

在這種情況下,我們可以刪除componentName字段的getter和setter,以便我們的映射對象僅公開新的和改進的接口。

結論

通過使用Morphia通過其注釋支持為我們提供的強大工具,我們可以實現以下目標:

  1. 讓我們的文檔結構適應應用程序并保持整潔。
  2. 在我們的Java代碼中無縫處理不斷變化的結構,而無需容易出錯的代碼。
  3. 在支持舊模式的同時僅公開新模式(確實淘汰了舊代碼和字段)。

希望這可以幫助你們中的一些人適應不斷發展的文檔,或者至少對這些Morphia注釋為您提供的功能更加熟悉。

參考: Morphia和MongoDB: Carfey軟件博客上來自我們JCG合作伙伴 Craig Flichel的不斷發展的文檔結構


翻譯自: https://www.javacodegeeks.com/2012/01/morphia-and-mongodb-evolving-document.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/373780.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/373780.shtml
英文地址,請注明出處:http://en.pswp.cn/news/373780.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

angular 點菜_Vue2與Angular5實現無人點餐、無人收銀系統項目實戰視頻教程【組合套餐】(大地)...

Vue2實現無人點餐、無人收銀系統項目實戰視頻教程詳情地址:Angular5實現無人點餐、無人收銀系統項目實戰視頻教程詳情地址:教程介紹:Vue2與Angular5實現無人點餐、無人收銀系統項目實戰視頻教程【組合套餐】是由大地老師傾情錄制的最新Vue2與…

CSDN挑戰編程——《金色十月線上編程比賽第二題:解密》

金色十月線上編程比賽第二題:解密 題目詳情: 小強是一名學生, 同時他也是一個黑客。 考試結束后不久,他驚訝的發現自己的高等數學科目居然掛了,于是他果斷入侵了學校教務部網站。在入侵的過程中,他發現了與成績相關的…

iOS學習心得——UITableViewCell的復用

UITableView是在iOS開發中最常用的控件之一。我的第一篇學習心得獻給它了UITableView是由一行一行的UITableViewCell構成的。首先想這樣一個問題:現在用UITableView去做一個聯系人列表,如果我有10個100個聯系人,那我可以建10個100 個UITab…

Java EE 7的高峰–使用EclipseLink的多租戶示例

水族館是有關所有相關規范和參考實現中有關Java EE進度的靈感和最新信息的重要來源。 他們從Oracle的Shaun Smith( 博客 / twitter )獲得了關于EclipseLink作為開源項目的地位和未來的演講。 他介紹了將在EclipseLink 2.4中提供的所有新功能,…

vscode中如何拉取git代碼_使用VSCode如何從github拉取項目的實現

使用VSCode如何從github拉取項目的實現最近使用vscode進行前端編程,遇到一些問題網上說明的不是很明顯,故記錄一下1.開vscode使用CTRL或者點擊查看到集成終端打開控制終端到此這篇關于使用VSCode如何從github拉取項目的實現的文章就介紹到這了,更多相關V…

matlab求導

在matlab中求導要進行符號運算。 >>syms x; >>y x^cos(x); >>ydot diff(y, x, 1);%對x求一階導數 ydot x^(cos(x) - 1)*cos(x) - x^cos(x)*log(x)*sin(x) >> y2dot diff(y, x, 2)%求二階導數,求n階導數同理。 y2dot cos(x)*(x…

帶有Java和Axis2的JSON Web服務

我最近遇到一位客戶,要求我使用Java Web服務重建其舊產品。 他們希望它模塊化并且易于使用。 我想到的第一件事是使用寧靜的方法。 但是讓我煩惱的是,Java寧靜的方法是使用XML !,我更喜歡一種更簡單的通信方式,易于理解和解析的數…

Kosaraju算法 有向圖的強連通分量

有向圖的強連通分量即,在有向圖G中,如果兩個頂點間至少存在一條路徑,稱兩個頂點強連通(strongly connected)。如果有向圖G的每兩個頂點都強連通,稱G是一個強連通圖。非強連通圖有向圖的極大強連通子圖,稱為強連通分量(…

監管大屏系統_工廠大屏可視化管控系統,智慧工廠平臺是什么,工廠管理大屏軟件 - 帆軟...

智慧工廠大屏可視化管控系統,不但注重顯示數據顯示信息能力,還要兼具監管的作用,配合時代新興的大屏技術,早已成為精益生產工廠的必備產品。本文權威介紹智慧工廠大屏可視化管控系統是什么,以及3款主流軟件&#xff0c…

圖像二維離散傅里葉變換、幅度譜、相位譜

clear, clc I imread(...);F fftshift(fft2(I)); % 對圖像進行二維 DFT(fft2),并移至中心位置 magn log(abs(F)); % 加 log 是便于顯示,縮小值域 phase log(angle(F)*180/pi); % 轉換為度數…

詳解CSS選擇器、優先級與匹配原理

選擇器種類 嚴格來講,選擇器的種類可以分為三種:標簽名選擇器、類選擇器和ID選擇器。而所謂的后代選擇器和群組選擇器只不過是對前三種選擇器的擴展應用。而在標簽內寫入style""的方式,應該是CSS的一種引入方式,而不是選…

關于299$的企業開發者賬號的申請流程

299$的企業開發者賬號 Apple Developer Enterprise Program?一年1988人民幣 - 企業 (Apple Developer Enterprise Program)- 公司應在鄧白氏注冊并擁有有效的 DUNS 號碼。-此計劃使開發者能夠開發針對 Apple 設備的應用程式,并對其員工進行發布&#xf…

keras 多層lstm_tensorflow-如何在keras中堆疊多個lstm?

DanielAdiwardana的答案的詳細說明。我們需要為除最后一層之外的所有LSTM層添加return_sequences True。將此標志設置為True可讓Keras知道LSTM輸出應包含所有歷史生成的輸出以及時間戳(3D)。 因此,下一個LSTM層可以進一步處理數據。如果此標志為假,則LS…

Java堆空間– JRockit和IBM VM

本文將為您提供JRockit Java堆空間與HotSpot VM的概述。 它還將為您提供有關JRockit和HotSpot的Oracle未來計劃的一些背景知識。 Oracle JRockit VM Java堆:2個不同的內存空間 -Java堆(YoungGen和OldGen) -本機內存空間(類池&am…

如何搭建lamp(CentOS7+Apache+MySQL+PHP)環境 [轉]

在網上搜資料,自己在本地虛擬機上嘗試搭建,弄了整整一天一夜,終于弄好了.網上的資料,雖然很多,但大多都是重復的,拿去試了之后,又很多都不能得到正確的結果.最終找到了適合我的linux環境的搭建方式;在這里貼出來:Install Apache, PHP And MySQL On CentOS 7 (LAMP)度娘真不給力…

為什么要用!DOCTYPE聲明

實例&#xff1a; 我們經常會看到類似這樣的代碼&#xff1a; <!DOCTYPE html> <html> <head> <title>文檔的標題</title> </head> <body> 文檔的內容...... </body> </html>注解&#xff1a;可以看到最上面有一行關于“…

java 線程的開始、暫停、繼續

Android項目中的一個需求&#xff1a;通過線程讀取文件內容&#xff0c;并且可以控制線程的開始、暫停、繼續&#xff0c;來控制讀文件。在此記錄下。 直接在主線程中&#xff0c;通過wait、notify、notifyAll去控制讀文件的線程&#xff08;子線程&#xff09;&#xff0c;報錯…

為什么要在Java中使用Unchecked異常而不是Checked異常

關于檢查與未檢查的異常的爭論可以追溯到過去。 有人說這是Java包含的最佳功能之一。 其他人則說這是他們最大的錯誤之一[ 1 ]。 辯論似乎結束了。 在這篇文章中&#xff0c;我將嘗試包含指向該主題的文章和書籍的鏈接。 我不是專家&#xff0c;但是我會盡力向您解釋為什么我得…

batchplot插件用法_Batchplot批量打印怎么用?Batchplot批量打印教程

很多從事CAD設計工作的用戶都碰到過這種情況&#xff1a;在一個單DWG格式的圖紙文件中包含有大量圖紙&#xff0c;如果一張一張選取打印不但費時費力&#xff0c;而且容易遺漏某張圖紙&#xff0c;這時候就需要用到Batchplot插件&#xff0c;這是專門針對單DWG多圖紙的批量打印…

選擇排序和冒泡排序以及折半查找

1.選擇排序 2.冒泡排序 3.折半查找 方式一&#xff1a;開發使用的方法 方式二&#xff1a;普通的折半 轉載于:https://www.cnblogs.com/juncaoit/p/5935068.html