EntityManager
EntityManager JPA ka CORE, LOW-LEVEL interface hai — Spring Data JPA repositories INTERNALLY EntityManager use karte hain. Normal CRUD operations ke liye, EntityManager DIRECTLY touch karne ki zaroorat NAHI (repositories kaafi hain) — lekin ADVANCED scenarios mein (dynamic queries, batch processing, fine-grained control) zaroorat pad sakti hai.
EntityManager ek "Persistence Context" bhi maintain karta hai — EK TRANSACTION ke SCOPE mein, ek SESSION-level cache. Agar SAME entity DO BAAR fetch ki jaaye EK transaction ke andar, DUSRI baar database call NAHI hoti.
@Repository
public class CustomUserRepository {
@PersistenceContext
private EntityManager entityManager;
public List<User> searchDynamic(String field, String value) {
// Complex, DYNAMIC query jo repository naming se express nahi ho sakti:
return entityManager.createQuery(
"SELECT u FROM User u WHERE u." + field + " = :value", User.class)
.setParameter("value", value)
.getResultList();
}
}- EntityManager = JPA ka CORE, low-level API
- Repositories INTERNALLY EntityManager use karte hain
- Persistence Context = transaction-scoped first-level cache
EntityManager JPA ka CORE interface hai — entity ko PERSIST (save), FIND (fetch by ID), MERGE (update), REMOVE (delete) karne ke liye. Spring Data JPA repositories internally EntityManager USE karte hain — application code zyaadatar directly EntityManager touch nahi karta, lekin ADVANCED, custom scenarios mein zaroorat pad sakti hai.
@PersistenceContext
private EntityManager entityManager;
public User findUserDetailed(Long id) {
return entityManager.find(User.class, id);
}EntityManager ek "Persistence Context" maintain karta hai — ek SESSION-SCOPED CACHE. Agar EK HI transaction ke andar, same entity DO BAAR fetch ki jaaye, DUSRI baar DATABASE call NAHI hoti — persistence context se hi mil jaati hai. Isse UNNECESSARY database round-trips AVOID hote hain.