Следуя моему предыдущему вопросу, DAO and Service layers (JPA/Hibernate + Spring), я решил использовать только один DAO для моего уровня данных (по крайней мере в начале) в приложении с использованием JPA/Hibernate, Весна и калитка. Было предложено использование общих методов CRUD, но я не очень уверен, как реализовать это с помощью JPA. Не могли бы вы привести мне пример или поделиться ссылкой?Одиночные DAO и общие методы CRUD (JPA/Hibernate + Spring)
ответ
Вот пример интерфейса:
public interface GenericDao<T, PK extends Serializable> {
T create(T t);
T read(PK id);
T update(T t);
void delete(T t);
}
И реализация:
public class GenericDaoJpaImpl<T, PK extends Serializable>
implements GenericDao<T, PK> {
protected Class<T> entityClass;
@PersistenceContext
protected EntityManager entityManager;
public GenericDaoJpaImpl() {
ParameterizedType genericSuperclass = (ParameterizedType) getClass()
.getGenericSuperclass();
this.entityClass = (Class<T>) 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);
}
}
, если вы ищете реализации третьей стороны, вы можете проверить http://www.altuure.com/projects/yagdao/. это основанная на nnation базовая структура DAO, которая поддерживает JPA и спящий режим
Я искал эту же вещь. Я нашел то, что похоже на то, что проект JPA предоставлен SpringSource. Это порт кода от Hades и теперь (начало 2011 года) был проглочен весной и лучше интегрирован. Он позволяет использовать один dao (SimpleJpaRepository) со статическим созданием или расширить базовый класс JpaRepository для создания любого конкретного объекта dao с готовыми CRUD + методами. Кроме того, позволяет использовать запросы типа grails, используя имена параметров в качестве имени метода - в интерфейсе (не требуется реализация!), Т. Е. findByLastname(String lastName);
Выглядит очень многообещающе, поскольку часть проектов Spring также обеспечит некоторое будущее для него. Я начал реализовывать это в своем предстоящем проекте.
Основываясь на статье Don't repeat the DAO, мы использовали этот вид техники в течение многих лет. Мы всегда боролись с проблемами с нашими образцами после того, как поняли, что совершили большую ошибку.
С помощью инструмента ORM, такого как Hibernate или JPA, вам не нужно будет рассматривать DAO и Service layer отдельно. Вы можете использовать EntityManager из ваших классов обслуживания, поскольку вы знаете жизненный цикл транзакций и логику своих классов объектов.
Вы экономите любую минуту, если вы звоните myDao.saveEntity
вместо entityManager.saveEntity
? Нет. У вас будет ненужный класс dao, который ничего не сделает, но будет оберткой вокруг EntityManager. Не бойтесь писать выделения в своих сервисных классах с помощью EntityManager (или сеанса в спящем режиме).
Еще одно примечание: вы должны определить границы своего уровня обслуживания и не позволить программистам возвращать или ждать классы Entity. Программисты уровня UI или WS не должны вообще знать об классах сущностей только о DTO-s. Объекты Entity имеют жизненные циклы, о которых большинство программистов не знают. У вас возникнут серьезные проблемы, если вы сохраните объект сущности в данных сеанса и попробуйте обновить его до базы данных через несколько секунд или несколько часов. Ну, вы, возможно, не сделали этого, но программист пользовательского интерфейса, который знает типы параметров и возвращаемые типы вашего уровня обслуживания, только сделает, чтобы сохранить некоторые строки кода.
Аннотированное управление транзакциями в EJB ?! Хотя вам, вероятно, нужен гораздо более сложный DAO, который больше не будет общим, но в любом случае. Я по-прежнему считаю, что этот метод может быть полезен в конкретных случаях. –
Вы также можете посмотреть на http://codeblock.engio.net/data-persistence-and-the-dao-pattern/
Соответствующий код можно найти на GitHub https://github.com/bennidi/daoism
Он имеет интеграцию с Spring и примеры конфигурации для Hibernate и EclipseLink
Как бы это согласуется с slsb и pojo (представляющие таблицы db)? – NimChimpsky
Отличный ответ. Несколько комментариев: я скорее передаю класс как параметр в методе конструктора (вместо непроверенного броска); параметр t в методе удаления не должен быть переназначен, и класс предпочтительно будет абстрактным. – megathor
Спасибо !!!!!!!! МНОГО! – verystrongjoe