Переход от PHP Propel к Java Hibernate - PullRequest
0 голосов
/ 15 июня 2009

Первый пост здесь ...

Я обычно разрабатываю с использованием PHP и Symfony с Propel и ActionScript 3 (Flex 3), используя службы AMF. В эти выходные я пробую свои силы в создании приложения BlazeDS с использованием Java и Hibernate , и я начинаю очень любить Java !!!

После некоторых исследований в эти выходные и использования плагина Hibernate Synchronizer для Eclipse создание классов, сопоставляемых (извините моя терминология) с таблицами, кажется довольно простым, я быстро приближаюсь к пониманию этих аспектов. *

Однако я хочу знать, как разработать более полную архитектуру для моей базы данных, в частности, с точки зрения запросов, их результатов и их итерации. Позвольте мне прояснить:

Если у меня есть, например, таблица авторы , я буду создавать класс Author , который сопоставляется с таблицей, с геттерами и сеттерами и т. Д. Эта часть выглядит довольно стандартной с точки зрения Hibernate.

Более того, мне, вероятно, понадобится класс Peer (как в Propel for PHP), например, для выполнения запросов, которые будут возвращать списки / массивы, содержащие экземпляры Author.

Итак, я бы имел (говоря в исправлении) следующие классы:

Автор - представляет один ряд с геттерами и сеттерами.

AuthorsPeer - имеет, например, такие функции, как AuthorsPeer :: getAuthorsByCountry ('USA'); или - AuthorsPeer :: getRetiredAuthors (); или AuthorsPeer :: getAuthorsWithSwineFlu (); - ... получить картину. :) - которые возвращают AuthorsList в качестве результата ... см. следующий пункт.

AuthorsList - коллекция / список Author с функциями для итерации getNext () , getPrevious () и т. д.

Это так, как должно быть в Hibernate, или я скучаю по сюжету? Заметил ли я здесь «Шаблон проектирования» и не заметил его? Нужно ли иметь что-то вроде AuthorsList или Hibernate предоставляет универсальное решение? В общем, что является нормой при работе с этими аспектами.

Кроме того, если у меня есть таблица книг, они связаны с авторами, если я позвоню сказать Author myAuthor = Авторы :: getAuthor (primaryId, includeBooks); может ли Hibernate иметь дело с возвращением мне результата, который я могу использовать следующим образом: String title = myAuthor.books [0] .title;

Я спрашиваю, приводят ли запросы к авторам, относящимся к таблице книг, Hibernate, возвращающий авторов с их книгами, вложенными в «объект-значение» авторов, готовый для меня, чтобы наброситься с некоторой итерацией?

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 15 июня 2009

Ответ на большинство ваших вопросов - да. На самом деле вам стоит изучить, как отобразить отношения один-ко-многим в Hibernate. В вашем случае автор - это «один», а книги - множество. Ассоциативные отображения описаны там. Если вы используете аннотации с Hibernate (что я настоятельно рекомендую использовать для XML-файлов), вы можете узнать, как сделать ассоциации с аннотациями здесь .

Самое замечательное в спящем режиме - то, что вам не нужно много делать для управления отношениями. Ниже приведен фрагмент кода того, что вам понадобится для ваших отношений Автор-Книга.

@Entity public class Author {
    @OneToMany(mappedBy="author")
    public List<Book> getBooks() {
        return books;
    }
...
}

@Entity public class Book {
    public String getName() {
        return bookName;
    }

    @ManyToOne
    public Author getAuthor() {
        return author;
    }
    ...
}

Чтобы получить авторов из таблицы, вы должны использовать Criteria API или HQL . Я предпочитаю Criteria API, потому что он соответствует общему ощущению программирования на Java (в отличие от HQL). Но ваши предпочтения могут отличаться.


Примечание: вы не должны создавать класс AuthorsList. Java-дженерики делают всю работу за вас:

List<Author> myAuthors = new ArrayList<Author>();

//iterate like so
for(Author author: myAuthors) {
   //do something with current author
}

//or just grab 1
Author firstAuthor = myAuthors.get(0);

Java обрабатывает проверки времени компиляции для типов, поэтому вам не нужно.

0 голосов
/ 15 июня 2009

В основном ответ - да, вроде. :) Если вы выбираете одного автора и затем получаете доступ к коллекции книг, Hibernate будет лениво загружать данные для вас. На самом деле это не самый эффективный способ сделать это, но это удобно для программиста. В идеале вы хотите использовать что-то вроде HQL (Hibernate Query Language) или его Criteria API для выполнения запроса и «нетерпеливого извлечения» коллекции книг, чтобы все данные можно было загрузить одним SQL-запросом.

http://docs.jboss.org/hibernate/stable/core/reference/en/html/queryhql.html

В противном случае, если вы обращаетесь к автору, у которого есть 500 книг, связанных с ним, Hibernate может выполнить 500 + 1 SQL-запросов к базе данных, что, конечно, невероятно медленно. Если вы хотите узнать больше об этом, вы можете Google "n + 1 выбирает проблему", как это обычно называют.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...