springdata jpa mongodb對映
springdata簡介:
Spring Data採用類物件的方式將O/R對映的支援延伸到了NoSQL資料庫。但在各種NoSQL資料庫中, 資料結構差異較大, 所以很難形成一種通用的API。 每一種資料儲存都有各自一套註釋用以標註對映所需要的元資訊。
JPA | MongoDB | Neo4j |
---|---|---|
@Entity @Table(name="TUSR") public class User { @Id private String id; @Column(name="fn") private String name; private Date lastLogin; ... } | @Document(collection="usr") public class User { @Id private String id; @Field("fn") private String name; private Date lastLogin; .. } |
@NodeEntity public class User { @GraphId Long id; private String name; private Date lastLogin; ... } |
如果你已經熟悉JPA實體,不難看出這裡用了標準的JPA註釋。Spring Data複用了這些標準的註釋, 而且沒有引入其他新的內容。物件的對映正是由這些JPA的實現完成的。 MangoDB和Neo4j各種需要一套類似的註釋。在上面的例子中, 我們使用了類級別的註釋collection和nodetype. MangoDB中, collection就相當於關係型資料庫的表, 而node和edge則是圖形資料庫(如Neo4j)的主要資料型別。
每個JPA實體都需要有唯一識別符號,即便是MongoDB的文件和Neo4j的節點也是如此。
MongoDB使用@Id這個註釋作為唯一識別符號(這@Id是在org.springframework.data.annotation包中, 和JPA的@Id並不相同)。Neo4j則使用了@GraphId這個註釋。這些屬性的值是在域物件成功儲存後被設定的。 當類屬性的名稱和MongoDB的文件中的屬性名稱不同時, 可以使用@Field註釋標註。
同樣這兩種對映也支援對其他物件的引用,請看下面的例子:
JPA | MongoDB | Neo4j |
---|---|---|
@OneToMany private List<Role> roles; | private List<Role> roles; | @RelatedTo( type = "has", direction = Direction.OUTGOING) private List<Role> roles; |
在JPA中, 我們使用@OneToMany來標識一對多的關係, 通常多的一端的資料存放在子表中, 通過聯合查詢獲得。MongoDB並不支援文件間的聯合查詢,預設情況下, 被引用的物件和主物件儲存在同一個文件中。當然, 我們也可以通過客戶端的虛擬聯合查詢引用其他文件的資料。在Neo4j中, 關係被稱作edges, 而edge也是一個基本的資料型別。
總結來說, MongoDB和Neo4j所使用的物件對映和我們大家所熟悉的JPA O/R對映非常類似, 但由於不同的資料結構,兩者存在著顯著的區別。但不管怎麼說, 基本概念都是實現物件和資料結構的對映。