سؤال

ما زلت جديدًا تمامًا على الربيع ، وقد وجدت أنه منزعج من صنع كل هذه daos ، لذلك قمت بعمل "GenericCruddao العام يمتد من heibernatedaoSupport ينفذ Cruddao". في كائنات خدمتي ، أقول ببساطة شيئًا مثل

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

ولم يعد عليّ أن أكتب DAOs البسيطة وأسلحها. ياي! باستثناء شيء واحد ، أنا متأكد من أن جميع مطوري الربيع الذي تجربته على الفور: لا يمكنني الحصول على قالب السبات داخل genericcruddao ، لذا فعل ذلك

HibernateTemplate ht = getHibernateTemplate();

يعطيني ht وهو لاغ. ليس جيدا جدا. فكرت في توصيله ، مما يعني صنع حبة genericcruddao ثم وضع تعليقات ثابتة ثابتة ، لكن ذلك لا يزال لا يعطيني hibernateTemplate. أي اقتراحات حول كيفية العمل حول ذلك حتى أتمكن من الحصول على قالب السبات الخاص بي؟

هل هناك أي مشاكل أخرى في صنع Crud Dao عام يجب أن أفكر فيها؟

هتافات

نيك

هل كانت مفيدة؟

المحلول

للكثير، HibernateTemplate و HibernateDaoSupport في الخارج ، وبدلاً من ذلك ، حقن أ SessionFactory مفضل. ليس الجميع ، مانعونك ، لكنه اتجاه ، الذي اعتمدته منذ وقت ليس ببعيد ، يزيلون HibernateTemplate من داو العام الخاص بي.

هذه المدونة لديه ملخص جيد جدا.

يجب أن تكون أمثلة المؤلف قادرة على مساعدتك في الوصول إلى المكان الذي تريد أن تكون فيه.

نصائح أخرى

genericdao

حسنا ، بالنسبة لي ، إذا كان genericdao الخاص بك "عام" ، فقد تحتاج إلى مثيل واحد فقط, ، وافعل كل هذا مثيل واحد.

أنا متأكد من أنه لا يزعجك أن تسلك على سبيل المثال ، إنه في التكرار الذي تشعر بالجنون (وأنا أتفق معك).

فمثلا، يمكنك تمرير فئة الكيان إلى طريقة عامة.

  • Save Public Void (Class ، 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