Как определить отношение один ко многим в Сиене и GAE? - PullRequest
1 голос
/ 26 ноября 2011

Предположим, у меня есть две модели предметной области: Автор и Книга.Таким образом, у Автора может быть одна или несколько книг.

Из документации по Сиене, кажется, предлагается что-то вроде:

public class Author extends Model {

    @Id
    public Long id;

        public String name;


    public Book book;
}

Но я ожидал что-то вроде:

Открытый класс Author расширяет Модель {

    @Id
    public Long id;

    public String name;

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

Так что в моем коде я могу сделать что-то вроде:

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

Автор author = new Author ();author.books.add (Книга1);author.books.add (book2);author.insert ();

Но это не кажется правильным из документации Сиена

Вопрос в том, что является правильным решением?

1 Ответ

2 голосов
/ 28 ноября 2011

Помните, что 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();

И этот синтаксис имеет большое преимущество при создании автора с книгой

Author author = new Author("name");
author.books.add(new Book("title1"), new Book("title2"), new Book("title3"));
author.insert();

вставляет автора и книги, связанные с автором (но если вы удалите автора, он не удалит книги, поскольку siena не управляет таким каскадом и позволяет вам это делать).

Вы можете прочитать документ здесь и задать вопросы в группе Google siena, мы поможем вам, если сможем.

...