JPA va Spring Data JPA

All lectures for UZ purposes
Daraja, Dars
Mavjud

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:

Java
import java.io.Serializable; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; @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. } 
Kotlin
import java.io.Serializable import javax.persistence.Column import javax.persistence.Entity import javax.persistence.GeneratedValue import javax.persistence.Id @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 } } 
Skanlanishi kerak bo'lgan entity joylashuvlarini @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:

Java
import org.springframework.boot.docs.data.sql.jpaandspringdata.entityclasses.City; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.repository.Repository; public interface CityRepository extends Repository<City, Long> { Page<City> findAll(Pageable pageable); City findByNameAndStateAllIgnoringCase(String name, String state); } 
Kotlin
import org.springframework.boot.docs.data.sql.jpaandspringdata.entityclasses.City import org.springframework.data.domain.Page import org.springframework.data.domain.Pageable import org.springframework.data.repository.Repository 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:

Java
import org.springframework.boot.docs.data.sql.jpaandspringdata.entityclasses.Country; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.repository.Repository; import org.springframework.data.repository.history.RevisionRepository; public interface CountryRepository extends RevisionRepository<Country, Long, Integer>, Repository<Country, Long> { Page<Country> findAll(Pageable pageable); } 
Kotlin
import org.springframework.boot.docs.data.sql.jpaandspringdata.entityclasses.Country import org.springframework.data.domain.Page import org.springframework.data.domain.Pageable import org.springframework.data.repository.Repository import org.springframework.data.repository.history.RevisionRepository 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:

Properties
spring.jpa.hibernate.ddl-auto=create-drop
Yaml
spring:
  jpa:
    hibernate.ddl-auto: "create-drop"
Agar siz eslab qolgan bo'lsangiz, Hibernate'ning bu jarayon uchun quyidagi maxsus ichki xossasi mavjud - 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:
Properties
spring.jpa.properties.hibernate[globally_quoted_identifiers]=true
Yaml
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.

Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION