از Spring 3.1 به بعد استفاده از JpaTemplate و طبیعتا JpaDaoSupport به نفع Java Persistence API منسوخ شده اند
انتقال و تبدیل Exception ها بدون Template :
یکی از وظایف JpaTemplate انتقال و تبدیل Exception های low-level به سطح بالاتر Spring بود. بدون Template این فرآیند همچنان برای کلیه کلاس های DAO که با Repository@ مشخص شده اند فعال است
در پشت پرده یک Spring Bean وجود دارد که خطاهای از نوع PersistenceExceptionTranslator تولید شده در Bean های Repository@ را پردازش میکند
* نکته ای که باید در ذهن بیاد داشته باشیم این است که فرآیند تبدیل خطاها از Proxy استفاده میکند و برای اینکه Spring بتواند از Proxy استفاده کند نباید بصورت final تعریف شوند
کلاس DAO :
یک کلاس ابسترکت DAO که شامل پارامتر های DAO و یکسری عملیات عمومی را در نظر بگیرید که برای هر کلاس Entity قابل ارث بری است
public abstract class AbstractJpaDAO< T extends Serializable > { private Class< T > clazz; @PersistenceContext EntityManager entityManager; public final void setClazz( Class< T > clazzToSet ){ this.clazz = clazzToSet; } public T findOne( long id ){ return entityManager.find( clazz, id ); } public List< T > findAll(){ return entityManager.createQuery( "from " + clazz.getName() ) .getResultList(); } public void create( T entity ){ entityManager.persist( entity ); } public T update( T entity ){ return entityManager.merge( entity ); } public void delete( T entity ){ entityManager.remove( entity ); } public void deleteById( long entityId ){ T entity = findOne( entityId ); delete( entity ); } }
مهمترین ویژگی اش تزریق EntityManager بوسیله PersistenceContext@ است که بوسیله کلاس PersistenceAnnotationBeanPostProcessor کنترل میشود
استفاده از کلاس DAO :
@Repository public class FooDAO extends AbstractJPADAO< Foo > implements IFooDAO{ public FooDAO(){ setClazz(Foo.class ); } }