Единые DAO и общие методы CRUD (JPA / Hibernate + Spring)

Следуя моему предыдущему вопросу, уровни DAO и Service (JPA / Hibernate + Spring) , я решил использовать только один DAO для моего уровня данных (по крайней мере в начале) в приложении с использованием JPA / Hibernate, Spring и Wicket. Было предложено использование общих методов CRUD, но я не очень уверен, как реализовать это с помощью JPA. Не могли бы вы привести мне пример или поделиться ссылкой?

Вот пример интерфейса:

public interface GenericDao { T create(T t); T read(PK id); T update(T t); void delete(T t); } 

И реализация:

 public class GenericDaoJpaImpl implements GenericDao { protected Class entityClass; @PersistenceContext protected EntityManager entityManager; public GenericDaoJpaImpl() { ParameterizedType genericSuperclass = (ParameterizedType) getClass() .getGenericSuperclass(); this.entityClass = (Class) genericSuperclass .getActualTypeArguments()[0]; } @Override public T create(T t) { this.entityManager.persist(t); return t; } @Override public T read(PK id) { return this.entityManager.find(entityClass, id); } @Override public T update(T t) { return this.entityManager.merge(t); } @Override public void delete(T t) { t = this.entityManager.merge(t); this.entityManager.remove(t); } } 

Основываясь на статье Не повторяйте DAO, мы использовали этот вид техники на протяжении многих лет. Мы всегда боролись с проблемами с нашими образцами после того, как поняли, что совершили большую ошибку.

Используя ORM-инструмент, такой как Hibernate или JPA, вам не придется рассматривать DAO и Service layer отдельно. Вы можете использовать EntityManager из ваших classов обслуживания, поскольку вы знаете жизненный цикл транзакций и логику своих classов объектов.

Вы сохраняете любую минуту, если вы вызываете myDao.saveEntity а не просто entityManager.saveEntity ? Нет. У вас будет ненужный class dao, который ничего не сделает, но будет оберткой вокруг EntityManager. Не бойтесь писать выделения в своих сервисных classах с помощью EntityManager (или сеанса в спящем режиме).

Еще одно замечание: вы должны определить границы своего уровня обслуживания и не позволить программистам возвращать или ждать classы Entity. Программисты уровня UI или WS не должны вообще знать об classах сущностей только о DTO-s. Объекты Entity имеют жизненные циклы, о которых большинство программистов не знают. У вас возникнут серьезные проблемы, если вы сохраните объект сущности в данных сеанса и попробуйте обновить его до базы данных через несколько секунд или несколько часов. Ну, вы, возможно, не сделали этого, но программист пользовательского интерфейса, который знает типы параметров и возвращаемые типы вашего уровня обслуживания, только сделает, чтобы сохранить некоторые строки кода.

Я искал то же самое. Я нашел то, что, похоже, именно это – проект JPA Spring-Data, предоставленный SpringSource. Это порт кода от Hades и теперь (начало 2011 года) проглотил весной и лучше интегрирован. Он позволяет использовать один dao (SimpleJpaRepository) со статическим созданием или расширять базовый class JpaRepository для создания любого конкретного объекта dao с готовыми CRUD + методами. Кроме того, позволяет использовать запросы типа grails, используя имена params в качестве имени метода – в интерфейсе (не требуется реализация!), findByLastname(String lastName); есть findByLastname(String lastName); Выглядит очень многообещающе – участие в проектах Spring также обязательно обеспечит будущее. Сейчас я начал реализовывать это в своем предстоящем проекте.

если вы ищете стороннюю реализацию, вы можете проверить http://www.altuure.com/projects/yagdao/ . это основанная на nnotation общая структура DAO, которая поддерживает JPA и hibernate

Вы также можете посмотреть http://codeblock.engio.net/data-persistence-and-the-dao-pattern/

Связанный код можно найти на github https://github.com/bennidi/daoism

Он имеет интеграцию с Spring и примерами конфигурации для Hibernate и EclipseLink

  • Как создать и обработать составной первичный ключ в JPA
  • Установка значений по умолчанию для столбцов в JPA
  • Hibernate: «Поле« id »не имеет значения по умолчанию»
  • Spring Data JPA отображает исходный результат запроса на Non-Entity POJO
  • Как запустить приложение Spring-Boot без зависимости от базы данных?
  • Что такое «собственная сторона» в сопоставлении ORM?
  • Спящий режим, весна, JPS и изоляция - индивидуальная изоляция не поддерживается
  • В чем разница между интерфейсами CrudRepository и JpaRepository в Spring Data JPA?
  • Учебное пособие по процедурам JPA
  • JPA с использованием нескольких схем баз данных
  • Как использовать enums с JPA
  • Interesting Posts

    Студия Android занимает слишком много памяти

    __attribute __ ((конструктор)) эквивалентен в VC?

    Как я могу использовать «Windows Live Call Button» на наушниках для ответа на звонок со Skype?

    Как предотвратить открытие текущей папки пользователя при запуске Windows Explorer?

    Преимущества авто в параметрах шаблона в C ++ 17

    Regex: знак вопроса и двоеточие

    clone () против конструктора копирования по сравнению с заводским методом?

    Разница между скобками и двойной скобкой ] для доступа к элементам списка или кадра данных

    Создание отношений много-много в Rails

    Тип ввода HTML5 Дата – значение по умолчанию для сегодняшнего дня?

    Маршрутизация трафика IPv6 через pptpd Debian в туннель IPv6 Hurricane Electric

    Веб-скребок с VBA (при HTML DOM)

    Полноэкранные цифровые часы для DOS 6.22?

    Бесполезное вращение фотографий с помощью Windows Photo Viewer? (XP против Win7)

    Получить тег NFC с помощью приложения NDEF для приложений Android (AAR)

    Давайте будем гением компьютера.