Java Persistence API - bu relatsion ma'lumotlar bazalariga obyektlarni "map" qilishga imkon beradigan standart texnologiya. spring-boot-starter-data-jpa POM-moduli tezda ish boshlashga imkon beradi. U quyidagi muhim bog'liqliklarni ta'minlaydi:
-
Hibernate JPA ning eng mashhur amalga oshirilishlaridan biridir.
-
Spring Data JPA: JPA asosida repository yaratishga yordam beradi.
-
Spring ORM: Spring Framework ning asosiy ORM qo'llab-quvvatlash vositasi.
An'anaviy ravishda JPA "entity" sinflari persistence.xml faylida beriladi. Spring Bootda bu fayl talab qilinmaydi, uning o'rniga "Entity Scanning" (entity skanlash) ishlatiladi. Default olaraq qidiruv asosiy konfiguratsiya sinfidan (annotatsiya qilingan @EnableAutoConfiguration yoki @SpringBootApplication) pastda joylashgan barcha paketlarda olib boriladi.
@Entity, @Embeddable yoki @MappedSuperclass bilan annotatsiya qilingan har qanday sinflar hisobga olinadi. Oddiy entity sinfi quyidagi misolga o'xshaydi:
@Entity public class City implements Serializable { @Id @GeneratedValue private Long id; @Column(nullable = false) private String name; @Column(nullable = false) private String state; // ... qo'shimcha a'zolar, ko'pincha @OneToMany annotationlarining maplarini o'z ichiga oladi protected City() { // JPA spetsifikatsiyasi talab qiladigan argumentlarsiz konstruktor // protected, chunki bevosita foydalanish uchun mo'ljallanmagan } public City(String name, String state) { this.name = name; this.state = state; } public String getName() { return this.name; } public String getState() { return this.state; } // ... va h.k. }
@Entity class City : Serializable { @Id @GeneratedValue private val id: Long? = null @Column(nullable = false) var name: String? = null private set // ... va h.k. @Column(nullable = false) var state: String? = null private set // ... qo'shimcha a'zolar, ko'pincha @OneToMany annotationlarining maplarini o'z ichiga oladi protected constructor() { // JPA spetsifikatsiyasi talab qiladigan argumentlarsiz konstruktor // protected, chunki bevosita foydalanish uchun mo'ljallanmagan } constructor(name: String?, state: String?) { this.name = name this.state = state } }
@EntityScan annotatsiyasi yordamida sozlash mumkin.
Spring Data JPA Repositorylarlari
Spring Data JPA Repositorylari - bu ma'lumotlarga kirishni ta'minlash uchun aniqlanishi mumkin bo'lgan interfeyslar. JPA so'rovlari metod nomlari asosida avtomatik ravishda yaratiladi. Masalan, CityRepository interfeysi berilgan shtatda barcha shaharlarni topish uchun findAllByState(String state) metodini e'lon qilishi mumkin.
Agar so'rovlar murakkab bo'lsa, metodni Spring Data'ning Query annotatsiyasi yordamida annotatsiya qilish mumkin.
Spring Data Repositorylari odatda Repository yoki CrudRepository interfeyslari orqali kengaytiriladi. Agar siz autokonfiguratsiyadan foydalansangiz, asosiy konfiguratsiya sinfini ( @EnableAutoConfiguration yoki @SpringBootApplication bilan annotatsiyalangan) o'z ichiga olgan paketdan pastga ko'tarilgan holda qidirish amalga oshiriladi.
Quyidagi misolda Spring Data repository bilan o'zaro ta'sir interfeysining tipik aniqlanishi ko'rsatilgan:
public interface CityRepository extends Repository<City, Long> { Page<City> findAll(Pageable pageable); City findByNameAndStateAllIgnoringCase(String name, String state); }
interface CityRepository : Repository<City?, Long?> { fun findAll(pageable: Pageable?): Page<City?>? fun findByNameAndStateAllIgnoringCase(name: String?, state: String?): City? }
Spring Data JPA Repositorylari uch xil boshlang'ich yuklash rejimini qo'llab-quvvatlaydi: default, lazy va deferred. Deferred yoki lazy yuklashni faollashtirish uchun spring.data.jpa.repositories.bootstrap-mode xossasini deferred yoki lazy qiymatga o'rnating. Deferred yoki lazy yuklashda, autokonfiguratsiyalangan EntityManagerFactoryBuilder kontekstning AsyncTaskExecutor ni yuklash executori sifatida qo'llaydi, agar mavjud bo'lsa. Bitta executor'lar mavjud bo'lsa, applicationTaskExecutor nomli mavjud bo'lgan executor ishlatiladi.
Deferred yoki lazy yuklashda JPA infratuzilmasiga kirish ilova konteksti boshlang'ich bosqichidan keyin kechiktirilishini ta'minlash kerak. Har qanday JPA infratuzilmasini talab qiladigan boshlang'ich chaqiruvlar uchun SmartInitializingSingleton dan foydalanishingiz mumkin. Spring binalari sifatida yaratilgan JPA komponentlari uchun (masalan, konverterlar), mavjud bo'lsa, ObjectProvider yordamida bog'liqliklarni kechiktirish uchun foydalaning.
Spring Data Envers Repositorylarlari
Agar Spring Data Envers mavjud bo'lsa, JPA Repositorylarlari avtomatik tarzda odatdagi Envers so'rovlarini qo'llab-quvvatlash uchun konfiguratsiyalanadi.
Spring Data Envers dan foydalanish uchun, quyida ko'rsatilganidek, RevisionRepository dan kengaytirilgan Repositoryni aniqlang:
public interface CountryRepository extends RevisionRepository<Country, Long, Integer>, Repository<Country, Long> { Page<Country> findAll(Pageable pageable); }
interface CountryRepository : RevisionRepository<Country?, Long?, Int>, Repository<Country?, Long?> { fun findAll(pageable: Pageable?): Page<Country?>? }
JPA Ma'lumot Bazalarini Yaratish va O'chirish
Default bo'lganda JPA ma'lumotlar bazalari avtomatik tarzda yaratiladi, faqat agar siz ichki ma'lumotlar bazasidan foydalansangiz (H2, HSQL yoki Derby). Siz JPA sozlamalarini spring.jpa.* xossalari yordamida aniq sozlashingiz mumkin. Masalan, jadvallarni yaratish va o'chirish uchun application.properties ga quyidagi qatorni qo'shishingiz mumkin:
spring.jpa.hibernate.ddl-auto=create-drop
spring:
jpa:
hibernate.ddl-auto: "create-drop"
hibernate.hbm2ddl.auto. Siz Spring binalar manageriga qo'shishdan oldin
spring.jpa.properties.* yordamida boshqa native Hibernate xossalari bilan birga o'rnatishingiz mumkin. Quyidagi qatorda Hibernate uchun JPA xossalari o'rnatilishining misoli ko'rsatilgan:
spring.jpa.properties.hibernate[globally_quoted_identifiers]=true
spring:
jpa:
properties:
hibernate:
"globally_quoted_identifiers": "true"
Yuqoridagi misolda ko'rsatilgan qator Hibernate entity manageriga hibernate.globally_quoted_identifiers xossasiga true qiymatini uzatadi.
Default bo'lganda DDL bajarilishi (yoki validatsiyasi) ApplicationContext ishga tushgunga qadar kechiktiriladi. spring.jpa.generate-ddl degan flag ham mavjud, lekin agar Hibernate autokonfiguratsiyasi faol bo'lsa, bu flag ishlatilmaydi, chunki ddl-auto sozlamalari ancha aniqlanadi.
Ko'rinishda EntityManager ochish
Agar siz veb-dastur ishga tushirsangiz, Spring Boot default bo'lganda Entity Managerni ko'rinishda ochish (Open EntityManager in View) shablonini qo'llash uchun OpenEntityManagerInViewInterceptor registratsiya qiladi, bu esa veb-ko'rinishlarda deferred yuklashni ta'minlaydi. Agar sizga bu turdagi ish kerak bo'lmasa, application.properties da spring.jpa.open-in-viewnima false ga o'rnatishingiz kerak.
GO TO FULL VERSION