Как определить отношение один ко многим в Сиене и GAE?

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

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

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 = новая книга (), boo2 = новая книга ();

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

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

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

1 ответ

Помните, что 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, мы поможем вам, если сможем.

Другие вопросы по тегам