Java for Beginner
675 subscribers
554 photos
156 videos
12 files
845 links
Канал от новичков для новичков!
Изучайте Java вместе с нами!
Здесь мы обмениваемся опытом и постоянно изучаем что-то новое!

Наш YouTube канал - https://www.youtube.com/@Java_Beginner-Dev

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
EntityManager

EntityManager — это ключевой интерфейс в Java Persistence API (JPA), который управляет жизненным циклом сущностей (entities). Он предоставляет методы для выполнения операций CRUD (Create, Read, Update, Delete) с сущностями, а также для управления транзакциями и выполнения запросов к базе данных. EntityManager действует как мост между объектами Java и базой данных, автоматически преобразуя объекты в записи базы данных и наоборот.

Как запускается EntityManager в Spring?

Для работы EntityManager в Spring требуется настройка нескольких ключевых объектов. Вот основные компоненты, участвующие в его запуске:

DataSource:
Это объект, представляющий соединение с базой данных. Он содержит информацию о URL, имени пользователя, пароле и других параметрах подключения.

Пример настройки в Spring:
@Bean
public DataSource dataSource() {
return new DriverManagerDataSource(url, username, password);
}


LocalContainerEntityManagerFactoryBean:
Это фабрика для создания EntityManagerFactory. Она настраивает JPA и связывает DataSource с провайдером JPA (например, Hibernate).

Пример настройки:
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource) {
LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
em.setDataSource(dataSource);
em.setPackagesToScan("com.example.domain");
em.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
return em;
}


EntityManagerFactory:
Это фабрика для создания EntityManager. Она управляет метаданными сущностей и настройками JPA.
Создается на основе LocalContainerEntityManagerFactoryBean.

PlatformTransactionManager:
Управляет транзакциями. В Spring используется JpaTransactionManager, который интегрируется с EntityManager.

Пример настройки:
@Bean
public PlatformTransactionManager transactionManager(EntityManagerFactory emf) {
return new JpaTransactionManager(emf);
}


EntityManager:
Создается через EntityManagerFactory. В Spring обычно инжектируется с помощью @PersistenceContext.

Как настраивается EntityManager и для чего нужна его настройка?

Настройка
EntityManager необходима для:
Указания, какие сущности должны быть управляемыми.
Настройки подключения к базе данных.
Управления транзакциями.
Оптимизации производительности (например, кэширование, пул соединений).


Типовые случаи настройки:
Использование Hibernate как провайдера JPA:
Настройка LocalContainerEntityManagerFactoryBean с указанием HibernateJpaVendorAdapter.


Пример:
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource) {
LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
em.setDataSource(dataSource);
em.setPackagesToScan("com.example.domain");
em.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
return em;
}


Настройка кэширования второго уровня:
Включается через свойства JPA или Hibernate.

Пример:
spring.jpa.properties.hibernate.cache.use_second_level_cache=true
spring.jpa.properties.hibernate.cache.region.factory_class=org.hibernate.cache.ehcache.EhCacheRegionFactory


Основные функции EntityManager

Управление жизненным циклом сущностей:
persist(): Добавляет сущность в контекст persistence.
merge(): Обновляет сущность в базе данных.
remove(): Удаляет сущность из базы данных.
find(): Извлекает сущность по первичному ключу.


Выполнение запросов:
createQuery(): Создает JPQL-запрос.
createNativeQuery(): Создает нативный SQL-запрос.


Управление транзакциями:
getTransaction(): Возвращает объект EntityTransaction для управления транзакциями.

Синхронизация с базой данных:
flush(): Синхронизирует изменения с базой данных.
refresh(): Обновляет состояние сущности из базы данных.

#Java #Training #Hard #Spring #SpringDataJPA #EntityManager
Основные методы EntityManager

persist(Object entity):
Добавляет сущность в контекст persistence. Сущность будет сохранена в базе данных при вызове flush() или завершении транзакции.

merge(Object entity):
Обновляет сущность в базе данных. Если сущность не существует, она будет создана.

remove(Object entity):
Удаляет сущность из базы данных.

find(Class<T> entityClass, Object primaryKey):

Извлекает сущность по первичному ключу.

createQuery(String qlString):
Создает JPQL-запрос для работы с сущностями.

flush():
Синхронизирует изменения с базой данных.

refresh(Object entity):
Обновляет состояние сущности из базы данных.

getTransaction():
Возвращает объект EntityTransaction для управления транзакциями.

Как работает EntityManager под капотом?

Контекст Persistence:
EntityManager работает в рамках контекста persistence, который отслеживает состояние сущностей.
Контекст persistence может быть транзакционным (в рамках одной транзакции) или расширенным (в рамках нескольких транзакций).

Отслеживание изменений:
EntityManager отслеживает изменения в сущностях (например, изменение полей) и автоматически генерирует SQL-запросы для синхронизации с базой данных.

Кэширование:
EntityManager использует кэш первого уровня (в рамках одного контекста persistence) для хранения сущностей. Это позволяет избежать повторных запросов к базе данных.

Генерация SQL:
EntityManager использует метаданные сущностей (например, аннотации @Entity, @Column) для генерации SQL-запросов.

Управление транзакциями:
EntityManager интегрируется с EntityTransaction для управления транзакциями. Все операции выполняются в рамках транзакции.

Синхронизация с базой данных:
При вызове flush() все изменения в сущностях синхронизируются с базой данных. Это может происходить автоматически при завершении транзакции.

Ленивая загрузка:
EntityManager поддерживает ленивую загрузку (lazy loading) для связанных сущностей, что позволяет оптимизировать производительность.


#Java #Training #Hard #Spring #SpringDataJPA #EntityManager