از 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 );
}
}