假设我有两个领域模型Author和Book。因此,作者可以拥有一本书或多本书。

从锡耶纳(Siena)的文档来看,似乎建议如下:

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.books.add(book1);
author.books.add(book2);
author.insert();

但这在文档Siena中似乎不正确

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

最佳答案

请记住,Siena基于NoSQL概念,因此没有像SQL那样的联接。
无论如何,您可以自然地设计一个一对多的关系。

在传统的Siena中,您将使用自动查询来编写如下代码:

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网上论坛中提问,如果可以的话,我们会为您提供帮助。

关于java - 如何在Siena和GAE中定义一对多关系?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8275788/

10-09 00:32