Frage

Ich bin immer noch ziemlich neu im Frühling und ich habe es in irritierendem Making all diese Crud Daos gefunden, also habe ich eine "öffentliche Klasse genericcrudao erweitert Hibernatedaosupport -Geräte implementiert Cruddao". In meinen Serviceobjekten sage ich dann einfach so etwas wie

private GenericCRUDDAO<User, Integer> userDAO = new GenericCRUDDAO<User, Integer>();

Und nicht mehr muss ich einfache Daos schreiben und sie verkabeln. Yay! Abgesehen von einer Sache bin ich sicher, dass alle Sie erlebten Frühlingsentwickler sofort sehen: Ich kann die Hibernate -Vorlage nicht im GenericCruddao bekommen, also mache ich also

HibernateTemplate ht = getHibernateTemplate();

Gibt mir ein HT, das null ist. Nicht so gut. Ich dachte daran, es zu verkabeln, was bedeutet, eine genericcruddao -Bohne zu machen und dann eine statische AnnotationSessionFactoryBean zu setzen, aber das würde mir immer noch keinen Hibernatetemplate geben. Irgendwelche Vorschläge, wie ich damit umarbeite, damit ich meine Hibernate -Vorlage haben kann?

Noch mehr Probleme mit der Herstellung eines generischen Crud Dao, an den ich denken sollte?

Prost

Nik

War es hilfreich?

Lösung

Für viele, HibernateTemplate und HibernateDaoSupport sind in den Outs und stattdessen a SessionFactory Ist bevorzugt. Nicht jeder, wohlgemerkt, aber es ist ein Trend, den ich vor nicht allzu langer Zeit adoptiert habe, um zu entfernen HibernateTemplate von meinem eigenen generischen Dao.

Dieser Blog Hat eine ziemlich gute Zusammenfassung.

Die Beispiele des Autors sollten in der Lage sein, Ihnen zu helfen, dorthin zu gelangen, wo Sie sein möchten.

Andere Tipps

Genericdao

Nun, für mich, Wenn Ihr GenericDao "generisch" ist, benötigen Sie möglicherweise nur eine Instanz, und mach alles mit dieser einzelnen Instanz.

Ich bin mir sicher, dass es Sie nicht stört, wenn Sie die Instanz verdrehen, sondern bei der Wiederholung, dass Sie wütend werden (und ich stimme Ihnen zu).

Zum Beispiel, Sie könnten die Entitätsklasse an eine generische Methode übergeben.

  • Öffentliche Void Save (Klasse, E ...): Mit einem oder mehreren Instanzen des E -Typs, der eine Ihrer Einheiten ist.
  • Öffentliche E -Last (Klasse, lange ID): lädt eine Entität.
  • ...

    /** Assuming the entities have a superclass SuperEntity with getIdent(). */
    public class GenericDaoImpl implements GenericDao {
    
       /** Save a bunch of entities */
       public void save(SuperEntity... entities) {
         for(SuperEntity entity : entities) {
           getSession().save(entity);
         }
       }
    
       /** Load any entity. */
       public <E extends SuperEntity> E load(Class<E> entityClass, Long ident) {
         return (E)getSession().load(entityClass, ident);
       }
    
       // other generic methods
    }
    

Variante

In unseren Anwendungen haben wir tatsächlich eine Variante dafür. Da wir für jeden DAO viele spezifische Anfragen haben, benötigen wir trotzdem die spezifischen DAO -Klassen (erstellen Sie die Klasse und verdrahten Sie sie).

Codierung

Aber in keiner Weise wiederholen wir den Code. Alle unsere DAOs erweitern den GenericDao und liefern im Konstruktor den benötigten Klassenparameter. Beispielcode (nicht vollständig, einfach, um die Grundidee zu erhalten):

    public abstract class GenericDaoImpl<E extends SuperEntity> 
        implements GenericDao<E> {

       /** Available for generic methods, so it is not a parameter 
        * for the generic methods. */
       private final Class<E> entityClass;

       protected GenericDaoImpl(Class<E> entityClass) {
         this.entityClass = entityClass;
       }

       // generic implementation ; can be made efficient, as it may 
       // send the orders as a batch
       public void save(E... entities) {
         for(SuperEntity entity : entities) {
           getSession().save(entityClass, entity.getIdent());
         }
         // possibly add flushing, clearing them from the Session ...
       }

       // other generic methods
    }

    public class PersonDaoImpl extends GenericDaoImpl<Person> 
        implements PersonDao {

      /** Constructor, instanciating the superclass with the class parameter. */
      public PersonDaoImpl() {
        super(Person.class);
      }

      /** Specific method. */
      public List<Person> findByAge(int minAge, int maxAge) {
        //....
      }
    }

Verdrahtung

Die Verkabelung aller Bohnen ist kein Todesfall. Heutzutage gibt es viele Autokrichtlinien, Sie müssen sich darüber keine Sorgen machen. Sehen Sie sie im Frühling
http://static.springource.org/spring/docs/2.5.x/reference/beans.html#beans-annotation-config

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top