假设我有两个域模型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不管理这种级联,并且允许您这样做)。
您可以在此之前阅读文档并在锡耶纳谷歌群中提问,如果可以,我们会帮助您的。