Одиночные методы DAO & generic CRUD (JPA / Hibernate + Spring)
следуя моему предыдущему вопросу,DAO и сервисные слои (JPA/Hibernate + Spring), Я решил использовать только один DAO для моего уровня данных (по крайней мере, в начале) в приложении, использующем JPA/Hibernate, Spring и Wicket. Было предложено использовать общие методы CRUD, но я не очень уверен, как реализовать это с помощью JPA. Не могли бы вы привести мне пример или поделиться ссылкой на это?
5 ответов
вот пример интерфейса:
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);
}
}
на основании статьи не повторяйте DAO мы использовали этот вид метода в течение многих лет. Мы всегда боролись с проблемами с нашими шаблонами после того, как поняли, что совершили большую ошибку.
используя инструмент ORM, такой как Hibernate или JPA, вам не придется думать о DAO и слое обслуживания отдельно. Вы можете использовать EntityManager из своих классов обслуживания, поскольку вы знаете жизненный цикл транзакций и логику ваших классов сущностей.
вы сохраните любую минуту, если вы позвоните myDao.saveEntity
а не просто entityManager.saveEntity
? Нет. У вас будет ненужный класс dao, который ничего не делает, но будет оберткой вокруг EntityManager. Не бойтесь записывать выбранные в классы обслуживания с помощью EntityManager (или сеанса в спящем режиме).
еще одно примечание: вы должны определить границы своего уровня обслуживания и не позволять программистам возвращаться или ждать классов сущностей. Программисты UI или WS layer вообще не должны знать классы сущностей только о DTO-s. Объекты сущностей имеют жизненные циклы, о которых большинство программистов не знают. У вас возникнут серьезные проблемы, если вы сохраните объект сущности в данных сеанса и попытаетесь обновить его до базы данных через несколько секунд или часов. Ну, вы можете не делать этого, но программист пользовательского интерфейса, который знает типы параметров и типы возврата вашего сервисного уровня, будет делать только для сохранения некоторых строк кода.
Я искал то же самое. Я нашел то, что кажется именно этим -Весна-Сведения проект JPA, предоставленный SpringSource. Это кодовый порт из ад и теперь (в начале 2011 года) был проглочен весной и лучше интегрирован.
Он позволяет использовать один dao (SimpleJpaRepository) со статическим create или расширить базовый класс JpaRepository для создания любого объекта конкретного dao с готовыми методами CRUD+. Также позволяет grails как запросы просто используя имена параметров в качестве имени метода - в интерфейсе (не требуется реализация!), т. е. findByLastname(String lastName);
Выглядит очень многообещающе - участие в весенних проектах, безусловно, обеспечит и для него какое-то будущее.
Я уже приступил к реализации этого проекта.
Если вы ищете стороннюю реализацию, Вы можете проверить http://www.altuure.com/projects/yagdao/ . это основанная на nnotation универсальная структура DAO, которая поддерживает JPA и hibernate
вы также можете посмотреть на http://codeblock.engio.net/data-persistence-and-the-dao-pattern/
соответствующий код можно найти на githubhttps://github.com/bennidi/daoism
Он имеет интеграцию с примерами Spring и конфигурации для Hibernate и EclipseLink