日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

ogm session_带有Hibernate OGM的NoSQL –第一部分:持久化您的第一个实体

發(fā)布時間:2023/12/3 数据库 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ogm session_带有Hibernate OGM的NoSQL –第一部分:持久化您的第一个实体 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

ogm session

Hibernate OGM的第一個最終版本已經(jīng)發(fā)布 ,團(tuán)隊從發(fā)布狂潮中恢復(fù)了一些。 因此,他們考慮開設(shè)一系列教程風(fēng)格的博客,使您有機(jī)會輕松地從Hibernate OGM重新開始。 感謝Gunnar Morling( @gunnarmorling )創(chuàng)建了本教程。

介紹

不知道什么是Hibernate OGM? Hibernate OGM是Hibernate下的最新項目,它允許您通過著名的JPA將實體模型持久保存在不同的NoSQL存儲中。

我們將在接下來的幾周內(nèi)介紹這些主題:

  • 堅持您的第一個實體(此批次)
  • 查詢數(shù)據(jù)
  • 在WildFly上運行
  • 在Java SE上使用CDI運行
  • 將數(shù)據(jù)存儲到同一應(yīng)用程序中的兩個不同存儲中

如果您希望我們討論任何其他主題,請告訴我們。 只需在下面添加評論或向我們發(fā)送您的建議 。

在本系列的第一部分中,我們將建立一個具有所需依賴項的Java項目,創(chuàng)建一些簡單實體,然后將它們寫入商店或從商店中讀取。 我們將從Neo4j圖形數(shù)據(jù)庫開始 ,然后僅需進(jìn)行少量配置更改就切換到MongoDB文檔存儲 。

項目設(shè)置

首先讓我們創(chuàng)建一個具有所需依賴項的新Java項目。 接下來,我們將使用Maven作為構(gòu)建工具,但是Gradle或其他工具當(dāng)然也可以很好地工作。

將此添加到pom.xml的dependencyManagement塊中:

... <dependencyManagement><dependencies>...<dependency><groupId>org.hibernate.ogm</groupId><artifactId>hibernate-ogm-bom</artifactId><type>pom</type><version>4.1.1.Final</version><scope>import</scope></dependency>...</dependencies> </dependencyManagement> ...

這將確保您使用的是匹配版本的Hibernate OGM模塊及其依賴項。 然后將以下內(nèi)容添加到dependencies塊:

... <dependencies>...<dependency><groupId>org.hibernate.ogm</groupId><artifactId>hibernate-ogm-neo4j</artifactId></dependency><dependency><groupId>org.jboss.jbossts</groupId><artifactId>jbossjta</artifactId></dependency>... </dependencies> ...

依賴項是:

  • Hibernate OGM模塊,用于處理嵌入式Neo4j數(shù)據(jù)庫; 這將引入所有其他必需的模塊,例如Hibernate OGM內(nèi)核和Neo4j驅(qū)動程序。 使用MongoDB時,可以將其與hibernate-ogm-mongodb交換。
  • JBoss對Java Transaction API(JTA)的實現(xiàn),當(dāng)不在WildFly之類的Java EE容器中運行時需要此實現(xiàn)

領(lǐng)域模型

我們的示例域模型由三個類組成: Hike , HikeSection和Person 。

之間存在組合關(guān)系Hike和HikeSection ,即上調(diào)包括幾個部分,其生命周期是完全依賴于遠(yuǎn)足。 遠(yuǎn)足部分列表已訂購; 堅持遠(yuǎn)足及其部分時,必須保持此順序。

Hike與Person (充當(dāng)遠(yuǎn)足組織者)之間的關(guān)聯(lián)是雙向的多對一/一對多關(guān)系:一個人可以組織零個或多個遠(yuǎn)足,而一個遠(yuǎn)足恰好有一個人充當(dāng)組織者。

映射實體

現(xiàn)在,通過創(chuàng)建實體類并用所需的元數(shù)據(jù)注釋它們來映射域模型。 讓我們從Person類開始:

@Entity public class Person {@Id@GeneratedValue(generator = "uuid")@GenericGenerator(name = "uuid", strategy = "uuid2")private long id;private String firstName;private String lastName;@OneToMany(mappedBy = "organizer", cascade = CascadeType.PERSIST)private Set<Hike> organizedHikes = new HashSet<>();// constructors, getters and setters... }

實體類型使用@Entity注釋進(jìn)行標(biāo)記,而表示標(biāo)識符的屬性則使用@Id注釋。

Hibernate OGM無需手動分配ID,而是可以解決此問題,它提供了幾種ID生成策略,例如(模擬)序列,UUID等。 通常,使用UUID生成器是一個不錯的選擇,因為它可以確保跨不同NoSQL數(shù)據(jù)存儲的可移植性,并使ID生成快速且可擴(kuò)展。 但是根據(jù)您使用的商店,在MongoDB的情況下,您也可以使用特定的ID類型,例如對象ID(有關(guān)詳細(xì)信息,請參閱參考指南 )。

最后, @OneToMany將organizedHikes屬性標(biāo)記為實體之間的關(guān)聯(lián)。 由于它是雙向?qū)嶓w,因此必須使用mappedBy屬性來指定負(fù)責(zé)管理它的關(guān)聯(lián)方。 指定級聯(lián)類型PERSIST可確保堅持一個人也將自動導(dǎo)致其關(guān)聯(lián)的遠(yuǎn)足也被堅持。

接下來是Hike類:

@Entity public class Hike {@Id@GeneratedValue(generator = "uuid")@GenericGenerator(name = "uuid", strategy = "uuid2")private String id;private String description;private Date date;private BigDecimal difficulty;@ManyToOneprivate Person organizer;@ElementCollection@OrderColumn(name = "sectionNo")private List<HikeSection> sections;// constructors, getters and setters... }

在這里, @ManyToOne注釋標(biāo)記了Hike和Organizer之間的雙向關(guān)聯(lián)的另一面。 由于HikeSection應(yīng)該依賴于Hike,因此部分列表通過@ElementCollection映射。 為了確保在數(shù)據(jù)存儲區(qū)中保持節(jié)的順序, @OrderColumn使用@OrderColumn 。 這將在保留的記錄中添加一個額外的“列”,其中包含每個部分的訂單號。

最后, HikeSection類:

@Embeddable public class HikeSection {private String start;private String end;// constructors, getters and setters... }

與Person和Hike不同,它不是通過@Entity而是使用@Embeddable映射的。 這意味著它始終是另一個實體(在本例中為Hike )的一部分,因此本身也沒有身份。 因此,它不會聲明任何@Id屬性。

請注意,如果您將Hibernate ORM與關(guān)系數(shù)據(jù)存儲一起使用,則這些映射看起來完全相同。 的確,這就是Hibernate OGM的承諾之一:盡可能簡化關(guān)系和NoSQL范例之間的遷移!

創(chuàng)建persistence.xml

有了實體類之后,JPA的persistence.xml描述符又丟失了一件事。 在src / main / resources / META-INF / persistence.xml下創(chuàng)建它:

<?xml version="1.0" encoding="utf-8"?><persistence xmlns="http://java.sun.com/xml/ns/persistence"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"version="2.0"><persistence-unit name="hikePu" transaction-type="RESOURCE_LOCAL"><provider>org.hibernate.ogm.jpa.HibernateOgmPersistence</provider><properties><property name="hibernate.ogm.datastore.provider" value="neo4j_embedded" /><property name="hibernate.ogm.datastore.database" value="HikeDB" /><property name="hibernate.ogm.neo4j.database_path" value="target/test_data_dir" /></properties></persistence-unit> </persistence>

如果您以前使用過JPA,那么對您來說,這個持久性單元定義應(yīng)該看起來非常熟悉。 與在關(guān)系數(shù)據(jù)庫之上使用經(jīng)典Hibernate ORM的主要區(qū)別在于,我們需要為Hibernate OGM指定特定的提供程序類: org.hibernate.ogm.jpa.HibernateOgmPersistence 。

此外,還定義了一些特定于Hibernate OGM和所選后端的屬性來設(shè)置:

  • 使用的后端(在這種情況下為嵌入式Neo4j圖形數(shù)據(jù)庫)
  • Neo4j數(shù)據(jù)庫的名稱
  • 存儲Neo4j數(shù)據(jù)庫文件的目錄

根據(jù)您的用法和后端,可能需要其他屬性,例如,設(shè)置主機(jī),用戶名,密碼等。您可以在名為<BACK END>Properties的類中找到所有可用的<BACK END>Properties ,例如Neo4jProperties , MongoDBProperties等。 。

保存和加載實體

所有這些位都準(zhǔn)備就緒后,就可以保留(并加載)某些實體了。 為此創(chuàng)建一個簡單的JUnit測試外殼:

public class HikeTest {private static EntityManagerFactory entityManagerFactory;@BeforeClasspublic static void setUpEntityManagerFactory() {entityManagerFactory = Persistence.createEntityManagerFactory( "hikePu" );}@AfterClasspublic static void closeEntityManagerFactory() {entityManagerFactory.close();} }

這兩種方法為persistence.xml中定義的持久性單元管理實體管理器工廠。 它保存在一個字段中,因此可以用于多種測試方法(請記住,實體管理器工廠的創(chuàng)建成本相當(dāng)高,因此應(yīng)將它們初始化一次并保留以備重用)。

然后創(chuàng)建一個持久保存并加載一些數(shù)據(jù)的測試方法:

@Test public void canPersistAndLoadPersonAndHikes() {EntityManager entityManager = entityManagerFactory.createEntityManager();entityManager.getTransaction().begin();// create a PersonPerson bob = new Person( "Bob", "McRobb" );// and two hikesHike cornwall = new Hike("Visiting Land's End", new Date(), new BigDecimal( "5.5" ),new HikeSection( "Penzance", "Mousehole" ),new HikeSection( "Mousehole", "St. Levan" ),new HikeSection( "St. Levan", "Land's End" ));Hike isleOfWight = new Hike("Exploring Carisbrooke Castle", new Date(), new BigDecimal( "7.5" ),new HikeSection( "Freshwater", "Calbourne" ),new HikeSection( "Calbourne", "Carisbrooke Castle" ));// let Bob organize the two hikescornwall.setOrganizer( bob );bob.getOrganizedHikes().add( cornwall );isleOfWight.setOrganizer( bob );bob.getOrganizedHikes().add( isleOfWight );// persist organizer (will be cascaded to hikes)entityManager.persist( bob );entityManager.getTransaction().commit();// get a new EM to make sure data is actually retrieved from the store and not Hibernate's internal cacheentityManager.close();entityManager = entityManagerFactory.createEntityManager();// load it backentityManager.getTransaction().begin();Person loadedPerson = entityManager.find( Person.class, bob.getId() );assertThat( loadedPerson ).isNotNull();assertThat( loadedPerson.getFirstName() ).isEqualTo( "Bob" );assertThat( loadedPerson.getOrganizedHikes() ).onProperty( "description" ).containsOnly( "Visiting Land's End", "Exploring Carisbrooke Castle" );entityManager.getTransaction().commit();entityManager.close(); }

注意這兩個動作是如何在事務(wù)中發(fā)生的。 Neo4j是一個完全事務(wù)性的數(shù)據(jù)存儲庫,可以通過JPA的事務(wù)處理API很好地控制它。 在實際的應(yīng)用程序中,可能會使用一種較為冗長的方法來進(jìn)行事務(wù)控制。 根據(jù)所選的后端和應(yīng)用程序運行的環(huán)境類型(例如Java EE容器,例如WildFly ),您可以利用通過CDI或EJB進(jìn)行的聲明式事務(wù)管理。 但是,讓我們再保存一次。

保留了一些數(shù)據(jù)之后,您可以使用Neo4j隨附的漂亮的Web控制臺對其進(jìn)行檢查。 下面顯示了測試保留的實體:

Hibernate OGM旨在為您要定位的數(shù)據(jù)存儲提供最自然的映射。 對于Neo4j作為圖形數(shù)據(jù)存儲的情況,這意味著任何實體都將映射到相應(yīng)的節(jié)點。

實體屬性被映射為節(jié)點屬性(請參見描述黑名單節(jié)點之一的黑框)。 任何不受本機(jī)支持的屬性類型都將根據(jù)需要進(jìn)行轉(zhuǎn)換。 例如, date屬性就是這種情況,它作為ISO格式的字符串保留。 此外,每個實體節(jié)點都有標(biāo)簽 ENTITY(以將其與其他類型的節(jié)點區(qū)分開)和指定其實體類型的標(biāo)簽(在這種情況下為遠(yuǎn)足)。

關(guān)聯(lián)被映射為節(jié)點之間的關(guān)系,關(guān)聯(lián)角色被映射為關(guān)系類型 。

請注意,Neo4j沒有嵌入式對象的概念。 因此, HikeSection對象被映射為帶有標(biāo)簽EMBEDDED的節(jié)點,并與擁有的Hike節(jié)點鏈接。 節(jié)的順序通過關(guān)系上的屬性保留。

切換到MongoDB

Hibernate OGM的承諾之一是允許使用相同的API(即JPA)與不同的NoSQL存儲一起使用。 因此,讓我們看一下它如何保存和利用MongoDB,它與Neo4j不同,它是一個文檔數(shù)據(jù)存儲區(qū),并以類似JSON的表示形式保留數(shù)據(jù)。 為此,請首先將Neo4j后端替換為以下內(nèi)容:

... <dependency><groupId>org.hibernate.ogm</groupId><artifactId>hibernate-ogm-mongodb</artifactId> </dependency> ...

然后使用可通過以下方式訪問的屬性更新persistence.xml中的配置,以將MongoDB作為后端使用
提供與您的環(huán)境匹配的主機(jī)名和憑據(jù)的MongoDBProperties (如果尚未安裝MongoDB,則可以在此處下載):

... <properties><property name="hibernate.ogm.datastore.provider" value="mongodb" /><property name="hibernate.ogm.datastore.database" value="HikeDB" /><property name="hibernate.ogm.datastore.host" value="mongodb.mycompany.com" /><property name="hibernate.ogm.datastore.username" value="db_user" /><property name="hibernate.ogm.datastore.password" value="top_secret!" /> </properties> ...

這就是將實體保留在MongoDB中而不是Neo4j中所需要做的全部工作。 如果現(xiàn)在再次運行測試,您將在數(shù)據(jù)存儲區(qū)中找到以下BSON文檔:

# Collection "Person" {"_id" : "50b62f9b-874f-4513-85aa-c2f59015a9d0","firstName" : "Bob","lastName" : "McRobb","organizedHikes" : ["a78d731f-eff0-41f5-88d6-951f0206ee67","32384eb4-717a-43dc-8c58-9aa4c4e505d1"] }# Collection Hike {"_id" : "a78d731f-eff0-41f5-88d6-951f0206ee67","date" : ISODate("2015-01-16T11:59:48.928Z"),"description" : "Visiting Land's End","difficulty" : "5.5","organizer_id" : "50b62f9b-874f-4513-85aa-c2f59015a9d0","sections" : [{"sectionNo" : 0,"start" : "Penzance","end" : "Mousehole"},{"sectionNo" : 1,"start" : "Mousehole","end" : "St. Levan"},{"sectionNo" : 2,"start" : "St. Levan","end" : "Land's End"}] } {"_id" : "32384eb4-717a-43dc-8c58-9aa4c4e505d1","date" : ISODate("2015-01-16T11:59:48.928Z"),"description" : "Exploring Carisbrooke Castle","difficulty" : "7.5","organizer_id" : "50b62f9b-874f-4513-85aa-c2f59015a9d0","sections" : [{"sectionNo" : 1,"start" : "Calbourne","end" : "Carisbrooke Castle"},{"sectionNo" : 0,"start" : "Freshwater","end" : "Calbourne"}] }

同樣,映射是非常自然的,就像使用MongoDB這樣的文檔存儲時所期望的那樣。 通過將參考ID存儲在任意一側(cè),可以映射Person和Hike之間的雙向一對多/多對一關(guān)聯(lián)。 當(dāng)加載回數(shù)據(jù)時,Hibernate OGM將解析ID,并允許將關(guān)聯(lián)從一個對象導(dǎo)航到另一個對象。

元素集合使用MongoDB存儲分層結(jié)構(gòu)的功能進(jìn)行映射。 在此,加息的各個部分映射到擁有加息的文檔中的數(shù)組,并帶有附加的字段sectionNo來維護(hù)收集順序。 這樣可以通過一次往返數(shù)據(jù)存儲的方式非常有效地加載實體及其嵌入式元素。

結(jié)語

在帶有Hibernate OGM 101的NoSQL的第一部分中,您學(xué)習(xí)了如何設(shè)置具有所需依賴項的項目,映射某些實體和關(guān)聯(lián)并將其持久化在Neo4j和MongoDB中。 所有這些都是通過眾所周知的JPA API進(jìn)行的。 因此,如果您過去在關(guān)系數(shù)據(jù)庫之上使用過Hibernate ORM和JPA,那么深入NoSQL領(lǐng)域?qū)⒆兊卯惓:唵巍?

同時,每個商店都針對某些用例,因此提供了特定的功能和配置選項。 自然,這些不能通過通用API(例如JPA)公開。 因此,Hibernate OGM允許您使用本機(jī)NoSQL查詢,并允許通過其靈活的選項系統(tǒng)配置商店特定的設(shè)置。

您可以在GitHub上找到此博客文章的完整示例代碼 。 只需叉子,然后隨心所欲地玩就可以了。

當(dāng)然,存儲實體并通過其ID取回實體僅僅是開始。 在任何實際的應(yīng)用程序中,您都希望對數(shù)據(jù)運行查詢,并且還可能希望利用所選NoSQL存儲庫的某些特定功能和設(shè)置。 我們將在本系列的下一部分中談到這一點,請繼續(xù)關(guān)注!

翻譯自: https://www.javacodegeeks.com/2015/01/nosql-with-hibernate-ogm-part-one-persisting-your-first-entities.html

ogm session

總結(jié)

以上是生活随笔為你收集整理的ogm session_带有Hibernate OGM的NoSQL –第一部分:持久化您的第一个实体的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。