如何在锡耶纳和GAE中定义一对多的关系?

时间:2011-11-26 02:08:17

标签: java google-app-engine siena

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

从锡耶纳的文档中,似乎有类似的建议:

public class Author extends Model {

    @Id
    public Long id;

        public String name;


    public Book book;
}

但我期待的是:

public class 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 = new作者(); author.books.add(BOOK1); author.books.add(第二册); author.insert();

但是文档Siena

似乎没有

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

1 个答案:

答案 0 :(得分:2)

请记住,Siena基于NoSQL概念,因此没有SQL中的连接。 无论如何,你可以自然地设计一个one2many关系。

在传统的锡耶纳,您可以使用自动查询编写它:

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 = new Author("name");
author.books.add(new Book("title1"), new Book("title2"), new Book("title3"));
author.insert();

它会插入与作者相关的作者和书籍(但如果您删除作者,则不会删除书籍,因为siena不管理此类级联并允许您这样做。)

您之前可以阅读此处的文档,并在siena google网上提问,如果可以的话,我们会帮助您。