1. 程式人生 > >springdata jpa mongodb對映

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對映非常類似, 但由於不同的資料結構,兩者存在著顯著的區別。但不管怎麼說, 基本概念都是實現物件和資料結構的對映。