2011-03-28 29 views
2

假設,可以說我有一個名爲Person的域對象。它看起來像這樣:使用Morphia堅持域對象而不添加不必要的註釋到域對象的策略?

public class Member { 

    private final String firstName; 
    private final String lastName; 
    private final String email; 
    private final String password; 

    public Member(String firstName, String lastName, String email, String password) { 
     this.firstName = firstName; 
     this.lastName = lastName; 
     this.email = email; 
     this.password = password; 
    } 

    public String getFirstName() { 
     return firstName; 
    } 

    public String getLastName() { 
     return lastName; 
    } 

    public String getEmail() { 
     return email; 
    } 

    public String getPassword() { 
     return password; 
    } 
} 

我也有一個MemberRepository接口,它定義了基本的CRUD和一些其他的含糖方法。

現在讓我們說我想在使用Morphia的MongoDB實例中堅持這個域對象。我創建了我的MorphiaMemberRepository實現,但我不確定的是如何儘可能地保存域對象。

任何Morphia用戶都知道我需要創建一個類型爲ObjectId的ID字段並用@Id對其進行註釋。此外,我需要用@Entity("members")註釋該課程。我不一定要用Morphia/MongoDB特定的註釋來混亂我的漂亮域對象。

所以...同行堆垛機,我該怎麼做才能保持這個實現儘可能乾淨?

回答

0

假設有IMember等Member implements IMember。 Getter方法在IMember中定義。

另一個類MorphiaMember implements IMember被註釋爲必要的並且具有ID字段(id不總是ObjectId)。 每個類都有一個工廠方法

public static Member from(IMember mi) { ... } 

所以典型的工作流將是:

MemberRepository repo = ... 
Member m = Member.from(repo.get(some_id)) 
... 
Member m2 = ... 
repo.save(MorphiaMember.from(m)) 
1

這是Morphia的要求(至少是@Id之一)。註釋不需要改變您使用對象或序列化的方式。它們只是大多數程序忽略的額外元數據;它們是無害的。

如果你有一個獨特的領域,那麼你不需要添加任何新的領域,只需用@Id標記並完成它。

如果你真的不想做任何這樣的事情,你可以在morphia中手動創建元數據來處理你的類,但是這樣會更加方便,因爲這個過程不會通過任何外部配置格式公開。