powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Повторное использование кода в Hibernate
23 сообщений из 23, страница 1 из 1
Повторное использование кода в Hibernate
    #37712096
Йуный джавистЪ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Допустим, мы пишем блогхостинг. Есть таблица юзеров и таблица постов.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
class User{
  String name;
  List<Post> posts;
}

class Post{
  User user;
  String text;
  int viewcount;
  Date date;
}



Пост называется топовым, если viewcount>10000.

Как мне с использованием хибернейта реализовать такую функциональность:
1)Проверить, если ли у данного пользователя хотя бы один топовый пост.
2)Получить список 10 последних (по дате) топовых постов.
...
Рейтинг: 0 / 0
Повторное использование кода в Hibernate
    #37712106
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Йуный джавистЪ,
это провокация?
Покажи как пытался решить?
...
Рейтинг: 0 / 0
Повторное использование кода в Hibernate
    #37712109
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Йуный джавистЪ1)Проверить, если ли у данного пользователя хотя бы один топовый пост.
2)Получить список 10 последних (по дате) топовых постов.
А какие сложности? Хоть на HQL, хоть на Criteria API. Если вы себе SQL запросы представляете, то конвертировать их очень просто.
Единственное что order by для огромной выбороки данных, штука стремная.
...
Рейтинг: 0 / 0
Повторное использование кода в Hibernate
    #37712169
Йуный джавистЪ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А какие сложности?

Сложность в повторном использовании. Фаулер рекомендует rich domain model. В Rich domain model надо писать так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
class Post{
  User user;
  String text;
  int viewcount;
  Date date;
  boolean idTop(){
    return viewcount > 10000;
  }
}


Но если я так сделаю, я потом не смогу переиспользовать логику, реализованную в методе isTop в sql запросах. Поэтому мне придется копипастить "viewcount > 10000" в каждый sql запрос. Потом, если вдруг критерии топовости поста поменяются, мне придется бегать по всему проекту и переписывать.
...
Рейтинг: 0 / 0
Повторное использование кода в Hibernate
    #37712171
Йуный джавистЪ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
это провокация?

Разумеется.
...
Рейтинг: 0 / 0
Повторное использование кода в Hibernate
    #37712185
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Йуный джавистЪНо если я так сделаю, я потом не смогу переиспользовать логику, реализованную в методе isTop в sql запросах.
sql запросы, это всегда дублирование по отношению к доменной логике.
Т.е. выше утверждение не верно.
Нужно стремится повторно использовать БЕЗ sql запросов.
А запросы оставить для аналитики и группировки\агрегации.
Т.е. что ещё против твоего варианта?
...
Рейтинг: 0 / 0
Повторное использование кода в Hibernate
    #37712196
Йуный джавистЪ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sql запросы, это всегда дублирование по отношению к доменной логике.

Если всю логику запихнуть во вьюхи, то нигде никакого дублирования не будет.
Нужно стремится повторно использовать БЕЗ sql запросов.

Без SQL запросов можно сделать очень мало чего. Например, вот это
2)Получить список 10 последних (по дате) топовых постов.

нельзя.
...
Рейтинг: 0 / 0
Повторное использование кода в Hibernate
    #37712210
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Йуный джавистЪ,
1. Я тебя понимаю, но мы же тут не обсуждаем конкурента (без ОРМ).
Нельзя усидеть на 2-х стульях - либо ОРМ, либо твои вьюхи.
2. Дублирования нет и в DAO
3. Вопрос - "последние" не относится к первому вопросу, т.к. это аналитика.
Её на SQL делать проще и можно.
Итого: не мешай 2-3 вопроса вместе в один сабж.
...
Рейтинг: 0 / 0
Повторное использование кода в Hibernate
    #37712214
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если проще, вьюха = DAO, но для аналитики возможностей меньше.
...
Рейтинг: 0 / 0
Повторное использование кода в Hibernate
    #37712216
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Йуный джавистЪБез SQL запросов можно сделать очень мало чего. Например, вот это
2)Получить список 10 последних (по дате) топовых постов.

нельзя.
Почему нельзя?
...
Рейтинг: 0 / 0
Повторное использование кода в Hibernate
    #37712243
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Йуный джавистЪСложность в повторном использовании. Фаулер рекомендует rich domain model. В Rich domain model надо писать так:

Rich Domain слишком обширное понятие. Фаулер рекомендует не попасть в ловушку Anemic Model, когда у вас вообще вся логика будет в сервисах, даже когда ей место в сущностях.

Йуный джавистЪНо если я так сделаю, я потом не смогу переиспользовать логику, реализованную в методе isTop в sql запросах. Поэтому мне придется копипастить "viewcount > 10000" в каждый sql запрос. Потом, если вдруг критерии топовости поста поменяются, мне придется бегать по всему проекту и переписывать.

Любая проблема решается внедрением дополнительного абстрактного слоя:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
class Post{
  static Criterion topCriterion = Builder.prop("viewCount").gt(10000);
  User user;
  String text;
  int viewcount;
  Date date;
  boolean isInTop(){
    return topCriterion.doesMeet(this);
  }
}

Collection findTopPosts(){
    return getSession()
           .createCriteria(Post.class)
           .add(Post.topCriterion.toHibertaneCriterion())
           .list();
}
...
Рейтинг: 0 / 0
Повторное использование кода в Hibernate
    #37712281
Фотография schwa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Йуный джавистЪ,
как-то так.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
import org.hibernate.annotations.*;

class User{
  String name;

  @Where(clause = "viewcount > 10000")
  @OrderBy("date desc")
  List<Post> posts;
}
...
Рейтинг: 0 / 0
Повторное использование кода в Hibernate
    #37712479
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а если в будущем топовость поста будет определяться не только свойствами класса Post, а например еще чем-то (популярность автора например)?
...
Рейтинг: 0 / 0
Повторное использование кода в Hibernate
    #37712512
Йуный джавистЪ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Любая проблема решается внедрением дополнительного абстрактного слоя:

Я такого ответа и ожидал - это единственный способ писать код с хибернейтом и не насиловать базу.
Но при этом получается, что эти критерионы - это в принципе те же самые вьюхи, только для Hibernate. При этом они намного менее читабельны. HQL никак не комбинируется с критерионами.
Возникает вопрос, зачем тогда вообще нужен хибернейт, если логику писать на нем неудобно. Не легче ли всю логику сделать на вьюхах и потом тупо перегонять резалтсеты в Value Objects?
...
Рейтинг: 0 / 0
Повторное использование кода в Hibernate
    #37712522
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Йуный джавистЪВозникает вопрос, зачем тогда вообще нужен хибернейт, если логику писать на нем неудобно. Не легче ли всю логику сделать на вьюхах и потом тупо перегонять резалтсеты в Value Objects?
- у хибера узкая область - CRUD.
- зачем перегонять в VO? Проще резалтсет сериализовать
- вы сторонник Одного подхода? Я - нет.
Что-то должно конкурировать с резалтсетами.
...
Рейтинг: 0 / 0
Повторное использование кода в Hibernate
    #37712525
Йуный джавистЪ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Единственное что order by для огромной выбороки данных, штука стремная.

В данном конкретном случае топовых постов должно быть намного меньше, чем общее число - на то они и топовые. Можно сделать для них partial index по дате.
...
Рейтинг: 0 / 0
Повторное использование кода в Hibernate
    #37712527
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpashaа если в будущем топовость поста будет определяться не только свойствами класса Post, а например еще чем-то (популярность автора например)?
точно так-же как в БД - Join, тут вместо него - доп.бизнес-слой.
Никакой магии.
...
Рейтинг: 0 / 0
Повторное использование кода в Hibernate
    #37712528
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Йуный джавистЪЯ такого ответа и ожидал - это единственный способ писать код с хибернейтом и не насиловать базу.
Нет, не единственный. Никто не парится с тем чтобы хранить критерии в DAO и только когда нужно, то выности их на более верхние слои.

Йуный джавистЪНо при этом получается, что эти критерионы - это в принципе те же самые вьюхи, только для Hibernate.
Хибернейт здесь не при чем. Эти критерии можно транслировать и в HQL и в SQL при надобности.

Йуный джавистЪПри этом они намного менее читабельны. HQL никак не комбинируется с критерионами.
Это проблема Java синтаксиса, а не ORM.

Йуный джавистЪВозникает вопрос, зачем тогда вообще нужен хибернейт, если логику писать на нем неудобно.
Экономит массу времени на реализации CRUD, каскадов и пр.

Йуный джавистЪНе легче ли всю логику сделать на вьюхах и потом тупо перегонять резалтсеты в Value Objects?
View работает с табличными данными. Менеджить ветвистые иерархии на них сложнее.
...
Рейтинг: 0 / 0
Повторное использование кода в Hibernate
    #37712565
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123chpashaа если в будущем топовость поста будет определяться не только свойствами класса Post, а например еще чем-то (популярность автора например)?
точно так-же как в БД - Join
человек хочет стратегию топовости написать ровно один раз. join придется повторять кучу раз для похожих запросов. или написать вьюху, как хочет топикстартер. лично я так и сделал бы. вряд ли будет проблемой перенести ее в другую БД если завтра война. так хуле мучатся.
...
Рейтинг: 0 / 0
Повторное использование кода в Hibernate
    #37712571
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpasha,
ну, я рассматриваю 2 технологии, как параллельные - для простоты:
- Не ORM (1 раз во вьюхе\триггере\ХП)
- ОРМ (1 раз в DAO\тут тоже 2-3 варианта)
Т.е. варианты есть всякие. Особых проблем по сабжу нет. Пусть пишет как нравится :)
imho
...
Рейтинг: 0 / 0
Повторное использование кода в Hibernate
    #37712600
Йуный джавистЪ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем, есть два способа:

Первый:
Код: sql
1.
2.
3.
  boolean isTop(){
    return viewcount > 10000;
  }



Второй:
Код: sql
1.
2.
3.
4.
  static Criterion topCriterion = Builder.prop("viewCount").gt(10000);
  boolean isInTop(){
    return topCriterion.doesMeet(this);
  }



Первый является непомерным злом, так как провоцирует писать такой код:
Код: sql
1.
2.
3.
for(post in query("select * from posts order by date desc"))
  if(post.isTop())
    yield post;



Второй способ - это SQL программирование, только сильно извращенное - код мало читабелен, урезаны родные возможности СУБД, нет проверки в compile time.

В обоих случаях получается, что бизнес логики на ООП не бывает.
...
Рейтинг: 0 / 0
Повторное использование кода в Hibernate
    #37712648
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123- Не ORM (1 раз во вьюхе\триггере\ХП)
imhoлично мне не очевидно, почему одно исключает другое. если задачу можно решить более эффективно (в ущерб портируемости, когда это допустимо) , то почему-бы и нет
...
Рейтинг: 0 / 0
Повторное использование кода в Hibernate
    #37712663
VoDA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Йуный джавистЪВторой способ - это SQL программирование, только сильно извращенное - код мало читабелен, урезаны родные возможности СУБД, нет проверки в compile time.если не нравится Criterion - используйте SQL или HQL. Есть среды разработки (IDE) которые умеют Hibernate и JPA валидировать по базе.

compile-time проверка есть в случае использования JPA Criteria API, но ИМХО это на сильного любителя. Уж больно многословно.

Йуный джавистЪВ обоих случаях получается, что бизнес логики на ООП не бывает.
Джавист видать подрос, раз такие оценки выдает на раз Предлагаю для того, чтобы все прониклись идеей сузить ваш вывод - "получается, что бизнес логики на Java не бывает." ;)))
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Повторное использование кода в Hibernate
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]