Год назад мой коллега показал мне очень интересный фреймворк под названием 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.
Что касается меня, я не использовал, но бросил взгляд на Аида. Кто-нибудь уже использовал его в «реальных» проектах? В каком контексте? С какими результатами? Я был бы очень заинтересован в ваших отзывах, если таковые имеются
Как обычно, вы можете найти источники для этой статьи здесь .
Чтобы идти дальше:
- Аид быстрый старт
- Документация аида
- Hades Javadocs
- Аид переход к Spring Data annoucement
- Сайт Spring Data