Pregunta

Todavía soy bastante nuevo en Spring, y me ha resultado irritante hacer todos estos DAO CRUD, por lo que he creado un '' Clase pública GenericCRUDDAO extiende HibernateDaoSupport implementa CRUDDAO ''. En mis objetos de servicio, simplemente digo algo como

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

y ya no tengo que escribir DAO simples y conectarlos. ¡Hurra! Excepto por una cosa, estoy seguro de que todos los desarrolladores experimentados de Spring ven de inmediato: no puedo obtener la plantilla de Hibernate dentro de GenericCRUDDAO, así que lo hago

HibernateTemplate ht = getHibernateTemplate();

me da un ht que es nulo. No tan bien. Pensé en conectarlo, lo que significa hacer un bean genérico CRUDDAO y luego establecer un AnnotationSessionFactoryBean estático, pero eso todavía no me daría una HibernateTemplate. ¿Alguna sugerencia sobre cómo evito eso para poder tener mi plantilla de Hibernate?

¿Algún otro problema al hacer un CRUD DAO genérico en el que debería pensar?

Saludos

Nik

¿Fue útil?

Solución

Para muchos, HibernateTemplate y HibernateDaoSupport están fuera, y en su lugar se prefiere inyectar una SessionFactory . No todos, eso sí, pero es una tendencia que adopté no hace mucho tiempo, eliminando HibernateTemplate de mi propio DAO genérico.

Este blog tiene un resumen bastante bueno.

Los ejemplos del autor deberían poder ayudarte a llegar a donde quieres estar.

Otros consejos

Caducado genérico

Bueno, para mí, si su GenericDAO es 'genérico', entonces podría necesitar solo una instancia , y hacer todo con esa única instancia.

Estoy seguro de que no te molesta conectarte, es por la repetición que te enojas (y estoy de acuerdo contigo).

Por ejemplo, podría pasar la clase Entity a un método genérico .

  • public void save (Clase, E ...): le permite guardar una o más instancias de tipo E, siendo E una de sus entidades.
  • public E load (Class, Long id): carga una entidad.
  • ...

    /** 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

En nuestras aplicaciones, en realidad tenemos una variante para esto. Debido a que tenemos muchas solicitudes específicas para cada Dao, necesitamos las clases de Dao específicas de todos modos (crear la clase y conectarla), por lo que para evitar el caso especial de un Dao que no se definiría, hacemos las clases de Dao específicas de inmediato.

Codificación

Pero de ninguna manera repetimos el código. Todos nuestros Daos extienden el Genérico, proporcionando en el constructor el parámetro de clase que se necesita. Código de muestra (no completo, simple para obtener la idea básica):

    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) {
        //....
      }
    }

Cableado

Cablear todos los frijoles no es fatal. Hoy en día, hay muchas políticas de autoconexión, no tiene que preocuparse por ello. Véalos en primavera
http: //static.springsource. org / spring / docs / 2.5.x / reference / beans.html # beans-annotation-config

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top