Статьи

Аид, твой следующий ангел настойчивости?

Год назад мой коллега показал мне очень интересный фреймворк под названием Krank (последний переименован в Crank, потому что предыдущее название на немецком означает «больной», что не сулит ничего хорошего). Целью Crank было облегчить разработку на основе Java Persistence API 1.0. Две интересные особенности привлекли мое внимание в то время:

  • универсальный DAO, который реализует операции CRUD «из коробки». Это своего рода Грааль, просто попробуйте Google для «Общего DAO» и посмотрите результаты: похоже, что каждый предоставляет такой класс. Будь каждый успех, я оставляю читателю.
  • механизм связывания между этим общим DAO и именованными запросами, освобождает вас от необходимости создавать объект запроса самостоятельно

К сожалению, с 2008 года нет никаких действий для Крэнка, и я думаю, что это можно отнести к категории абсолютно мертвых. Однако, и я не знаю, есть ли ссылка, появился новый проект, который не только реализует те же функции, но и добавляет еще более инновационные. Этот проект, который я только недавно обнаружил, является проектом Hades , целью которого является повышение производительности на уровне постоянства в целом и для JPA v2 в частности. Теперь он определенно стоит на вершине моего списка «Горячей темы».

Чтобы оценить Hades, я реализовал несколько очень простых модульных тестов: он просто работает, как есть! Давайте рассмотрим особенности Hades.

Настройка Аида

Конфигурация аида основана на Spring, нравится вам это или нет. Лично я делаю это, так как это делает настройку Hades бризом. Для этого Аид использует малоизвестную особенность Spring, а именно авторинг (для получения дополнительной информации по этому вопросу см. Мою предыдущую статью об авторской разработке Spring ). Предположим, у нас уже есть файл конфигурации Spring beans и что фабрика менеджера сущностей уже определена. Просто добавьте пространство имен Hades в заголовок и укажите базовый пакет ваших классов DAO:

<beans...
xmlns:hades="http://schemas.synyx.org/hades"
xsi:schemaLocation="...
http://schemas.synix.org/hades http://schemas.synyx.org/hades/hades.xsd ...">
<hades:dao-config base-package="ch.frankel.blog.hades.dao" />
</beans>

Поскольку Аид использует соглашение о конфигурации, он будет:

  • прозрачно создать bean-компонент Spring для каждого интерфейса DAO (который должен наследоваться от GenericDAO) в настроенном пакете
  • ссылаться на него под неквалифицированным именем класса, где первая буква установлена ​​в нижнем регистре
  • внедрить его с фабрикой менеджера сущностей по умолчанию и менеджером транзакций, если они соответственно объявлены как «entityManagerFactory» и «TransactionsManager»

Общий DAO

Универсальный DAO Hades поддерживает стандартные операции CRUD для отдельных сущностей и целых таблиц, а также COUNT. Под прикрытием он будет использовать введенную фабрику менеджера сущностей, чтобы получить ссылку на менеджера сущностей и использовать последний для этих операций.

Именованный запрос

Использование именованного запроса JPA требует минимального стандартного кода (но все же) и не обеспечивает обобщенную сигнатуру (которую необходимо будет привести впоследствии):

Query query = em.createNamedQuery("findUsersByName").setParameter(name);

List result = query.getResultList();

Аид, с другой стороны, предоставляет механизм связывания между именованным запросом и именем метода интерфейса:

public interface UserDao extends GenericDao {

List<User> findUsersByName(String name);
}

Теперь вам просто нужно внедрить DAO в ваш сервис и использовать его как есть.

Простой критерий запроса из имени метода

Большинство именованных запросов, которые вы пишете вручную, имеют форму SELECT * FROM MYTABLE, ГДЕ A = ‘a’ и B = ‘b’ или другие простые критерии. Аид может автоматически генерировать и выполнять запросы, которые имеют отношение к имени вашего метода. Например, если подпись метода вашего DAO — List findByLastNameOrAgeLessThan (имя строки, возраст даты), Hades создаст связанный запрос SELECT * FROM User u, где u.lastName =? 1 и u.age <? 2, и свяжет переданные параметры.

Хотя я немного опасался такой возможности, основываясь на имени метода, я понял, что она обеспечивает соответствие семантики метода тому, что он делает. Кроме того, нет кода для записи! Действительно, я мог бы легко влюбиться в эту функцию …

Расширение ваших DAO

Универсальный DAO Крэнка имел существенный недостаток. Если вы хотите добавить методы, вам нужно было создать конкретный класс DAO, скомпоновать DAO с универсальным, а затем делегировать все стандартные операции CRUD для универсального. Затем вы можете кодировать дополнительные методы в вашем конкретном DAO. По крайней мере, это был дизайн, который я придумал, когда мне нужно было это сделать. Это было не очень сложно, поскольку делегирование могло быть закодировано с вашей любимой IDE, но это было занудой, и вы получили очень очень длинный класс, полный делегирование звонков. Не то, что я называю простым кодом.

Аид разработал это поведение с самого начала. Когда вам нужно добавить методы к определенному DAO, все, что вам нужно сделать, это:

  • создать интерфейс с дополнительными методами
  • создайте конкретный класс, который реализует этот интерфейс, и закодируйте эти методы. Поскольку вы используете Spring, просто ссылайтесь на него как на bean-компонент Spring, чтобы внедрить фабрику диспетчера сущностей
  • повторно используйте простой интерфейс DAO и сделайте так, чтобы он расширял ваш конкретный интерфейс, а также GenericDao (как и раньше)

Готово: просто как пирог и красиво оформлено. О чем еще ты можешь попросить?

Вывод

Аид кажется относительно новым (первый билет датируется апрелем 2009 года), но выглядит очень многообещающе. До тех пор единственным «недостатком», который я могу видеть, является управление транзакциями: операции CRUD по умолчанию являются транзакционными, хотя, IMHO, транзакционность должна обрабатываться на уровне обслуживания. Тем не менее, он относительно незначителен в отношении всех преимуществ, которые он приносит. Более того, нежелание использовать такой новый проект может быть смягчено, так как он присоединится к Spring Data в ближайшем будущем, что я считаю очень хорошим признаком простоты и возможностей Hades.

Что касается меня, я не использовал, но бросил взгляд на Аида. Кто-нибудь уже использовал его в «реальных» проектах? В каком контексте? С какими результатами? Я был бы очень заинтересован в ваших отзывах, если таковые имеются

Как обычно, вы можете найти источники для этой статьи здесь .

Чтобы идти дальше:

 

От http://blog.frankel.ch/hades-your-next-persistence-angel