如何在Siena和GAE中定义一对多关系



假设我有两个域模型Author和Book。所以作者可以有一本或多本书。

从Siena的文档来看,它似乎建议如下:

public class Author extends Model {
    @Id
    public Long id;
        public String name;

    public Book book;
}

但我期待的是这样的:

公共类Author extends Model {

    @Id
    public Long id;
    public String name;
    public List<Books> books = new ArrayList<Book>();
}

在我的代码中,我可以这样做:

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

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

author.insert ();

但是从文档Siena

来看,这似乎是不对的

问题是正确的解决方案是什么?

请记住Siena是基于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();

当你用book

创建author时这种语法有很大的优势
Author author = new Author("name");
author.books.add(new Book("title1"), new Book("title2"), new Book("title3"));
author.insert();

插入作者和与作者关联的图书(但是如果您删除作者,它不会删除图书,因为Siena不管理这种级联,并且允许您这样做)。

您可以在此之前阅读文档并在锡耶纳谷歌群中提问,如果可以,我们会帮助您的。

相关内容

  • 没有找到相关文章

最新更新