Хороший способ обработки большой коллекции в доменной модели - с помощью JPA / Hibernate ORM? - PullRequest
2 голосов
/ 01 июля 2010

У меня есть несколько OneToMany дочерних коллекций в моих классах доменов, которые со временем могут вырасти до сотен или (очень вероятно) тысяч экземпляров. Однако зачастую единственное, что действительно нужно родителю, - это «первый» ребенок, «последний» ребенок или «самый большой» ребенок. Представление родительского экземпляра в цикле через большую коллекцию объектов, загруженных из базы данных, кажется неэффективным.

С другой стороны, я не хочу загрязнять мою модель домена проблемами постоянства и начинаю использовать мои DAO в классах домена для выполнения запросов.

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

Есть ли способ извлечь просто «определенный» объект из большой коллекции без прямого вызова DAO? Какие-то возможности отображения JPA ORM, которые я упустил?

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

Ответы [ 2 ]

4 голосов
/ 01 июля 2010

Здесь есть множество вариантов

  1. Использовать ленивую загрузку или пакетное получение
  2. Используйте запросы HQL или Criteria или даже переходите на нативный SQL, чтобы ограничить количество результатов (другими словами, вместо навигации по коллекции выполните запрос, чтобы вернуть N элементов, которые вы хотите)
  3. Если кэширование является опцией, вы, вероятно, можете избежать перехода в базу данных хотя бы некоторое время.
1 голос
/ 02 июля 2010

Есть ли способ извлечь просто "определенный" объект из большой коллекции без прямого вызова DAO?

Мне неизвестна стандартная функция JPA, позволяющая это сделать, и я думаю, что я буду использовать здесь пользовательские запросы («JPA плохо справляется с большими коллекциями» - это то, что вы найдете везде).

На всякий случай, возможно, взгляните на некоторые фирменные функции, такие как:

Я не уверен, что аннотация @Where будет такой полезной (если только вы не создадите специальную сущность для общих случаев использования и "толстую"). Тем не менее, фильтры могут быть действительно интересными здесь. Я никогда не использовал их жестко.

...