برنامه نویسی

EntityManager E Spring Data JPA

EntityManager ، persistencontext etransactional بدون داده های بهاری JPA

هیچ داده های بهاری JPA، ای EntityManager، حاشیه نویسی @PersistenceContext اشمیه @Transactional آنها با هم همکاری می کنند تا عملیات پایداری را به طور کارآمد و ایمن مدیریت کنند. بیایید هر یک از این مؤلفه ها و نحوه ارتباط آنها را درک کنیم.


1⃣ EntityManager: این چیست و از کجا آمده است؟

ای EntityManager این رابط اصلی است API پایداری جاکارتا (JPA) برای مدیریت چرخه زندگی نهادها و تعامل با پایگاه داده. این امکان را برای عملیاتی مانند پایداری ، حذف و مشاوره فراهم می کند.

📌 مبداء EntityManager:

  • ای EntityManager از مشخصات می آید JPA و این فقط یک است رابطبشر
  • اجرای بتن آن به این بستگی دارد ارائه دهنده JPA پیکربندی شده در پروژه (مانند Hibernate ، Eclipselink یا OpenJPA).
  • هیچ چکمه بهاری، Hibernate ارائه دهنده استاندارد است.

📌 گزیده ای از رابط JPA (EntityManager):

package jakarta.persistence;

public interface EntityManager {
    void persist(Object entity);
    <T> T merge(T entity);
    void remove(Object entity);
    <T> T find(Class<T> entityClass, Object primaryKey);
    Query createQuery(String qlString);
    void close();
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

🔹 همانطور که فقط یک رابط است ، زمستان اجرای بتن را فراهم می کند.


1.1 اجرای EntityManager بدون خواب زمستانی

اگر Hibernate ارائه دهنده JPA باشد ، اجرای واقعی EntityManager این کلاس خواهد بود org.hibernate.internal.SessionImplبشر

📌 کلاس واقعی Hibernate (SessionImpl):

package org.hibernate.internal;

import jakarta.persistence.EntityManager;

public class SessionImpl implements EntityManager {
    public void persist(Object entity) {
        // Implementação do persist no Hibernate
    }

    public <T> T merge(T entity) {
        // Implementação do merge no Hibernate
    }

    public void remove(Object entity) {
        // Implementação do remove no Hibernate
    }

    public void close() {
        // Implementação do close no Hibernate
    }
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

🔹 o Hibernate USA SessionImpl اجرای EntityManagerبشر


1.2 با به دست آوردن بهار ، اجرای EntityManager؟

ای چکمه بهاری به طور خودکار پیکربندی می کند EntityManagerFactory، که مواردی از EntityManagerبشر

📌 جریان ایجاد EntityManager بدون چشمه:

JPA (Jakarta Persistence API)
   ↓
EntityManager (Interface)
   ↓
Provider JPA (Ex: Hibernate)
   ↓
Hibernate Session (Implementação real)
   ↓
Spring Boot cria EntityManagerFactory automaticamente
   ↓
EntityManager injetado nos Beans com @PersistenceContext
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

🔹 بهار به طور خودکار چرخه زندگی را مدیریت می کند EntityManagerبشر


2⃣ persystencontext: تزریق EntityManager در بهار

ای بهار به طور خودکار یک EntityManager از طریق حاشیه نویسی توسط کانتینر اداره می شود @PersistenceContextبشر

📌 از مثال استفاده کنید:

import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext;
import org.springframework.stereotype.Repository;

@Repository
public class AutorRepositoryCustom {

    @PersistenceContext
    private EntityManager entityManager;

    public void salvar(Autor autor) {
        entityManager.persist(autor);
    }
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

🔹 o تزریق بهار EntityManager بطور خودکار، و در چارچوب معامله اداره می شود.


3 ⃣ transactional: اطمینان از سازگاری عملیات

حاشیه نویسی @Transactional معاملات را به صورت خودکار مدیریت می کند. در داده های بهار JPA ، این عملیات را تضمین می کند در یک معامله واحد اجرا شدبشر

3.1 چگونه @Transactional؟

وقتی روشی که با آن ذکر شد @Transactional به آن گفته می شود:

  1. بهار معامله ای را باز می کند مجموعه پایگاه دادهبشر
  2. ای EntityManager این با معامله همراه است و می تواند عملیات را انجام دهد.
  3. روش نهایی نیست:
    • اگر خطایی وجود نداشته باشد ، بهار مرتکب می شود معامله
    • اگر یک استثنا رخ دهد ، بازگشت بهار فاز به طور خودکار

📌 مثال استفاده از @Transactional:

import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class AutorService {

    @PersistenceContext
    private EntityManager entityManager;

    @Transactional
    public void criarAutor(Autor autor) {
        entityManager.persist(autor);
    }
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

🔹 بهار وقتی معامله را باز می کند criarAutor در پایان خوانده می شود و بسته می شود.


3.2 تنظیمات پیشرفته @Transactional

حاشیه نویسی @Transactional گزینه های مختلفی برای سفارشی کردن رفتار معامله دارد:

ویژگی شرح
readOnly = true نمایش داده ها را بهینه می کند ، و از روش اطمینان می دهد تغییراتی ایجاد نمی کندبشر
propagation اگر دیگری در حال حاضر وجود داشته باشد ، نحوه رفتار معامله را مشخص می کند.
isolation سطح عایق (کنترل رقابت) را تعریف می کند.
rollbackFor مشخص می کند که کدام استثناء باید باعث بازگشت مجدد شود.
noRollbackFor استثنائاتی را تعریف می کند که هیچ باید باعث بازگشت مجدد شود.

📌 نمونه ای از استفاده پیشرفته:

@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.READ_COMMITTED, rollbackFor = Exception.class)
public void processarTransacao() {
    // Operação no banco de dados
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

🔹 روش همیشه در یک معامله اجرا کنید اشمیه بازگرداندن به هر استثنا


4⃣ مثال کامل: مخزن ، خدمات و معاملات

📌 ایجاد یک مخزن سفارشی با EntityManager

import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext;
import org.springframework.stereotype.Repository;

@Repository
public class AutorRepositoryCustom {

    @PersistenceContext
    private EntityManager entityManager;

    public Autor buscarPorId(Long id) {
        return entityManager.find(Autor.class, id);
    }

    public void salvar(Autor autor) {
        entityManager.persist(autor);
    }
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید


📌 ایجاد یک سرویس با @Transactional

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class AutorService {

    private final AutorRepositoryCustom autorRepository;

    public AutorService(AutorRepositoryCustom autorRepository) {
        this.autorRepository = autorRepository;
    }

    @Transactional
    public void registrarAutor(Autor autor) {
        autorRepository.salvar(autor);
    }
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

🔹 معامله با روش شروع می شود registrarAutor در پایان فراخوانی می شود و بسته می شودبشر


پایان

EntityManager بیا از JPA و توسط stityManagerFective بدون بوت بهار.

@PersistenceContext تزریق EntityManager به طور خودکار

@Transactional تضمین می کند که عملیات در یک معامله اتفاق می افتد.

✔ نه چکمه بهاری، این تنظیمات اتوماتیک هستند ، اما می توانند سفارشی شوند.

🚀 حالا شما می فهمید که چگونه EntityManagerبا @PersistenceContext اشمیه @Transactional آنها روی داده های بهار JPA کار می کنند! 🎯

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا