Spring'da ma'lumotlarga kirish obyekti (Data Access Object/DAO) qo'llab-quvvatlashi ma'lumotlarga kirish texnologiyalari bilan ishlashni soddalashtirishga qaratilgan (JDBC, Hibernate yoki JPA kabi). Bu yuqorida aytilgan doimiy saqlash texnologiyalari orasida oson almashish imkonini beradi va har bir texnologiyaga xos bo'lgan istisnolarni tutib olish haqida qayg'urishga hojat qoldirmaydi.
Izchil istisnolar iyerarhiyasi
Spring texnologiyaga xos bo'lgan istisnolar, masalan, SQLException dan o'zining istisnolar sinflari iyerarhiyasiga o'tishni osonlashtiradi, bu yerda asosiy istisno DataAccessException hisoblanadi. Ushbu istisnolar asl istisnoni qamrab oladi, shuning uchun nima noto'g'ri ketganligi haqida ma'lumot yo'qotish xavfi yo'q.
JDBC istisnolariga qo'shimcha ravishda, Spring JPA va Hibernate'ga xos istisnolarni ham qamrab olib, ularni tashkil etilgan istisnolar to'plamiga aylantiradi. Bu doimiy saqlashning ko'p yaroqsiz istisnolarini mos darajalarda ishlash imkonini beradi, DAO'laringizda klassik "catch-and-throw" bloklari va istisnolar e'lonlaridan qochishga imkon beradi. (Ammo, kerak bo'lganda, har joyda istisnolarni tutish va ishlash mumkin). Yuqorida aytilganidek, JDBC istisnolari (ma'lumotlar bazasiga xos dialektlar ham qo'shilgan) ham shu iyerarxiyaga o'tkaziladi, ya'ni siz JDBC bilan dasturiy modellar doirasida ba'zi operatsiyalarni bajarishingiz mumkin.
Yuqumli izohlar, Springni turli ORM-freymlar uchun qo'llab-quvvatlash vositalarida turli shablon sinflarga ham taalluqlidir. Agar siz interceptorlarga asoslangan sinflardan foydalansangiz, ilova HibernateExceptions va PersistenceExceptions ni o'zi ishlashi kerak, afzal convertHibernateAccessException(..) yoki convertJpaAccessException(..) usullari orqali SessionFactoryUtils vositalariga topshiradi. Ushbu usullar istisnolarni org.springframework.dao istisnolar iyerarxiyasi bilan mos keladigan istisnolarga aylantiradi. PersistenceExceptions tekshirilmaydi, shuning uchun ular ham yaratilishi mumkin (garchi bu holatda DAO istisnolar qamrab olish turli qismlariga tuzilgan holda yo'qotilsa-da).
Quyidagi rasmdan Spring tomonidan taklif etilgan istisnolar iyerarxiyasini ko'rishingiz mumkin. (Rasmdagi klass iyerarxiyasi, faqat DataAccessException umumiy iyerarxiyasining bir qismini ko'rsatadi).
DAO yoki repozitoriy sinflarini sozlash uchun ishlatiladigan annotatsiyalar
Ma'lumotlarga kirish obyekti (DAO) yoki repozitoriylaringiz istisnolarni albatta o'zgartirish (tarjima qilish) qilishini ta'minlashning eng yaxshi yo'li @Repository annotatsiyasidan foydalanishdir. Ushbu annotatsiya, komponentlarni skanerlash vositalariga sizning DAO va repozitoriylaringizni topish va sozlash imkonini beradi, ularga XML konfiguratsiya yozuvlarini taqdim etishga hojat yo'q. Quyidagi misolda, @Repository annotatsiyasidan qanday foydalanishni ko'rsatadi:
@Repository
public class SomeMovieFinder implements MovieFinder {
// ...
}
@Repositoryannotatsiyasi.
@Repository
class SomeMovieFinder : MovieFinder {
// ...
}
@Repositoryannotatsiyasi.
DAO yoki repozitoriyaning har qanday amalga oshirilishi doimiy saqlash texnologiyasiga bog'liq holda doimiy saqlash resursiga kirish imkoniyatiga ega bo'lishi kerak. Masalan, JDBC asosidagi repozitoriy JDBC DataSource'ga kirish kerak, JPA asosidagi saqlash EntityManager'ga kirish kerak. Buning eng oddiy yo'li @Autowired, @Inject, @Resource yoki @PersistenceContext annotatsiyalaridan birini yordamida resursga bog'liqlikni kirgizishdir. Quyidagi misol JPA repozitoriyasiga nisbatan ishlaydi:
@Repository
public class JpaMovieFinder implements MovieFinder {
@PersistenceContext
private EntityManager entityManager;
// ...
}
@Repository
class JpaMovieFinder : MovieFinder {
@PersistenceContext
private lateinit var entityManager: EntityManager
// ...
}
Agar klassik Hibernate API-lari ishlatilsa, SessionFactory'ni quyidagi misolda ko'rsatilganidek kirgizish mumkin:
@Repository
public class HibernateMovieFinder implements MovieFinder {
private SessionFactory sessionFactory;
@Autowired
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
// ...
}
@Repository
class HibernateMovieFinder(private val sessionFactory: SessionFactory) : MovieFinder {
// ...
}
So'nggi misol, biz tipik JDBC qo'llab-quvvatlash vositasiga tegishli. DataSource ini ob'ekt yaratish yoki konstruktor orqali kirgizish mumkin, bu yerda siz JdbcTemplate va boshqa ma'lumotlarga kirish qo'llab-quvvatlash sinflarini (masalan, SimpleJdbcCall va boshqalar), ushbu DataSource dan foydalanib, yaratasiz. Quyidagi misolda DataSource avtomatik ravishda topiladi va bog'lanadi:
@Repository
public class JdbcMovieFinder implements MovieFinder {
private JdbcTemplate jdbcTemplate;
@Autowired
public void init(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
// ...
}
@Repository
class JdbcMovieFinder(dataSource: DataSource) : MovieFinder {
private val jdbcTemplate = JdbcTemplate(dataSource)
// ...
}
GO TO FULL VERSION