جاوا و تکنولوژی های آن

java programming language

در این وبلاگ به بررسی نکات موجود در جاوا و تکنولوژی های آن می پردازیم

طبقه بندی موضوعی


در این بخش به چگونگی پیاده سازی DAO بوسیله Hibernate و Spring میپردازیم 

از Spring 3 و Hibernate 3.1 دیگر نیازی به استفاده از HibernateTemplate برای مدیریت session نداریم و در حال حاضر از Contextual Session استفاده میشود و Session ها مستقیما توسط Hibernate مدیریت میشوند و در کل یک Scope یک Transaction فعال است این ویژگی امکان جدا کردن پیاده سازی لایه DAO از Spring را فراهم میکند




انتقال و تبدیل Exception ها بدون HibernateTemplate :


انتقال خطاهای تولید شده لایه قبل بر عهده HibernateTemplate بود و همینطور باید به Exception های عمومی Spring تبدیل میشد بدون HibernateTemplate این فرآیند همچنان برای کلیه کلاس های DAO که با Repository@ مشخص شده اند فعال است 

در پشت پرده یک Spring Bean وجود دارد که خطاهای از نوع PersistenceExceptionTranslator تولید شده در Bean های Repository@ را پردازش میکند 


* نکته ای که باید در ذهن بیاد داشته باشیم این است که فرآیند تبدیل خطاها از Proxy استفاده میکند و برای اینکه Spring بتواند از Proxy استفاده کند نباید بصورت final تعریف شوند 




مدیریت Session ها بدون Template :


حمایت Hibernate از Contextual Session باعث شد استفاده از HibernateTemplate منسوخ شود و برای دسترسی به session از ()org.hibernate.SessionFactory#getCurrentSession استفاده کنیم 




کلاس DAO :


یک کلاس ابسترکت DAO که شامل پارامتر های DAO و یکسری عملیات عمومی را در نظر بگیرید که برای هر کلاس Entity قابل ارث بری است 


public abstract class AbstractHibernateDAO< T extends Serializable >{
   private Class< T > clazz;
 
   @Autowired
   private SessionFactory sessionFactory;
 
   public void setClazz(Class< T > clazzToSet) {
      clazz = clazzToSet;
   }
 
   public T findOne(long id) {
      return (T) getCurrentSession().get( clazz, id );
   }
   public List< T > findAll() {
      return getCurrentSession()
       .createQuery( "from " + clazz.getName() ).list();
   }
 
   public void save(T entity) {
      getCurrentSession().persist( entity );
   }
 
   public T update(T entity) {
      return (T) getCurrentSession().merge( entity );
   }
 
   public void delete(T entity) {
      getCurrentSession().delete( entity );
   }
   public void deleteById(long id) {
      final T entity = findOne( id);
      delete( entity );
   }
 
   protected final Session getCurrentSession(){
      return sessionFactory.getCurrentSession();
   }
}


در کد بالا چند نکته جالب وجود دارد 

کلاس abstract DAO ما از هیچ کلاس Template در Spring مانند HibernateTemplate ارث بری نکرده است اما بجاش SessionFactory مستقیما داخل DAO تزریق شده است 

contextual Session از طریق ()this.sessionFactory.getCurrentSession قابل دسترس است 

از طریق constructor کلاس Entity به عنوان پارامتر ورودی دریافت میشود و عملیات روی آن انجام میشود 



حال بیاییم ببینیم چگونه میتوان از این کلاس DAO که abstract بود یک پیاده سازی (Repository@) بسازیم و کلاس entity را به آن پاس بدهیم :


@Repository
public class FooDAO extends AbstractHibernateDAO< Foo > implements IFooDAO{
 
   public FooDAO(){
      setClazz(Foo.class );
   }
}










نظرات  (۰)

هیچ نظری هنوز ثبت نشده است

ارسال نظر

ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی