Какой смысл иметь сложные классы сущностей (в смысле Hibernate) - PullRequest
0 голосов
/ 13 июля 2011

Поскольку классическая модель ООП в любом случае нарушена, несмотря на все полезности ORM, зачем мне аннотировать следующие два примера атрибутов в моем классе сущностей:

User
   => Collection<Photo> photos (one to many)
   => Collection<User> friends (one to many)

, поскольку я не собираюсьиспользовать эти ... когда-либо.По-видимому, мне нужно будет выполнить какое-то разбиение на страницы или другие типы форматирования, поэтому я думаю, что я всегда буду использовать что-то вроде:

photoDAOInstance.find(searchCriteria); 

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

Ответы [ 3 ]

1 голос
/ 13 июля 2011

Ну, если они вам никогда не нужны, не отображайте их. В зависимости от вашей схемы / намерения, нет никаких причин отображать то, что вам не нужно. Если они вам понадобятся позже, добавьте их. В зависимости от использования вы можете добавить их для запросов HQL / JPA QL / Criteria или просто выполнить запрос в SQL. В конце концов, вам может понадобиться переделать или переосмыслить производительность кэширования, но это именно так. Просто убедитесь, что у вас есть приличный набор тестов.

Ничего страшного. :: пожимает плечами ::

Вообще говоря, добавить вещи позже легко. Удаление тоже не плохо. Перемещение / разделение является сложным (например, разделение ИМЕНИ на ПЕРВЫЙ и ПОСЛЕДНИЙ).

1 голос
/ 13 июля 2011

ООП не сломан.Реляционные базы данных не сломаны.Существует просто несоответствие импеданса между двумя способами представления данных.

Сложные сопоставления необходимы для сложных запросов, которые охватывают несколько таблиц, а Hibernate выполняет необходимые объединения под капотом.

0 голосов
/ 13 июля 2011

Вы можете не использовать их для получения фотографий, но вы обязательно будете использовать их в запросах.Например:

select user.id, user.name, count(friend.id)
from User user left join user.friends friend
froup by user.id, user.name

, чтобы иметь возможность перемещаться от пользователя к его друзьям, вам нужна коллекция friends с аннотацией OneToMany.

Вы можете сделать эту коллекциюконфиденциально, и избегайте доступа к этой коллекции, если хотите.

Обратите внимание, что у пользователя в вашем примере, вероятно, слишком много фотографий и друзей, чтобы сделать коллекцию полезной, но это далеко не всегда так.В приложении, над которым я сейчас работаю, много ассоциаций toMany, в которых содержится от 0 до 100 элементов.И от 0 до 10 довольно часто.

Кроме того, не забывайте, что рядом с вашими «обычными» вариантами использования, включающими перечисление некоторых фотографий пользователя, у вас наверняка будут «необычные» варианты использования, где вам придется применять измененияв пакетном режиме на все фотографии пользователя или тому подобное.

...