webentwicklung-frage-antwort-db.com.de

Single DAO & generische CRUD-Methoden (JPA / Hibernate + Spring)

Nach meiner vorherigen Frage DAO- und Service-Layer (JPA/Hibernate + Spring) habe ich beschlossen, in einer Anwendung mit JPA/Hibernate (zumindest zu Beginn) nur einen einzigen DAO für meinen Daten-Layer zu verwenden , Frühling und Wicket. Die Verwendung generischer CRUD-Methoden wurde vorgeschlagen, aber ich bin nicht sicher, wie ich dies mit JPA implementieren soll. Könnten Sie mir bitte ein Beispiel geben oder einen Link dazu teilen?

45
John Manak

Hier ist eine Beispielschnittstelle:

public interface GenericDao<T, PK extends Serializable> {
    T create(T t);
    T read(PK id);
    T update(T t);
    void delete(T t);
}

Und eine Implementierung:

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);
    }
}
86
Pascal Thivent

Basierend auf dem Artikel DAO nicht wiederholen haben wir diese Technik viele Jahre lang angewendet. Wir hatten immer Probleme mit unseren Mustern, nachdem wir festgestellt hatten, dass wir einen großen Fehler gemacht hatten.

Wenn Sie ein ORM-Tool wie Hibernate oder JPA verwenden, müssen Sie DAO- und Service-Layer nicht getrennt betrachten. Sie können EntityManager aus Ihren Serviceklassen verwenden, da Sie den Lebenszyklus von Transaktionen und die Logik Ihrer Entitätsklassen dort kennen.

Sparen Sie eine Minute, wenn Sie myDao.saveEntity Anstelle von entityManager.saveEntity Aufrufen? Nein. Sie haben eine unnötige Dao-Klasse, die nichts anderes tut, als EntityManager zu umhüllen. Scheuen Sie sich nicht, mithilfe von EntityManager (oder einer Sitzung im Ruhezustand) Auswahlen in Ihre Serviceklassen zu schreiben.

Noch eine Anmerkung: Sie sollten die Grenzen Ihrer Serviceebene definieren und es Programmierern nicht erlauben, zurückzukehren oder auf Entitätsklassen zu warten. Die UI- oder WS-Layer-Programmierer sollten überhaupt nichts über Entitätsklassen wissen, sondern nur über DTOs. Entitätsobjekte haben Lebenszyklen, die die meisten Programmierer nicht kennen. Wenn Sie ein Entitätsobjekt in Sitzungsdaten speichern und versuchen, es Sekunden oder Stunden später wieder in der Datenbank zu aktualisieren, treten wirklich schwerwiegende Probleme auf. Sie würden es vielleicht nicht tun, aber ein Programmierer der Benutzeroberfläche, der die Parametertypen und Rückgabetypen Ihrer Serviceebene kennt, würde nur einige Codezeilen sparen.

14
Balazs Zsoldos

wenn Sie eine Implementierung eines Drittanbieters suchen, können Sie http://www.altuure.com/projects/yagdao/ . Es ist ein nnotation-basiertes generisches DAO-Framework, das JPA und Ruhezustand unterstützt

2
altuure

Sie können sich auch http://codeblock.engio.net/data-persistence-and-the-dao-pattern/ ansehen

Den entsprechenden Code finden Sie auf github https://github.com/bennidi/daoism

Es ist in Spring integriert und enthält Konfigurationsbeispiele für Hibernate und EclipseLink

1
bennidi