Получение правильного шаблона Гибернации в общем Spring CRUD DAO

StackOverflow https://stackoverflow.com/questions/1431383

Вопрос

Я все еще новичок в Spring, и меня раздражает создание всех этих CRUD DAO, поэтому я создал "общедоступный класс GenericCRUDDAO расширяет HibernateDaoSupport реализует CRUDDAO".В моих служебных объектах я затем просто говорю что-то вроде

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

и мне больше не нужно писать простые DAO и подключать их.Ура!За исключением одной вещи, я уверен, что все вы, опытные разработчики Spring, сразу это понимаете:Я не могу получить шаблон Гибернации внутри GenericCRUDDAO, поэтому делаю

HibernateTemplate ht = getHibernateTemplate();

дает мне значение ht, которое равно null.Не так уж хорошо.Я думал подключить его, то есть создать компонент genericCRUDDAO, а затем установить статический AnnotationSessionFactoryBean , но это все равно не дало бы мне HibernateTemplate .Есть какие-нибудь предложения о том, как я могу обойти это, чтобы у меня был свой шаблон гибернации?

Есть еще какие-нибудь проблемы с созданием универсального CRUD DAO, о которых мне следует подумать?

Ваше здоровье

Ник

Это было полезно?

Решение

Для многих, HibernateTemplate и HibernateDaoSupport находятся в напряжении, и вместо этого вводят SessionFactory является предпочтительным.Не все, заметьте, но это тенденция, которую я перенял не так давно, удалив HibernateTemplate из моего собственного родового ДАО.

Этот блог имеет довольно хорошее резюме.

Примеры автора должны быть способны помочь вам добраться туда, где вы хотите быть.

Другие советы

Дженерикдао

Ну, для меня, если ваш GenericDAO является "универсальным", то вам может понадобиться только один экземпляр, и делайте все с этим единственным экземпляром.

Я уверен, что вас не смущает прослушивание на примере, именно при повторении вы выходите из себя (и я с вами согласен).

Например, вы могли бы передать класс сущности универсальному методу.

  • общедоступное сохранение пустоты (класс, E ...) :позволяет вам сохранить один или несколько экземпляров типа E, при этом E является одной из ваших сущностей.
  • общедоступная загрузка E (класс, длинный идентификатор) :загружает объект.
  • ...

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

Вариант

В наших приложениях у нас действительно есть вариант для этого.Поскольку у нас есть много конкретных запросов для каждого Dao, нам в любом случае нужны конкретные классы Dao (создайте класс и подключите его), поэтому, чтобы избежать особого случая Dao, который не был бы определен, мы сразу создаем конкретные классы Dao.

Кодирование

Но мы ни в коем случае не повторяем код.Все наши Daos расширяют GenericDAO, предоставляя в конструкторе необходимый параметр класса.Пример кода (не полный, простой для понимания основной идеи):

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

Проводка

Подключение всех компонентов - это не смертельный исход.В настоящее время существует множество политик автоматического подключения, вам не нужно беспокоиться об этом.Посмотрите на них весной
http://static.springsource.org/spring/docs/2.5.x/reference/beans.html#beans-annotation-config

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top