首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Siena和GAE中定义一对多关系?

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

Stack Overflow用户
提问于 2011-11-26 10:08:17
回答 1查看 516关注 0票数 1

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

从锡耶纳的文档中,它似乎建议这样的内容:

代码语言:javascript
复制
public class Author extends Model {

    @Id
    public Long id;

        public String name;


    public Book book;
}

但我希望是这样的:

公共类作者扩展了模型{

代码语言:javascript
复制
    @Id
    public Long id;

    public String name;

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

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

book1 =新书(),boo2 =新书();

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

但从文档Siena来看,这似乎并不正确

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

EN

回答 1

Stack Overflow用户

发布于 2011-11-28 06:22:10

请记住,锡耶纳是基于NoSQL概念的,所以没有像SQL中那样的连接。无论如何,您可以很自然地设计一个one2many关系。

在传统的锡耶纳,你可以这样写,使用一个自动查询:

代码语言:javascript
复制
class Author {
...
 @Filter("author")
 public Query<Book> books; // this is called an "automatic-query"
...
}

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

然后你会像这样得到它的书:

代码语言:javascript
复制
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

代码语言:javascript
复制
class Author {
...
   public Many<Book> books; // this is called an "automatic-query"
...
}

然后,您可以以列表或查询的形式访问图书:

代码语言:javascript
复制
List<Book> theBooks = books.asList();
List<Book> theFilteredBooks = books.asQuery().filter("...", "...").fetch();

当您使用book创建author时,这种语法有一个很大的优势

代码语言:javascript
复制
Author author = new Author("name");
author.books.add(new Book("title1"), new Book("title2"), new Book("title3"));
author.insert();

它插入作者和与该作者相关联的书籍(但如果删除作者,它不会删除书籍,因为siena不会管理这种级联,而是让您这样做)。

你可以在这里阅读之前的文档,并在锡耶纳谷歌小组上提出问题,我们将尽我们所能帮助你。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8275788

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档