Spring Framework Java Persistence API (JPA) bilan integratsiyani qo'llab-quvvatlaydi va Hibernate bilan ma'lumotlarga kirish ob'ektlarini (DAO) boshqarish va tranzaksiya strategiyalarini amalga oshirish uchun resurslarni boshqarish uchun tung'ich vositalarni qo'llab-quvvatlaydi. Masalan, Hibernate uchun bir necha qulay IoC-funksiyalari bilan birinchi darajali qo'llab-quvvatlash vositalari mavjud bo'lib, ular Hibernate integratsiyasining ko'plab odatiy muammolarini hal qiladi. Barcha qo'llab-quvvatlanadigan xususiyatlarni OR (ob'ekt-relyatsiya) ko'rsatish vositalari uchun dependency injection yordamida sozlash mumkin. Ular Spring resurslar va tranzaksiyalarini boshqarishda ishtirok etishi mumkin, shuningdek, ularda Spring-da tiplangan DAO tranzaksiyalar va istisnolar ierarxiyalari mavjud. Tavsiya etilgan integratsiya uslubi - oddiy Hibernate yoki JPA API interfeyslari o'rniga DAO-ni kodlash.
Spring ma'lumotlarga kirish ilovalarini yaratishda tanlangan ORM darajasiga sezilarli funksiyalarni qo'shadi. Siz xohlaganingizcha ko'p integratsiya yordamlarini ishlatishingiz mumkin va keyin ushbu integratsiya sa'y-harakatlarni o'zingizga tegishli infratuzilmani yaratish qiymati va xavfi bilan solishtiring. Siz ORMning ko'pchilik yordam vositalarini texnologiyadan qat'i nazar, kutubxonalar kabi ishlatishingiz mumkin, chunki barcha narsa ko'p marta foydalaniladigan JavaBeans to'plamida rivojlantirilgan. IoC-konteyner Springda ORMni konfiguratsiya qilish va nasb etishni osonlashtiradi. Shu tariqa, ushbu bo'limdagi ko'plab misollar Spring konteyneri ichida konfiguratsiyani ko'rsatadi.
Spring Framework yordamida ORM DAO ob'ektlarini yaratishning afzalliklari quyidagilardir:
-
Soddalashtirilgan testlash. Springning IoC yondashuvi
SessionFactoryning Hibernate dan instansiyalarini,DataSourcening JDBC dan instansiyalarini, tranzaksiya boshqaruvchilarini va kerak bo'lganda ko'rsatilgan ob'ektlarni osongina almashtirish imkonini beradi. Bu esa, doimiy saqlash bilan bog'liq bo'lgan har bir kod qismlarini alohida tekshirishni sezilarli darajada osonlashtiradi. -
Umumiy ma'lumotlarga kirish istisnolalari. Spring sizning ORM vositangizdan istisnolarni o'rab, ularni o'ziga xos (potentsial tekshiriladigan) istisnolardan
DataAccessExceptionning umumiy ierarxiyasiga aylantira oladi. Bu xususiyat, odatda tiklanmaydigan doimiy saqlash istisnolarini mos darajalarida, zerikarli istisnolarni tutilishi va e'lon qilmasdan ushlash imkonini beradi. Ammo hali ham zarur bo'lgan joyda istisnolarni ushlash va ishlash mumkin. JDBC istisnolari (shu jumladan, BDga xos dialektlar) ham bir xil ierarxiyaga aylantirilishi mumkinligini unutmang, bu esa JDBC bilan ba'zi amallarni mos dasturlash modeli doirasida bajarish imkonini beradi. -
Umumiy resurslarni boshqarish. Spring ilova kontekstlari
SessionFactoryning Hibernate dan instansiyalarini,EntityManagerFactoryning JPA dan instansiyalarini,DataSourcening JDBC dan instansiyalarini va boshqa tegishli resurslarni joylashuvi va konfiguratsiyasini boshqarishi mumkin. Bu qiymatlarni boshqarish va o'zgartirishni osonlashtiradi. Spring samarali, oddiy va xavfsiz saqlash resurslari bilan ishlash imkonini beradi. Masalan, Hibernate ni ishlatadigan kodda, odatda samaradorlik va to'g'ri tranzaktsiyalarni ishlatish uchun bir xil Hibernate ningSessiondan foydalanish kerak bo'ladi. SpringSessionFactorydan Hibernate orqali joriy oqimgaSessionni osongina yaratishga va bog'lashga imkon beradi. Shu tariqa, Spring har qanday mahalliy yoki tranzaksion JTA muhitida Hibernate ni tipik foydalanishda paydo bo'ladigan ko'plab xronik muammolarni hal qiladi. -
Integratsiyalangan tranzaktsiyalarni boshqarish. ORM kodini aspektga yo'naltirilgan dasturlash (AOP) asosida deklarativ metod tutuvchi bilan o'rash mumkin, ya'ni
@Transactionalannotatsiyasi orqali yoki XML konfiguratsiya faylidagi tranzaktsiyalar uchun AOP-Advice ni aniq sozlash bilan. Har ikki holatda ham tranzaktsiya semantikasi va istisnolarni ishlash (orqaga qaytarish va boshqalar) siz uchun amalga oshiriladi. "Resurs va tranzaksiyalarni boshqarish" bo'limida tavsiflanganidek, ORM bilan bog'liq kodni ta'sir qilmasdan turli tranzaksiya dispetcherlarini almashtirish ham mumkin. Masalan, mahalliy tranzaksiyalar va JTA o'rtasida o'zgartirish mumkin, ikkala stsenariyda ham bir xil to'liq xizmati mavjud bo'ladi (masalan, deklarativ tranzaktsiyalar). Bundan tashqari, JDBC bilan bog'liq kod tamomila tranzaksiyaviy ravishda ORM bilan ishlatilgan kod bilan integratsiya qilinishi mumkin. Bu ma'lumotlarga kirishning ORM ga mos kelmaydigan tashkiloti (masalan, paketli qayta ishlash va BLOB oqimini uzatish) uchun foydali, ammo ORM operatsiyalari bilan umumiy tranzaksiyalarni birgalikda ishlatish zarurati mavjud bo'lsa.
ORM integratsiyasiga umumiy yondashuvlar
Ushbu bo'limda barcha ORM texnologiyalari uchun qo'llaniladigan tavsiyalar ko'rib chiqiladi. Hibernate ga bag'ishlangan bo'limda ko'proq tafsilotlar va ushbu imkoniyatlar va konfiguratsiyalar alohida kontekstda ko'rsatilgan.
Springda ORMni integratsiya qilishning asosiy maqsadi ilovalarni aniq joylashuvi (har qanday ma'lumotlarga kirish texnologiyasi va tranzaksiyalarini) va ilova obyektlarini bo'sh ulashishdir – ma'lumotlarga kirish strategiyasi yoki tranzaksiyalaridan biznes xizmatlarining hech qanday qiyinchiliklarsiz biriktirilishi, resurslarni qat'iy kodlangan izlanishi, qiyin almashtiriladigan singletonlar, shuningdek hech qanday maxsus xizmatlar reyestri holda. Maqsad ilova obyektlarini aniqlash va ulashish uchun oddiy va izchil yondashuvni tashkil qilish, ularni qayta ishlatilishi va konteynerga bog'lanishdan imkon qadar oshirishdir. Ma'lumotlarga kirish bilan bog'liq barcha alohida funksiyalar alohida ishlatilishi mumkin, lekin ular Spring ilova konteksti tushunchasi bilan yaxshi mos keladi, XML asosidagi konfiguratsiyani va oddiy JavaBean instansiyalari bilan aloqalarni taqdim etadi, ulardan Spring bilan mos bo'lishi shart emas. Tipik Spring dasturida ko'plab muhim obyektlar JavaBeansdir: ma'lumotlarga kirish shablonlari, ma'lumotlarga kirish obyektlari, tranzaksiya dispetcherlari, ma'lumotlarga kirish obyektlari va tranzaksiya dispetcherlaridan foydalanadigan biznes xizmatlar, veb ko'rish aniqlagichlari, biznes xizmatlaridan foydalanadigan veb kontrollerlar, va boshqalar.
Resurs va tranzaksiyalarni boshqarish
Tipik biznes ilovalarida resurslarni boshqarish uchun takrorlanuvchi kodning to'plami mavjud. Ko'plab loyihalar o'z yechimlarini o'ylab topishga harakat qiladilar, ba'zan dasturlash qulayligi uchun mos kelmasligi mumkin. Spring, resurslarni to'g'ri ishlash uchun IoC orqali oddiy yechimlarni qo'llab-quvvatlaydi, ya'ni JDBC holatida shablonlash va ORM texnologiyalari uchun AOP interceptorlari qo'llash.
Infratuzilma resurslarni to’g’ri boshqarish va texnologiya API interfeyslariga xos bo’lgan istisnolarni tekshirilmagan infratuzilma istisnolar ierarxiyasiga aylantiradigan to’g’ri xizmat ko’rsatishni ta’minlaydi. Spring har qanday ma'lumotlarga kirish strategiyasi uchun qo'llanilishi mumkin bo'lgan DAO istisnolar ierarxiyasini joriy qiladi. To'g'ridan-to'g'ri JDBC ishlatilgan holda, JdbcTemplate klassi, oldingi bo'limida aytib o'tilgan, SQLException ni DataAccessException ierarxiyasiga o'tish va ma'lumotlar bazasiga xos SQL xato kodlarini ma'noli istisno sinflariga o'zgartirish bilan to'g'ri qayta ishlashni ta'minlaydi. ORM texnologiyalari uchun, keyingi bo'limda shu transformatsiya istisnolarining afzalliklaridan foydalanish haqida o'qing.
Tranzaksiyalarni boshqarish kelganda, JdbcTemplate sinfi Spring tranzaksiyalar yordamini qo'llab-quvvatlaydi va JTA tranzaksiyalarini hamda JDBC tranzaksiyalarini Springning tegishli tranzaksiya dispetcherlari orqali qo'llab-quvvatlaydi. Qo'llab-quvvatlanadigan ORM texnologiyalari bo'yicha, Spring Hibernate va JPA bilan tranzaksiya boshqaruvchilarini va JTA ni qo'llab-quvvatlashni taklif qiladi. Tranzaksiyalarni qo'llab-quvvatlash haqida batafsil "Tranzaksiya boshqaruvi" bobida o'qing.
Istisnolarni o'zgartirish
Agar Hibernate yoki JPA DAOda ishlatilsa, texnologiya bilan bog'liq o'z istisnolar sinfini qanday boshqarish kerakligini hal qilish kerak. DAO HibernateException yoki PersistenceException sinfindan foydalanib, texnologiyaga qarab, joylashtiriladi. Barcha bu istisnolar ishlash vaqtida istisno holatlari va eslatilmasi yoki ushlanishi shart emas. Shuningdek, IllegalArgumentException va IllegalStateException holatlari bilan ham yuzlashishi mumkin. Bu shuni anglatadiki, chaqiruvchi dastur faqat o'ziga xos qo'llab-quvvatlanish tuzilishi va istisno strukturasi strategiyasiga bog'lanmaslikka harakat qilsa, faqat jiddiy deb hisoblangan istisno holatlari bilan ishlashi mumkin. Aniq sabablari (masalan, optimistik bloklash muammosi) faqat chaqiruvchi dastur strategiyasi ta'siridan qochish orqali aniqlanishi mumkin. Bunday murosaga, asosan ORM ga asoslangan dasturlar uchun yoki istisno holatlari bilan alohida ishlashga ehtiyoj yo'q (yoki har ikkalasi ham) mumkin. Biroq, Spring @Repository annotatsiyasi orqali istisnolarni o'zgartirishni shaffof tarzda qo'llash imkonini beradi. Quyidagi misollar (biri Java konfiguratsiyasi uchun, biri XML konfiguratsiyasi uchun) buni qanday qilish mumkinligini ko'rsatadi:
@Repository
public class ProductDaoImpl implements ProductDao {
// класс tanasi bu yеrda...
}
@Repository
class ProductDaoImpl : ProductDao {
// класс tanasi bu yеrda...
}
<beans>
<!-- Istisno postprotsessorini oʻzgartirish uchun bin... -->
<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>
<bean id="myProductDao" class="product.ProductDaoImpl"/>
</beans>
Postprotsessor avtomatik ravishda barcha istisno oʻzgartiruvchilarni ( PersistenceExceptionTranslator interfeysini amalga oshiruvchi) qidiradi va @Repository annotatsiyasi bilan belgilangan barcha binlarga Advice-ni qo‘shadi, shuning uchun aniqlangan o'zgartiruvchilar hosil qilingan istisnolarni qo'lga kiritishi va ularga mos o'zgartirishni qo'llay olishi mumkin.
Umuman olganda, oddiy texnologiya yordamida doimiy saqlash uchun API interfeysi va annotatsiyalar asosida DAO-ni amalga oshirish, Spring tomonidan boshqariladigan tranzaksiyalarning afzalliklarini, dependency injection va istisnolarni shaffof o'zgartirish (istalgan holda) bilan foydalanish mumkin.
GO TO FULL VERSION