Po poprzednim pytaniu, DAO and Service layers (JPA/Hibernate + Spring), postanowiłem użyć tylko jednego DAO dla mojej warstwy danych (przynajmniej na początku) w aplikacji używającej JPA/Hibernate, Wiosna i furtka. Zaproponowano użycie ogólnych metod CRUD, ale nie jestem pewien, jak to zaimplementować za pomocą JPA. Czy mógłbyś podać mi przykład lub podzielić się linkiem dotyczącym tego?Pojedyncze DAO i ogólne metody CRUD (JPA/Hibernate + Spring)
Odpowiedz
Oto przykład interfejs:
public interface GenericDao<T, PK extends Serializable> {
T create(T t);
T read(PK id);
T update(T t);
void delete(T t);
}
i realizacja:
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);
}
}
jeśli szukasz realizacji trzeciej strony, można sprawdzić http://www.altuure.com/projects/yagdao/. jest to generyczna platforma DAO, która obsługuje standard JPA i hibernuje
Szukałem tego samego. Znalazłem coś, co wydaje się dokładnie takie - projekt JPA dostarczony przez SpringSource. Jest to port kodu od Hades i został już (na początku 2011 r.) Połknięty przez wiosnę i lepiej zintegrowany. Pozwala na użycie pojedynczego dao (SimpleJpaRepository) ze statycznym tworzeniem lub rozszerzeniem podstawowej klasy JpaRepository w celu utworzenia dowolnego obiektu dao z gotowymi metodami CRUD +. Pozwala również na granie typu zapytania, używając nazw paramu jako nazwy metody - w interfejsie (nie wymaga implementacji!), Tj. findByLastname(String lastName);
Wygląda bardzo obiecująco - bycie częścią projektów wiosennych z pewnością zapewni jej również pewną przyszłość. Zacząłem wdrażać to w moim nadchodzącym projekcie.
Na podstawie artykułu Don't repeat the DAO używaliśmy tego rodzaju techniki przez wiele lat. Zawsze zmagaliśmy się z problemami z naszymi wzorami, gdy zdaliśmy sobie sprawę, że popełniliśmy wielki błąd.
Korzystając z narzędzia ORM, takiego jak Hibernate lub JPA, nie musisz osobno myśleć o kategoriach DAO i Service. Możesz użyć EntityManager ze swoich klas usług, ponieważ znasz cykl życia transakcji i logikę tam swoich klas jednostek.
Czy zapisujesz w dowolnej chwili, dzwoniąc pod numer myDao.saveEntity
zamiast po prostu entityManager.saveEntity
? Nie. Będziesz mieć niepotrzebną klasę dao, która nie zrobi nic innego, ale będzie opakowaniem wokół EntityManager. Nie bój się pisać wyborów w swoich klasach usług przy pomocy EntityManager (lub sesji w hibernacji).
Jeszcze jedna uwaga: Należy zdefiniować granice warstwy usługi i nie pozwolić programistom na zwrócenie lub oczekiwanie na klasy jednostek. Programowanie warstwy UI lub WS nie powinno w ogóle wiedzieć o klasach jednostek tylko o DTO-s. Obiekty obiektów mają cykle życia, o których większość programistów nie wie. Będziesz miał naprawdę poważne problemy, jeśli przechowujesz obiekt obiektu w danych sesji i spróbuj zaktualizować go z powrotem do bazy danych sekund lub godzin później. Cóż, nie zrobiłbyś tego, ale programista interfejsu użytkownika, który zna typy parametrów i typy zwracanych warstw serwisowych, zrobiłby tylko kilka linii kodu.
Zarządzanie transakcjami z adnotacjami w EJB ?! Chociaż prawdopodobnie potrzebujesz znacznie bardziej wyrafinowanego DAO, który nie będzie już generyczny, ale tak czy inaczej. Wciąż uważam, że ta metoda może być przydatna w konkretnych przypadkach. –
Można też rzucić okiem na http://codeblock.engio.net/data-persistence-and-the-dao-pattern/
dany przepis można znaleźć na github https://github.com/bennidi/daoism
Ma integrację z wiosną i przykłady konfiguracji dla Hibernate i EclipseLink
- 1. Metody Crud w warstwie usług przy użyciu Spring Data JPA
- 2. Java: Ogólne metody i numery
- 3. Czy istnieje jakieś ogólne wdrożenie JPA DAO?
- 4. DAO, wiosna i hibernacja
- 5. Wzór i relacje dao
- 6. Spring MVC CRUD controller best pactice
- 7. Junit do przetestowania usługi Spring i warstwy DAO
- 8. Pisz mniej DAO ze Spring Hibernate za pomocą adnotacji
- 9. Jak zmienić te ogólne metody?
- 10. IntelliJ zawaleniem pojedyncze metody linii
- 11. Domeny, DAO i warstwy usług
- 12. Generator DAO dla java
- 13. Jak wysłać ogólne obiekty do kontrolera Spring?
- 14. Jeden DAO na klasę "kontener" lub jeden DAO na stół?
- 15. DTO i koncepcje DAO i MVC
- 16. Jak odnieść ogólne klasy i metody w dokumentacji xml
- 17. SpringMvc Adnotacje dla interfejsu DAO i realizacji DAO
- 18. Wywołanie ogólne metody z dynamicznym typu
- 19. DAO i zastrzyk zależności, porady?
- 20. CRUD dla MySQL i PHP
- 21. Jak odsłonić niestandardowe repozytorium crud z repozytorium danych Spring REST?
- 22. Repozytorium ogólne i transakcja
- 23. Ogólne i nietypowe interfejsy
- 24. JPA i DAO realizacja operacji usuwania
- 25. Potrzebuję oddzielnego interfejsu i imporu dla DAO
- 26. Wywołanie jednego DAO z innego DAO?
- 27. Czy DAO może zadzwonić do DAO?
- 28. DAO na innym serwerze aplikacji
- 29. Wiosenne repozytorium CRUD: czy istnieje findOneByMaxXYZColumn()?
- 30. Korzystanie z usług i DAO w kontrolerach mvc na wiosnę
Jak by to dopasować się obiekty slsb i pojo (reprezentujące tabele db)? – NimChimpsky
Świetna odpowiedź. Kilka uwag: raczej przekazuję klasę jako parametr w metodzie konstruktora (zamiast odznaczonego rzutowania); parametr t w metodzie delete nie powinien być ponownie przypisywany, a klasa powinna być abstrakcyjna. – megathor
Dzięki !!!!!!!! DUŻO! – verystrongjoe