Что выведет код?
#Tasks
public class Task010425 {
public static void main(String[] args) {
double x = -2.5;
double result = Math.abs(Math.floor(x));
System.out.println(result);
}
}
#Tasks
Please open Telegram to view this post
VIEW IN TELEGRAM
Вопросы с собеседования 👩💻
Какой метод используется для замены символов в строке?
Какой метод используется для замены символов в строке?
Anonymous Quiz
93%
replace()
7%
swap()
0%
change()
0%
substitute()
Аннотация @Version
Аннотация @Version используется в JPA для реализации оптимистичной блокировки (optimistic locking) - механизма контроля параллельного доступа к данным без использования явных блокировок на уровне базы данных. Находится в пакете javax.persistence.
Параметры аннотации
Аннотация не имеет параметров. Применяется к единственному полю сущности, которое должно быть:
Числовым типом (int, Integer, long, Long)
Типом java.sql.Timestamp
Пример использования
Жизненный цикл аннотации
Инициализация:
При создании сущности поле получает значение 0 (или текущее время для Timestamp)
Обновление:
При каждом обновлении сущности значение автоматически увеличивается на 1
JPA проверяет, что значение в БД совпадает с исходным значением перед обновлением
Конфликт:
Если значение в БД изменилось (другой транзакцией), выбрасывается OptimisticLockException
Механизм работы
При чтении сущности:
При обновлении:
Выполняется SQL вида:
Если версия изменилась:
Количество обновленных строк = 0 → OptimisticLockException
Обработка исключений:
Практическое использование
Базовый сценарий:
Проверка версии вручную:
Использование DTO:
Особенности реализации
Типы полей:
Для числовых типов: последовательное увеличение
Для Timestamp: текущее время сервера
Поведение при:
Создании: устанавливается 0
Клонировании: версия не копируется
Удалении: проверка версии не выполняется (настраивается через @OptimisticLocking)
Производительность:
Минимальные накладные расходы
Не требует блокировок в БД
Альтернативы и дополнения
Пессимистичная блокировка:
Дополнительные аннотации Hibernate:
@OptimisticLocking - для настройки поведения
@DynamicUpdate - обновлять только измененные поля
Кастомные стратегии:
Реализация собственного механизма через @PreUpdate
#Java #Training #Hard #Spring #SpringDataJPA #Version
Аннотация @Version используется в JPA для реализации оптимистичной блокировки (optimistic locking) - механизма контроля параллельного доступа к данным без использования явных блокировок на уровне базы данных. Находится в пакете javax.persistence.
Параметры аннотации
Аннотация не имеет параметров. Применяется к единственному полю сущности, которое должно быть:
Числовым типом (int, Integer, long, Long)
Типом java.sql.Timestamp
Пример использования
@Entity
public class Product {
@Id
private Long id;
@Version
private Integer version;
// другие поля
}
Жизненный цикл аннотации
Инициализация:
При создании сущности поле получает значение 0 (или текущее время для Timestamp)
Обновление:
При каждом обновлении сущности значение автоматически увеличивается на 1
JPA проверяет, что значение в БД совпадает с исходным значением перед обновлением
Конфликт:
Если значение в БД изменилось (другой транзакцией), выбрасывается OptimisticLockException
Механизм работы
При чтении сущности:
Product product = em.find(Product.class, 1L);
// product.version = 1 (текущее значение в БД)
При обновлении:
product.setPrice(newPrice);
em.merge(product);
Выполняется SQL вида:
UPDATE product
SET ..., version = version + 1
WHERE id = 1 AND version = 1
Если версия изменилась:
Количество обновленных строк = 0 → OptimisticLockException
Обработка исключений:
@ExceptionHandler(OptimisticLockException.class)
public ResponseEntity<String> handleConflict(OptimisticLockException ex) {
return ResponseEntity.status(HttpStatus.CONFLICT).body("Объект был изменен другим пользователем");
}
Практическое использование
Базовый сценарий:
@Service
@Transactional
public class ProductService {
public void updatePrice(Long id, BigDecimal newPrice) {
Product product = productRepository.findById(id).orElseThrow();
product.setPrice(newPrice);
// При коммите транзакции версия автоматически увеличится
}
}
Проверка версии вручную:
public void updateWithVersionCheck(Long id, Integer expectedVersion, Product update) {
Product product = productRepository.findById(id).orElseThrow();
if (!product.getVersion().equals(expectedVersion)) {
throw new OptimisticLockException("Версия не совпадает");
}
// ... обновление
}
Использование DTO:
public class ProductDto {
private Long id;
private Integer version;
// другие поля
public Product toEntity() {
Product product = new Product();
product.setId(this.id);
product.setVersion(this.version);
// ...
return product;
}
}
Особенности реализации
Типы полей:
Для числовых типов: последовательное увеличение
Для Timestamp: текущее время сервера
Поведение при:
Создании: устанавливается 0
Клонировании: версия не копируется
Удалении: проверка версии не выполняется (настраивается через @OptimisticLocking)
Производительность:
Минимальные накладные расходы
Не требует блокировок в БД
Альтернативы и дополнения
Пессимистичная блокировка:
@Lock(LockModeType.PESSIMISTIC_WRITE)
Product findByIdForUpdate(Long id);
Дополнительные аннотации Hibernate:
@OptimisticLocking - для настройки поведения
@DynamicUpdate - обновлять только измененные поля
Кастомные стратегии:
Реализация собственного механизма через @PreUpdate
#Java #Training #Hard #Spring #SpringDataJPA #Version
Аннотация @PersistenceContext
Аннотация @PersistenceContext используется для внедрения (inject) контейнера управляемых JPA-сущностей (EntityManager) в Spring-приложение. Она принадлежит к спецификации Jakarta Persistence API (JPA) и находится в пакете jakarta.persistence.
Spring автоматически управляет жизненным циклом EntityManager, обеспечивая корректное открытие и закрытие сессий, а также интеграцию с транзакциями.
Параметры аннотации
name (необязательный)
Тип: String
Описание: Имя единицы персистентности (persistence-unit), если их несколько в persistence.xml.
Пример:
unitName (необязательный)
Тип: String
Описание: Альтернатива name, явно указывает имя persistence-unit.
Пример:
type (необязательный)
Тип: PersistenceContextType (TRANSACTION или EXTENDED)
Значение по умолчанию: TRANSACTION
Описание:
TRANSACTION (по умолчанию): EntityManager привязан к текущей транзакции и закрывается после её завершения.
EXTENDED: EntityManager живет дольше транзакции (используется в Stateful-бинах, например, в JSF).
Пример:
properties (необязательный)
Тип: Map<String, Object>
Описание: Дополнительные свойства для настройки EntityManager (например, hibernate.jdbc.batch_size).
Пример:
Жизненный цикл @PersistenceContext
Инициализация
При старте Spring создает прокси для EntityManager, который делегирует вызовы реальному EntityManager только внутри транзакции.
Если используется EXTENDED, EntityManager сохраняет состояние между транзакциями.
Работа в транзакции
В режиме TRANSACTION (по умолчанию) EntityManager автоматически открывается при старте транзакции (@Transactional) и закрывается после её завершения.
Уничтожение
В режиме TRANSACTION EntityManager закрывается после завершения транзакции.
В режиме EXTENDED EntityManager живет до уничтожения бина (например, при завершении HTTP-сессии в веб-приложении).
Механизмы Spring и настройки Spring Boot
1. Как Spring Boot настраивает EntityManager?
Spring Boot автоматически создает EntityManagerFactory на основе:
Настроек DataSource (из application.properties).
JPA-провайдера (Hibernate по умолчанию).
2. Альтернативные варианты настройки
Несколько источников данных:
Если нужно несколько EntityManager, можно определить несколько @Bean в конфигурации:
Ручное управление транзакциями:
Можно использовать EntityManager без @Transactional, но тогда нужно вручную вызывать em.getTransaction().begin() и commit().
Аннотация @PersistenceUnit
Аннотация @PersistenceUnit используется для внедрения EntityManagerFactory (а не самого EntityManager). Полезна, когда требуется создавать EntityManager вручную.
Параметры
unitName (необязательный) – имя persistence-unit (если их несколько).
Пример использования
Когда использовать @PersistenceUnit вместо @PersistenceContext?
Если нужно полное управление жизненным циклом EntityManager (например, в batch-обработке).
Если требуется несколько EntityManager в одном методе.
#Java #Training #Hard #Spring #SpringDataJPA #PersistenceUnit #PersistenceContext
Аннотация @PersistenceContext используется для внедрения (inject) контейнера управляемых JPA-сущностей (EntityManager) в Spring-приложение. Она принадлежит к спецификации Jakarta Persistence API (JPA) и находится в пакете jakarta.persistence.
Spring автоматически управляет жизненным циклом EntityManager, обеспечивая корректное открытие и закрытие сессий, а также интеграцию с транзакциями.
Параметры аннотации
name (необязательный)
Тип: String
Описание: Имя единицы персистентности (persistence-unit), если их несколько в persistence.xml.
Пример:
@PersistenceContext(name = "myPersistenceUnit")
private EntityManager entityManager;
unitName (необязательный)
Тип: String
Описание: Альтернатива name, явно указывает имя persistence-unit.
Пример:
@PersistenceContext(unitName = "myPersistenceUnit")
private EntityManager entityManager;
type (необязательный)
Тип: PersistenceContextType (TRANSACTION или EXTENDED)
Значение по умолчанию: TRANSACTION
Описание:
TRANSACTION (по умолчанию): EntityManager привязан к текущей транзакции и закрывается после её завершения.
EXTENDED: EntityManager живет дольше транзакции (используется в Stateful-бинах, например, в JSF).
Пример:
@PersistenceContext(type = PersistenceContextType.EXTENDED)
private EntityManager entityManager;
properties (необязательный)
Тип: Map<String, Object>
Описание: Дополнительные свойства для настройки EntityManager (например, hibernate.jdbc.batch_size).
Пример:
@PersistenceContext(properties = {
@PersistenceProperty(name = "hibernate.jdbc.batch_size", value = "20")
})
private EntityManager entityManager;
Жизненный цикл @PersistenceContext
Инициализация
При старте Spring создает прокси для EntityManager, который делегирует вызовы реальному EntityManager только внутри транзакции.
Если используется EXTENDED, EntityManager сохраняет состояние между транзакциями.
Работа в транзакции
В режиме TRANSACTION (по умолчанию) EntityManager автоматически открывается при старте транзакции (@Transactional) и закрывается после её завершения.
Уничтожение
В режиме TRANSACTION EntityManager закрывается после завершения транзакции.
В режиме EXTENDED EntityManager живет до уничтожения бина (например, при завершении HTTP-сессии в веб-приложении).
Механизмы Spring и настройки Spring Boot
1. Как Spring Boot настраивает EntityManager?
Spring Boot автоматически создает EntityManagerFactory на основе:
Настроек DataSource (из application.properties).
JPA-провайдера (Hibernate по умолчанию).
2. Альтернативные варианты настройки
Несколько источников данных:
Если нужно несколько EntityManager, можно определить несколько @Bean в конфигурации:
@Bean
@Primary
public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource) {
LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
em.setDataSource(dataSource);
em.setPackagesToScan("com.example.domain");
em.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
return em;
}
Ручное управление транзакциями:
Можно использовать EntityManager без @Transactional, но тогда нужно вручную вызывать em.getTransaction().begin() и commit().
Аннотация @PersistenceUnit
Аннотация @PersistenceUnit используется для внедрения EntityManagerFactory (а не самого EntityManager). Полезна, когда требуется создавать EntityManager вручную.
Параметры
unitName (необязательный) – имя persistence-unit (если их несколько).
Пример использования
@PersistenceUnit
private EntityManagerFactory emf;
public void someMethod() {
EntityManager em = emf.createEntityManager();
try {
em.getTransaction().begin();
// ... операции с БД ...
em.getTransaction().commit();
} finally {
em.close();
}
}
Когда использовать @PersistenceUnit вместо @PersistenceContext?
Если нужно полное управление жизненным циклом EntityManager (например, в batch-обработке).
Если требуется несколько EntityManager в одном методе.
#Java #Training #Hard #Spring #SpringDataJPA #PersistenceUnit #PersistenceContext
Что выведет код?
#Tasks
import java.util.TreeMap;
public class Task020425 {
public static void main(String[] args) {
TreeMap<String, Integer> map = new TreeMap<>();
map.put("B", 1);
map.put("D", 2);
map.put("A", 3);
map.put("C", 4);
System.out.println(map.firstKey());
}
}
#Tasks
Please open Telegram to view this post
VIEW IN TELEGRAM
Вопросы с собеседования 👩💻
Что такое ключевое слово finally?
Что такое ключевое слово finally?
Anonymous Quiz
16%
Указание на завершение метода
80%
Блок, выполняющийся после try-catch независимо от исключения
4%
Создание нового объекта
0%
Проверка условия
Аннотация @EnableJpaAuditing
Аннотация @EnableJpaAuditing активирует поддержку аудита сущностей JPA в Spring Data. Она позволяет автоматически отслеживать изменения в сущностях, такие как:
Кто создал или изменил запись (createdBy, lastModifiedBy).
Когда запись была создана или изменена (createdDate, lastModifiedDate).
Параметры аннотации
auditorAwareRef (необязательный)
Тип: String
Описание: Указывает имя бина, реализующего интерфейс AuditorAware<T>. Этот бин предоставляет информацию о текущем пользователе (например, из Spring Security).
Пример:
dateTimeProviderRef (необязательный)
Тип: String
Описание: Указывает имя бина, реализующего DateTimeProvider. Позволяет кастомизировать логику получения текущей даты/времени (например, для тестов).
Пример:
setDates (необязательный)
Тип: boolean
Значение по умолчанию: true
Описание: Если false, автоматическое обновление полей createdDate и lastModifiedDate отключается.
modifyOnCreate (необязательный)
Тип: boolean
Значение по умолчанию: true
Описание: Если false, поле lastModifiedDate не обновляется при создании сущности (только createdDate).
Жизненный цикл аудита
Инициализация
При старте приложения Spring ищет классы с @EnableJpaAuditing и регистрирует AuditingEntityListener.
Если указан auditorAwareRef, Spring внедряет соответствующий бин.
Сохранение/обновление сущности
Перед вставкой (@PrePersist) автоматически заполняются:
createdBy и createdDate (если поддерживается).
Перед обновлением (@PreUpdate) заполняются:
lastModifiedBy и lastModifiedDate.
Уничтожение
Аудит не влияет на удаление сущностей, но можно добавить @PreRemove логику вручную.
Механизмы Spring и настройки Spring Boot
1. Как работает аудит в Spring Data JPA?
AuditingEntityListener – JPA-колбек, который обрабатывает события @PrePersist и @PreUpdate.
AuditorAware – интерфейс для получения информации о текущем пользователе.
@CreatedDate, @LastModifiedDate, @CreatedBy, @LastModifiedBy – аннотации для полей сущности.
2. Настройка сущности
3. Конфигурация Spring Boot
Если используется Spring Boot, можно не указывать @EnableJpaAuditing вручную, если:
Есть бин AuditorAware.
Включен spring.data.jpa.repositories.bootstrap-mode=default (по умолчанию).
Пример application.properties:
4. Интеграция с Spring Security
Если приложение использует Spring Security, AuditorAware может возвращать текущего пользователя:
Варианты настройки
Отключение аудита для отдельных полей
Не аннотировать поле @CreatedBy, если оно не нужно.
Кастомные даты
Реализовать DateTimeProvider, если требуется использовать не Instant.now(), а другую временную зону.
Аудит без Spring Security
Можно возвращать фиксированное значение (например, "system"):
#Java #Training #Hard #Spring #SpringDataJPA #EnableJpaAuditing
Аннотация @EnableJpaAuditing активирует поддержку аудита сущностей JPA в Spring Data. Она позволяет автоматически отслеживать изменения в сущностях, такие как:
Кто создал или изменил запись (createdBy, lastModifiedBy).
Когда запись была создана или изменена (createdDate, lastModifiedDate).
Параметры аннотации
auditorAwareRef (необязательный)
Тип: String
Описание: Указывает имя бина, реализующего интерфейс AuditorAware<T>. Этот бин предоставляет информацию о текущем пользователе (например, из Spring Security).
Пример:
@EnableJpaAuditing(auditorAwareRef = "auditorProvider")
@Configuration
public class JpaConfig {
@Bean
public AuditorAware<String> auditorProvider() {
return () -> Optional.of("admin"); // Возвращает текущего пользователя
}
}
dateTimeProviderRef (необязательный)
Тип: String
Описание: Указывает имя бина, реализующего DateTimeProvider. Позволяет кастомизировать логику получения текущей даты/времени (например, для тестов).
Пример:
@EnableJpaAuditing(dateTimeProviderRef = "customDateTimeProvider")
@Configuration
public class JpaConfig {
@Bean
public DateTimeProvider customDateTimeProvider() {
return () -> Optional.of(Instant.now());
}
}
setDates (необязательный)
Тип: boolean
Значение по умолчанию: true
Описание: Если false, автоматическое обновление полей createdDate и lastModifiedDate отключается.
modifyOnCreate (необязательный)
Тип: boolean
Значение по умолчанию: true
Описание: Если false, поле lastModifiedDate не обновляется при создании сущности (только createdDate).
Жизненный цикл аудита
Инициализация
При старте приложения Spring ищет классы с @EnableJpaAuditing и регистрирует AuditingEntityListener.
Если указан auditorAwareRef, Spring внедряет соответствующий бин.
Сохранение/обновление сущности
Перед вставкой (@PrePersist) автоматически заполняются:
createdBy и createdDate (если поддерживается).
Перед обновлением (@PreUpdate) заполняются:
lastModifiedBy и lastModifiedDate.
Уничтожение
Аудит не влияет на удаление сущностей, но можно добавить @PreRemove логику вручную.
Механизмы Spring и настройки Spring Boot
1. Как работает аудит в Spring Data JPA?
AuditingEntityListener – JPA-колбек, который обрабатывает события @PrePersist и @PreUpdate.
AuditorAware – интерфейс для получения информации о текущем пользователе.
@CreatedDate, @LastModifiedDate, @CreatedBy, @LastModifiedBy – аннотации для полей сущности.
2. Настройка сущности
@Entity
@EntityListeners(AuditingEntityListener.class) // Включение аудита
public class User {
@Id
@GeneratedValue
private Long id;
@CreatedDate
private Instant createdDate;
@LastModifiedDate
private Instant lastModifiedDate;
@CreatedBy
private String createdBy;
@LastModifiedBy
private String lastModifiedBy;
}
3. Конфигурация Spring Boot
Если используется Spring Boot, можно не указывать @EnableJpaAuditing вручную, если:
Есть бин AuditorAware.
Включен spring.data.jpa.repositories.bootstrap-mode=default (по умолчанию).
Пример application.properties:
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
4. Интеграция с Spring Security
Если приложение использует Spring Security, AuditorAware может возвращать текущего пользователя:
@Bean
public AuditorAware<String> auditorAware() {
return () -> Optional.ofNullable(SecurityContextHolder.getContext())
.map(SecurityContext::getAuthentication)
.map(Authentication::getName);
}
Варианты настройки
Отключение аудита для отдельных полей
Не аннотировать поле @CreatedBy, если оно не нужно.
Кастомные даты
Реализовать DateTimeProvider, если требуется использовать не Instant.now(), а другую временную зону.
Аудит без Spring Security
Можно возвращать фиксированное значение (например, "system"):
@Bean
public AuditorAware<String> auditorAware() {
return () -> Optional.of("system");
}
#Java #Training #Hard #Spring #SpringDataJPA #EnableJpaAuditing
Аннотация @EntityListeners
Аннотация @EntityListeners является частью спецификации JPA (Jakarta Persistence API) и позволяет привязать кастомные слушатели (listeners) к сущностям JPA.
Эти слушатели могут перехватывать события жизненного цикла сущности, такие как:
@PrePersist (перед сохранением)
@PostPersist (после сохранения)
@PreUpdate (перед обновлением)
@PostUpdate (после обновлением)
@PreRemove (перед удалением)
@PostRemove (после удалением)
@PostLoad (после загрузкой из БД)
Аннотация находится в пакете jakarta.persistence и применяется на уровне класса сущности.
Параметры аннотации
value (обязательный)
Тип: Массив классов (Class<?>[])
Описание: Принимает один или несколько классов-слушателей, которые должны реализовывать callback-методы JPA.
Пример:
Жизненный цикл слушателей
Регистрация слушателей
При загрузке метаданных JPA провайдер (Hibernate) регистрирует указанные классы-слушатели для сущности.
Вызов callback-методов
При наступлении соответствующего события жизненного цикла JPA вызывает методы слушателей в порядке их объявления.
Порядок выполнения
Если для сущности определено несколько слушателей, их методы выполняются в порядке объявления в аннотации.
Глобальные слушатели (зарегистрированные в orm.xml) выполняются после локальных.
Механизмы работы в Spring
1. Интеграция с Spring
Spring автоматически поддерживает DI в JPA Entity Listeners, если они являются Spring-бинами.
Для этого нужно:
Пометить класс-слушатель как @Component
Зарегистрировать его в Spring-контексте
2. Пример Spring-совместимого слушателя
3. Конфигурация в Spring Boot
Spring Boot автоматически настраивает поддержку Entity Listeners через:
Автоконфигурацию JPA (HibernateJpaAutoConfiguration)
Поддержку инъекции зависимостей в слушатели
Варианты использования
1. Аудит изменений
2. Валидация перед сохранением
3. Кеширование
Ограничения и особенности
Контекст выполнения
Callback-методы выполняются в том же контексте транзакции, что и основная операция.
Исключения
Выброс исключения в callback-методе приводит к откату транзакции.
Порядок выполнения
Методы выполняются в порядке:
Callback-методы самой сущности
Локальные @EntityListeners
Глобальные слушатели
DI ограничения
В чистом JPA слушатели не поддерживают инъекцию зависимостей
В Spring DI работает только для Spring-бинов
#Java #Training #Hard #Spring #SpringDataJPA #EntityListeners
Аннотация @EntityListeners является частью спецификации JPA (Jakarta Persistence API) и позволяет привязать кастомные слушатели (listeners) к сущностям JPA.
Эти слушатели могут перехватывать события жизненного цикла сущности, такие как:
@PrePersist (перед сохранением)
@PostPersist (после сохранения)
@PreUpdate (перед обновлением)
@PostUpdate (после обновлением)
@PreRemove (перед удалением)
@PostRemove (после удалением)
@PostLoad (после загрузкой из БД)
Аннотация находится в пакете jakarta.persistence и применяется на уровне класса сущности.
Параметры аннотации
value (обязательный)
Тип: Массив классов (Class<?>[])
Описание: Принимает один или несколько классов-слушателей, которые должны реализовывать callback-методы JPA.
Пример:
@Entity
@EntityListeners({AuditListener.class, CacheInvalidationListener.class})
public class User {
// поля сущности
}
Жизненный цикл слушателей
Регистрация слушателей
При загрузке метаданных JPA провайдер (Hibernate) регистрирует указанные классы-слушатели для сущности.
Вызов callback-методов
При наступлении соответствующего события жизненного цикла JPA вызывает методы слушателей в порядке их объявления.
Порядок выполнения
Если для сущности определено несколько слушателей, их методы выполняются в порядке объявления в аннотации.
Глобальные слушатели (зарегистрированные в orm.xml) выполняются после локальных.
Механизмы работы в Spring
1. Интеграция с Spring
Spring автоматически поддерживает DI в JPA Entity Listeners, если они являются Spring-бинами.
Для этого нужно:
Пометить класс-слушатель как @Component
Зарегистрировать его в Spring-контексте
2. Пример Spring-совместимого слушателя
@Component
public class AuditListener {
@PrePersist
public void prePersist(Object entity) {
System.out.println("PrePersist: " + entity);
}
@PreUpdate
public void preUpdate(Object entity) {
System.out.println("PreUpdate: " + entity);
}
}
3. Конфигурация в Spring Boot
Spring Boot автоматически настраивает поддержку Entity Listeners через:
Автоконфигурацию JPA (HibernateJpaAutoConfiguration)
Поддержку инъекции зависимостей в слушатели
Варианты использования
1. Аудит изменений
public class AuditListener {
@PrePersist
public void setCreationDate(Object entity) {
if (entity instanceof Auditable) {
((Auditable) entity).setCreatedAt(LocalDateTime.now());
}
}
}
2. Валидация перед сохранением
public class ValidationListener {
@PrePersist
@PreUpdate
public void validate(Object entity) {
if (entity instanceof Validatable) {
((Validatable) entity).validate();
}
}
}
3. Кеширование
public class CacheListener {
@PostPersist
@PostUpdate
@PostRemove
public void invalidateCache(Object entity) {
CacheManager.evict(entity.getClass(), entity.getId());
}
}
Ограничения и особенности
Контекст выполнения
Callback-методы выполняются в том же контексте транзакции, что и основная операция.
Исключения
Выброс исключения в callback-методе приводит к откату транзакции.
Порядок выполнения
Методы выполняются в порядке:
Callback-методы самой сущности
Локальные @EntityListeners
Глобальные слушатели
DI ограничения
В чистом JPA слушатели не поддерживают инъекцию зависимостей
В Spring DI работает только для Spring-бинов
#Java #Training #Hard #Spring #SpringDataJPA #EntityListeners
Что выведет код?
#Tasks
import java.util.function.Function;
public class Task030425 {
public static void main(String[] args) {
Function<Integer, Integer> func = x -> x % 2 == 0 ? x * 2 : x / 2;
System.out.println(func.apply(5));
}
}
#Tasks
Please open Telegram to view this post
VIEW IN TELEGRAM
Вопросы с собеседования 👩💻
Какой метод возвращает случайное число от 0 до 1?
Какой метод возвращает случайное число от 0 до 1?
Anonymous Quiz
17%
System.random()
4%
Math.next()
17%
Random.nextDouble()
62%
Math.random()