2011-11-26 59 views
1

假設我有兩個領域模型作者和書。所以作者可以有一本或多本書。如何在Siena和GAE中定義一對多關係?

從錫耶納的文檔,它似乎暗示是這樣的:

public class Author extends Model { 

    @Id 
    public Long id; 

     public String name; 


    public Book book; 
} 

但是我期待是這樣的:

公共類作者擴展模式{

@Id 
    public Long id; 

    public String name; 

    public List<Books> books = new ArrayList<Book>(); 
} 

所以在我的代碼我可以這樣做:

Book book1 = new Book(), boo2 = new Book();

作者author = new Author(); author.books.add(book1); author.books.add(book2); author.insert();

但這似乎從文檔Siena

的問題是什麼是正確的解決方案不正確的?

回答

2

請記住,錫耶納是基於NoSQL的概念,所以沒有像SQL一樣的連接。無論如何,你可以自然地設計一個二維關係。

在傳統的錫耶納,你會寫它像使用自動查詢:

class Author { 
... 
@Filter("author") 
public Query<Book> books; // this is called an "automatic-query" 
... 
} 

class Book { 
... 
    Author author; 
... 
} 

然後你會得到它的書那樣:

List<Book> booksBlabla = author.books.filter("your_field", "blabla").fetch(); 

當您使用GAE,有使用許多新的直觀的語法記載有: https://github.com/mandubian/siena/blob/master/source/documentation/manuals/relation_syntax_many.textile

class Author { 
... 
    public Many<Book> books; // this is called an "automatic-query" 
... 
} 

然後,您可以訪問圖書列表或作爲查詢:

List<Book> theBooks = books.asList(); 
List<Book> theFilteredBooks = books.asQuery().filter("...", "...").fetch(); 

而且還有一個很大的優勢,這句法當您創建作者與書

Author author = new Author("name"); 
author.books.add(new Book("title1"), new Book("title2"), new Book("title3")); 
author.insert(); 

它插入作者以及與作者相關的書籍(但是如果您刪除了作者,它不會刪除這些書籍,因爲siena不管理這樣的級聯並讓您執行此操作)。

您可以在此處閱讀文檔,並針對siena google小組提出問題,如果可以的話,我們會爲您提供幫助。

相關問題