Как определить отношение один ко многим в Сиене и 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, мы поможем вам, если сможем.