HMAC (Hash-based Message Authentication Code)
HMAC — это механизм проверки целостности данных и аутентификации отправителя.
Основан на криптографических хеш-функциях (SHA-256, SHA-512).
Использует секретный ключ, что делает его безопаснее обычного хеширования.
Как работает HMAC
Клиент и сервер имеют секретный ключ.
Отправитель вычисляет HMAC от сообщения с этим ключом.
Получатель повторно вычисляет HMAC и проверяет совпадение.
Реализация HMAC в Java
Генерация HMAC (SHA-256)
Вывод:
Проверка HMAC
Где применяется HMAC
Аутентификация API-запросов
Многие API используют HMAC для подписи запросов (например, AWS, Binance API).
Клиент вычисляет HMAC и отправляет вместе с запросом.
Сервер проверяет правильность HMAC.
Целостность сообщений в TLS/SSL
В TLS 1.2 использовался HMAC для проверки целостности передаваемых данных.
Подпись JSON Web Tokens (JWT)
JWT использует HMAC для подписи (HMAC-SHA256).
Сервер проверяет подпись перед обработкой запроса.
Хранение паролей в базе данных
HMAC можно использовать для защиты паролей перед хешированием.
#Java #Training #Medium #Java_Crypto_API #HMAC
HMAC — это механизм проверки целостности данных и аутентификации отправителя.
Основан на криптографических хеш-функциях (SHA-256, SHA-512).
Использует секретный ключ, что делает его безопаснее обычного хеширования.
Как работает HMAC
Клиент и сервер имеют секретный ключ.
Отправитель вычисляет HMAC от сообщения с этим ключом.
Получатель повторно вычисляет HMAC и проверяет совпадение.
Реализация HMAC в Java
Генерация HMAC (SHA-256)
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
public class HmacExample {
public static void main(String[] args) throws Exception {
String message = "Hello, Java Crypto API!";
String secretKey = "my_secret_key";
// Создание HMAC SHA-256
Mac mac = Mac.getInstance("HmacSHA256");
SecretKeySpec keySpec = new SecretKeySpec(secretKey.getBytes(), "HmacSHA256");
mac.init(keySpec);
// Вычисление HMAC
byte[] hmacBytes = mac.doFinal(message.getBytes());
String hmacBase64 = Base64.getEncoder().encodeToString(hmacBytes);
System.out.println("HMAC (Base64): " + hmacBase64);
}
}
Вывод:
HMAC (Base64): q8phcxg9DpPpMfKkczjRkkv6OiOBv2YoTbYJ46qZaYc=
Проверка HMAC
public static boolean verifyHmac(String message, String receivedHmac, String secretKey) throws Exception {
Mac mac = Mac.getInstance("HmacSHA256");
SecretKeySpec keySpec = new SecretKeySpec(secretKey.getBytes(), "HmacSHA256");
mac.init(keySpec);
// Вычисляем HMAC заново
byte[] hmacBytes = mac.doFinal(message.getBytes());
String computedHmac = Base64.getEncoder().encodeToString(hmacBytes);
// Сравниваем с полученным HMAC
return computedHmac.equals(receivedHmac);
}
Где применяется HMAC
Аутентификация API-запросов
Многие API используют HMAC для подписи запросов (например, AWS, Binance API).
Клиент вычисляет HMAC и отправляет вместе с запросом.
Сервер проверяет правильность HMAC.
Целостность сообщений в TLS/SSL
В TLS 1.2 использовался HMAC для проверки целостности передаваемых данных.
Подпись JSON Web Tokens (JWT)
JWT использует HMAC для подписи (HMAC-SHA256).
Сервер проверяет подпись перед обработкой запроса.
Хранение паролей в базе данных
HMAC можно использовать для защиты паролей перед хешированием.
#Java #Training #Medium #Java_Crypto_API #HMAC
Продолжим изучение Spring в углубленных статьях.
Объектно-реляционное отображение (ORM - Object-Relational Mapping)
1. Что такое ORM?
ORM (Object-Relational Mapping) — это технология, которая позволяет программам работать с реляционной базой данных, используя объектно-ориентированный подход. Она автоматически преобразует объекты языка программирования (например, Java-классы) в строки таблиц базы данных и обратно.
Основные задачи ORM:
Автоматическое сопоставление объектов с таблицами базы данных.
Управление состояниями объектов (создание, обновление, удаление, чтение).
Оптимизация работы с БД за счёт кеширования и ленивой загрузки.
Генерация SQL-запросов без необходимости их явного написания.
2. Как работает ORM?
Работа ORM состоит из нескольких ключевых этапов:
2.1. Анализ классов сущностей
При запуске приложения ORM-провайдер анализирует классы, помеченные аннотациями (например, @Entity в JPA/Hibernate), и строит их соответствие с таблицами базы данных.
Пример класса-сущности:
ORM анализирует этот класс и определяет:
Таблица называется users.
Поле id — первичный ключ с автоинкрементом.
Поле username обязательно (nullable = false).
Поле email должно быть уникальным.
2.2. Генерация SQL-запросов
При выполнении операций с объектами ORM автоматически генерирует SQL-запросы.
Например:
Этот код сгенерирует SQL-запрос:
Если позже мы изменим объект и сохраним его, ORM выполнит UPDATE:
2.3. Управление состояниями объектов
Каждый объект, управляемый ORM, может находиться в одном из четырёх состояний:
Transient - Объект создан, но не сохранён в БД.
Managed - Объект привязан к контексту EntityManager.
Detached - Объект был сохранён, но теперь отсоединён.
Removed - Объект помечен для удаления.
Пример:
2.4. Кеширование
ORM использует кеширование для уменьшения нагрузки на базу данных.
Первичный кеш (L1 Cache): Внутри EntityManager. Если объект уже загружен, он не запрашивается заново.
Вторичный кеш (L2 Cache): Глобальный кеш, доступный для всех EntityManager.
Пример:
2.5. Ленивые (Lazy) и Жадные (Eager) загрузки
ORM позволяет загружать связанные данные жадно (EAGER) или лениво (LAZY).
Пример:
LAZY — данные загружаются только при обращении к orders.
EAGER — данные загружаются сразу при запросе User.
3. Виды ORM и их отличия
3.1. Полноценные ORM (с динамическим SQL)
Автоматически генерируют SQL-запросы и управляют объектами:
Hibernate (Spring Data JPA)
EclipseLink
TopLink
3.2. Полу-ORM (с маппингом, но без генерации SQL)
Работают с SQL, но помогают преобразовывать результаты в объекты:
MyBatis (требует явного написания SQL)
3.3. Lightweight ORM (обёртки над JDBC)
Spring JdbcTemplate — облегчённая обёртка над JDBC, но без автоматического маппинга.
#Java #Training #Spring #SpringDataJPA #ORM
Объектно-реляционное отображение (ORM - Object-Relational Mapping)
1. Что такое ORM?
ORM (Object-Relational Mapping) — это технология, которая позволяет программам работать с реляционной базой данных, используя объектно-ориентированный подход. Она автоматически преобразует объекты языка программирования (например, Java-классы) в строки таблиц базы данных и обратно.
Основные задачи ORM:
Автоматическое сопоставление объектов с таблицами базы данных.
Управление состояниями объектов (создание, обновление, удаление, чтение).
Оптимизация работы с БД за счёт кеширования и ленивой загрузки.
Генерация SQL-запросов без необходимости их явного написания.
2. Как работает ORM?
Работа ORM состоит из нескольких ключевых этапов:
2.1. Анализ классов сущностей
При запуске приложения ORM-провайдер анализирует классы, помеченные аннотациями (например, @Entity в JPA/Hibernate), и строит их соответствие с таблицами базы данных.
Пример класса-сущности:
Редактировать
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "username", nullable = false)
private String username;
@Column(name = "email", unique = true)
private String email;
}
ORM анализирует этот класс и определяет:
Таблица называется users.
Поле id — первичный ключ с автоинкрементом.
Поле username обязательно (nullable = false).
Поле email должно быть уникальным.
2.2. Генерация SQL-запросов
При выполнении операций с объектами ORM автоматически генерирует SQL-запросы.
Например:
User user = new User();
user.setUsername("john_doe");
user.setEmail("john@example.com");
userRepository.save(user);
Этот код сгенерирует SQL-запрос:
INSERT INTO users (username, email) VALUES ('john_doe', 'john@example.com');
Если позже мы изменим объект и сохраним его, ORM выполнит UPDATE:
user.setEmail("new_email@example.com");
userRepository.save(user);
UPDATE users SET email = 'new_email@example.com' WHERE id = 1;
Разработчик не пишет SQL-код вручную — ORM делает это автоматически.
2.3. Управление состояниями объектов
Каждый объект, управляемый ORM, может находиться в одном из четырёх состояний:
Transient - Объект создан, но не сохранён в БД.
Managed - Объект привязан к контексту EntityManager.
Detached - Объект был сохранён, но теперь отсоединён.
Removed - Объект помечен для удаления.
Пример:
User user = new User(); // Transient
user.setUsername("Alice");
entityManager.persist(user); // Managed
entityManager.detach(user); // Detached
entityManager.remove(user); // Removed
2.4. Кеширование
ORM использует кеширование для уменьшения нагрузки на базу данных.
Первичный кеш (L1 Cache): Внутри EntityManager. Если объект уже загружен, он не запрашивается заново.
Вторичный кеш (L2 Cache): Глобальный кеш, доступный для всех EntityManager.
Пример:
User user1 = entityManager.find(User.class, 1); // SQL выполняется
User user2 = entityManager.find(User.class, 1); // Берётся из кеша
Первый запрос загрузит данные из БД, второй возьмёт их из памяти.
2.5. Ленивые (Lazy) и Жадные (Eager) загрузки
ORM позволяет загружать связанные данные жадно (EAGER) или лениво (LAZY).
Пример:
@Entity
public class User {
@OneToMany(mappedBy = "user", fetch = FetchType.LAZY)
private List<Order> orders;
}
LAZY — данные загружаются только при обращении к orders.
EAGER — данные загружаются сразу при запросе User.
User user = userRepository.findById(1L).get();
List<Order> orders = user.getOrders(); // SQL-запрос будет только здесь, если Lazy
3. Виды ORM и их отличия
3.1. Полноценные ORM (с динамическим SQL)
Автоматически генерируют SQL-запросы и управляют объектами:
Hibernate (Spring Data JPA)
EclipseLink
TopLink
3.2. Полу-ORM (с маппингом, но без генерации SQL)
Работают с SQL, но помогают преобразовывать результаты в объекты:
MyBatis (требует явного написания SQL)
3.3. Lightweight ORM (обёртки над JDBC)
Spring JdbcTemplate — облегчённая обёртка над JDBC, но без автоматического маппинга.
#Java #Training #Spring #SpringDataJPA #ORM
Что выведет код?
#Tasks
public class Task270225 {
public static void main(String[] args) {
List<Integer> list = new LinkedList<>();
list.add(1);
list.add(2);
list.add(3);
(list).removeFirst();
list.remove(1);
System.out.println(list);
}
}
#Tasks
Если она его убьет в аду, ее заставят еще один блокнот написать? 🧐 🤣
https://t.me/Java_for_beginner_dev
#Mems
https://t.me/Java_for_beginner_dev
#Mems
Please open Telegram to view this post
VIEW IN TELEGRAM
Вопросы с собеседования 👩💻
Какой метод используется для преобразования строки в нижний регистр?
Какой метод используется для преобразования строки в нижний регистр?
Anonymous Quiz
81%
toLowerCase()
7%
toUpperCase()
7%
toLower()
5%
convertToLower()
EntityManager
EntityManager — это ключевой интерфейс в Java Persistence API (JPA), который управляет жизненным циклом сущностей (entities). Он предоставляет методы для выполнения операций CRUD (Create, Read, Update, Delete) с сущностями, а также для управления транзакциями и выполнения запросов к базе данных. EntityManager действует как мост между объектами Java и базой данных, автоматически преобразуя объекты в записи базы данных и наоборот.
Как запускается EntityManager в Spring?
Для работы EntityManager в Spring требуется настройка нескольких ключевых объектов. Вот основные компоненты, участвующие в его запуске:
DataSource:
Это объект, представляющий соединение с базой данных. Он содержит информацию о URL, имени пользователя, пароле и других параметрах подключения.
Пример настройки в Spring:
LocalContainerEntityManagerFactoryBean:
Это фабрика для создания EntityManagerFactory. Она настраивает JPA и связывает DataSource с провайдером JPA (например, Hibernate).
Пример настройки:
EntityManagerFactory:
Это фабрика для создания EntityManager. Она управляет метаданными сущностей и настройками JPA.
Создается на основе LocalContainerEntityManagerFactoryBean.
PlatformTransactionManager:
Управляет транзакциями. В Spring используется JpaTransactionManager, который интегрируется с EntityManager.
Пример настройки:
EntityManager:
Создается через EntityManagerFactory. В Spring обычно инжектируется с помощью @PersistenceContext.
Как настраивается EntityManager и для чего нужна его настройка?
Настройка EntityManager необходима для:
Указания, какие сущности должны быть управляемыми.
Настройки подключения к базе данных.
Управления транзакциями.
Оптимизации производительности (например, кэширование, пул соединений).
Типовые случаи настройки:
Использование Hibernate как провайдера JPA:
Настройка LocalContainerEntityManagerFactoryBean с указанием HibernateJpaVendorAdapter.
Пример:
Настройка кэширования второго уровня:
Включается через свойства JPA или Hibernate.
Пример:
Основные функции EntityManager
Управление жизненным циклом сущностей:
persist(): Добавляет сущность в контекст persistence.
merge(): Обновляет сущность в базе данных.
remove(): Удаляет сущность из базы данных.
find(): Извлекает сущность по первичному ключу.
Выполнение запросов:
createQuery(): Создает JPQL-запрос.
createNativeQuery(): Создает нативный SQL-запрос.
Управление транзакциями:
getTransaction(): Возвращает объект EntityTransaction для управления транзакциями.
Синхронизация с базой данных:
flush(): Синхронизирует изменения с базой данных.
refresh(): Обновляет состояние сущности из базы данных.
#Java #Training #Hard #Spring #SpringDataJPA #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
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
@Entity
Аннотация @Entity является частью Java Persistence API (JPA) и используется для обозначения класса как сущности, которая может быть сохранена в базе данных. Сущность — это объект, который отображается на таблицу в реляционной базе данных. Аннотация @Entity указывает, что класс должен быть управляемым JPA и что его экземпляры могут быть сохранены, обновлены, удалены или извлечены из базы данных.
Ранее аннотация @Entity находилась в пакете javax.persistence, который является частью стандартной библиотеки JPA. Начиная с Java EE 7 и Jakarta EE 8, пакет был переименован в jakarta.persistence. Таким образом, в зависимости от версии JPA, аннотация может быть импортирована следующим образом:
Для JPA 2.x и ниже:
Для JPA 3.x и выше (Jakarta Persistence):
Параметры аннотации
Аннотация @Entity не имеет параметров. Однако она тесно связана с другими аннотациями, которые определяют поведение сущности:
@Table:
Используется для указания имени таблицы в базе данных, на которую отображается сущность.
@Id:
Указывает на поле, которое является первичным ключом сущности.
@Column:
Используется для настройки отображения поля на колонку таблицы.
@GeneratedValue:
Указывает стратегию генерации значений для первичного ключа.
Жизненный цикл сущности
Сущности в JPA проходят через несколько состояний, которые управляются EntityManager. Эти состояния определяют, как сущность взаимодействует с базой данных и контекстом persistence.
New (Transient):
Сущность только что создана с помощью оператора new, но еще не связана с EntityManager.
Она не имеет представления в базе данных.
Пример:
Managed (Persistent):
Сущность связана с EntityManager и управляется им.
Любые изменения в сущности будут автоматически синхронизированы с базой данных при вызове flush() или завершении транзакции.
Пример:
Detached:
Сущность больше не управляется EntityManager, но продолжает существовать в базе данных.
Это может произойти после закрытия EntityManager или вызова detach().
Пример:
Removed:
Сущность помечена на удаление и будет удалена из базы данных при следующем вызове flush() или завершении транзакции.
Пример:
Настройки Spring Boot, влияющие на @Entity
Spring Boot предоставляет множество настроек, которые влияют на работу сущностей и JPA. Эти настройки обычно указываются в файле application.properties или application.yml.
Настройки источника данных (DataSource):
Эти настройки определяют, как Spring Boot подключается к базе данных.
Пример:
Настройки JPA:
Эти настройки влияют на поведение JPA и Hibernate.
Пример:
Параметр ddl-auto может принимать следующие значения:
none: Никаких изменений в схеме базы данных не вносится.
create: Схема базы данных создается заново при каждом запуске приложения.
update: Схема базы данных обновляется в соответствии с текущими сущностями.
create-drop: Схема создается при запуске и удаляется при завершении работы приложения.
validate: Проверяется, соответствует ли схема базы данных сущностям.
Сканирование сущностей:
Spring Boot автоматически сканирует пакеты на наличие классов, помеченных аннотацией @Entity.
Если сущности находятся в другом пакете, можно указать его вручную:
#Java #Training #Hard #Spring #SpringDataJPA #Entity
Аннотация @Entity является частью Java Persistence API (JPA) и используется для обозначения класса как сущности, которая может быть сохранена в базе данных. Сущность — это объект, который отображается на таблицу в реляционной базе данных. Аннотация @Entity указывает, что класс должен быть управляемым JPA и что его экземпляры могут быть сохранены, обновлены, удалены или извлечены из базы данных.
Ранее аннотация @Entity находилась в пакете javax.persistence, который является частью стандартной библиотеки JPA. Начиная с Java EE 7 и Jakarta EE 8, пакет был переименован в jakarta.persistence. Таким образом, в зависимости от версии JPA, аннотация может быть импортирована следующим образом:
Для JPA 2.x и ниже:
import javax.persistence.Entity;
Для JPA 3.x и выше (Jakarta Persistence):
import jakarta.persistence.Entity;
Параметры аннотации
Аннотация @Entity не имеет параметров. Однако она тесно связана с другими аннотациями, которые определяют поведение сущности:
@Table:
Используется для указания имени таблицы в базе данных, на которую отображается сущность.
@Id:
Указывает на поле, которое является первичным ключом сущности.
@Column:
Используется для настройки отображения поля на колонку таблицы.
@GeneratedValue:
Указывает стратегию генерации значений для первичного ключа.
Жизненный цикл сущности
Сущности в JPA проходят через несколько состояний, которые управляются EntityManager. Эти состояния определяют, как сущность взаимодействует с базой данных и контекстом persistence.
New (Transient):
Сущность только что создана с помощью оператора new, но еще не связана с EntityManager.
Она не имеет представления в базе данных.
Пример:
User user = new User();
Managed (Persistent):
Сущность связана с EntityManager и управляется им.
Любые изменения в сущности будут автоматически синхронизированы с базой данных при вызове flush() или завершении транзакции.
Пример:
entityManager.persist(user); // Сущность становится управляемой
Detached:
Сущность больше не управляется EntityManager, но продолжает существовать в базе данных.
Это может произойти после закрытия EntityManager или вызова detach().
Пример:
entityManager.detach(user); // Сущность становится отсоединенной
Removed:
Сущность помечена на удаление и будет удалена из базы данных при следующем вызове flush() или завершении транзакции.
Пример:
entityManager.remove(user); // Сущность помечена на удаление
Настройки Spring Boot, влияющие на @Entity
Spring Boot предоставляет множество настроек, которые влияют на работу сущностей и JPA. Эти настройки обычно указываются в файле application.properties или application.yml.
Настройки источника данных (DataSource):
Эти настройки определяют, как Spring Boot подключается к базе данных.
Пример:
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=secret
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
Настройки JPA:
Эти настройки влияют на поведение JPA и Hibernate.
Пример:
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect
Параметр ddl-auto может принимать следующие значения:
none: Никаких изменений в схеме базы данных не вносится.
create: Схема базы данных создается заново при каждом запуске приложения.
update: Схема базы данных обновляется в соответствии с текущими сущностями.
create-drop: Схема создается при запуске и удаляется при завершении работы приложения.
validate: Проверяется, соответствует ли схема базы данных сущностям.
Сканирование сущностей:
Spring Boot автоматически сканирует пакеты на наличие классов, помеченных аннотацией @Entity.
Если сущности находятся в другом пакете, можно указать его вручную:
spring.jpa.entity-scan.packages=com.example.entities
#Java #Training #Hard #Spring #SpringDataJPA #Entity
Настройки кэширования:
Spring Boot поддерживает кэширование сущностей через Hibernate или другие провайдеры.
Пример:
Настройки пула соединений:
Spring Boot позволяет настроить пул соединений для оптимизации производительности.
Пример (для HikariCP):
Механизмы Spring и JPA, связанные с @Entity
EntityManagerFactory:
EntityManagerFactory создается при запуске приложения и отвечает за создание EntityManager.
В Spring Boot это настраивается автоматически через LocalContainerEntityManagerFactoryBean.
EntityManager:
EntityManager управляет жизненным циклом сущностей и выполняет операции CRUD.
В Spring Boot EntityManager инжектируется через @PersistenceContext.
Транзакции:
Spring Boot управляет транзакциями через PlatformTransactionManager.
Аннотация @Transactional используется для определения границ транзакций.
Репозитории:
Spring Data JPA предоставляет репозитории, которые упрощают работу с сущностями.
Пример:
Пример полной настройки Spring Boot с @Entity
Класс сущности:
Репозиторий:
Настройки в application.properties:
#Java #Training #Hard #Spring #SpringDataJPA #Entity
Spring Boot поддерживает кэширование сущностей через Hibernate или другие провайдеры.
Пример:
spring.jpa.properties.hibernate.cache.use_second_level_cache=true
spring.jpa.properties.hibernate.cache.region.factory_class=org.hibernate.cache.ehcache.EhCacheRegionFactory
Настройки пула соединений:
Spring Boot позволяет настроить пул соединений для оптимизации производительности.
Пример (для HikariCP):
spring.datasource.hikari.maximum-pool-size=10
spring.datasource.hikari.minimum-idle=2
Механизмы Spring и JPA, связанные с @Entity
EntityManagerFactory:
EntityManagerFactory создается при запуске приложения и отвечает за создание EntityManager.
В Spring Boot это настраивается автоматически через LocalContainerEntityManagerFactoryBean.
EntityManager:
EntityManager управляет жизненным циклом сущностей и выполняет операции CRUD.
В Spring Boot EntityManager инжектируется через @PersistenceContext.
Транзакции:
Spring Boot управляет транзакциями через PlatformTransactionManager.
Аннотация @Transactional используется для определения границ транзакций.
Репозитории:
Spring Data JPA предоставляет репозитории, которые упрощают работу с сущностями.
Пример:
public interface UserRepository extends JpaRepository<User, Long> { ... }
Пример полной настройки Spring Boot с @Entity
Класс сущности:
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "username", nullable = false, length = 50)
private String username;
@Column(name = "email", unique = true)
private String email;
// Геттеры и сеттеры
}
Репозиторий:
public interface UserRepository extends JpaRepository<User, Long> { ... }
Настройки в application.properties:
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=secret
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
#Java #Training #Hard #Spring #SpringDataJPA #Entity
Что выведет код?
#Tasks
import java.util.HashSet;
import java.util.Set;
record Person28(
String name,
int age
) {}
public class Task280225 {
public static void main(String[] args) {
Set<Person28> set = new HashSet<>();
set.add(new Person28("Alice", 25));
set.add(new Person28("Bob", 30));
set.add(new Person28("Alice", 25));
set.remove(set.iterator().next());
System.out.println(set);
}
}
#Tasks
Please open Telegram to view this post
VIEW IN TELEGRAM
Вопросы с собеседования 👩💻
Что такое Comparator в Java?
Что такое Comparator в Java?
Anonymous Quiz
5%
Класс для работы с массивами
20%
Метод для сортировки строк
7%
Интерфейс для работы с файлами
68%
Интерфейс для сравнения объектов
Аннотация @Table
Аннотация @Table используется в JPA (Java Persistence API) для указания деталей отображения сущности на таблицу в базе данных. Она применяется к классу, помеченному аннотацией @Entity, и позволяет задать имя таблицы, схему, каталог и другие параметры, связанные с таблицей в базе данных.
Аннотация @Table, как и @Entity, находится в пакете javax.persistence (для JPA 2.x и ниже) или jakarta.persistence (для JPA 3.x и выше). Импорт выглядит следующим образом:
Для JPA 2.x:
Для JPA 3.x:
Параметры аннотации
Аннотация @Table имеет несколько параметров, которые позволяют настроить отображение сущности на таблицу:
name:
Указывает имя таблицы в базе данных.
По умолчанию используется имя класса сущности.
Пример:
schema:
Указывает схему базы данных, в которой находится таблица.
По умолчанию используется схема по умолчанию для подключения к базе данных.
Пример:
catalog:
Указывает каталог базы данных, в котором находится таблица.
По умолчанию используется каталог по умолчанию для подключения к базе данных.
Пример:
uniqueConstraints:
Позволяет задать уникальные ограничения для таблицы.
Принимает массив аннотаций @UniqueConstraint.
Пример:
indexes:
Позволяет задать индексы для таблицы.
Принимает массив аннотаций @Index.
Пример:
Механизмы Spring и JPA, связанные с @Table
Отображение сущности на таблицу:
Когда Spring Boot инициализирует JPA, он анализирует аннотацию @Table и создает метаданные для отображения сущности на таблицу в базе данных.
Если параметры name, schema или catalog не указаны, используются значения по умолчанию.
Генерация схемы базы данных:
Если параметр spring.jpa.hibernate.ddl-auto настроен на create, update или create-drop, Hibernate автоматически создаст или обновит таблицу в соответствии с аннотацией @Table.
Пример:
Уникальные ограничения и индексы:
Уникальные ограничения и индексы, заданные через @Table, создаются в базе данных при генерации схемы.
Эти ограничения проверяются на уровне базы данных, что обеспечивает целостность данных.
Интеграция с EntityManager:
EntityManager использует метаданные, созданные на основе аннотации @Table, для выполнения операций с базой данных.
Например, при выполнении запроса SELECT * FROM users, EntityManager знает, что таблица users соответствует сущности User.
#Java #Training #Hard #Spring #SpringDataJPA #Table
Аннотация @Table используется в JPA (Java Persistence API) для указания деталей отображения сущности на таблицу в базе данных. Она применяется к классу, помеченному аннотацией @Entity, и позволяет задать имя таблицы, схему, каталог и другие параметры, связанные с таблицей в базе данных.
Аннотация @Table, как и @Entity, находится в пакете javax.persistence (для JPA 2.x и ниже) или jakarta.persistence (для JPA 3.x и выше). Импорт выглядит следующим образом:
Для JPA 2.x:
import javax.persistence.Table;
Для JPA 3.x:
import jakarta.persistence.Table;
Параметры аннотации
Аннотация @Table имеет несколько параметров, которые позволяют настроить отображение сущности на таблицу:
name:
Указывает имя таблицы в базе данных.
По умолчанию используется имя класса сущности.
Пример:
@Table(name = "users")
schema:
Указывает схему базы данных, в которой находится таблица.
По умолчанию используется схема по умолчанию для подключения к базе данных.
Пример:
@Table(name = "users", schema = "public")
catalog:
Указывает каталог базы данных, в котором находится таблица.
По умолчанию используется каталог по умолчанию для подключения к базе данных.
Пример:
@Table(name = "users", catalog = "my_catalog")
uniqueConstraints:
Позволяет задать уникальные ограничения для таблицы.
Принимает массив аннотаций @UniqueConstraint.
Пример:
@Table(name = "users", uniqueConstraints = {
@UniqueConstraint(columnNames = {"username"}),
@UniqueConstraint(columnNames = {"email"})
})
indexes:
Позволяет задать индексы для таблицы.
Принимает массив аннотаций @Index.
Пример:
@Table(name = "users", indexes = {
@Index(name = "idx_username", columnList = "username"),
@Index(name = "idx_email", columnList = "email")
})
Механизмы Spring и JPA, связанные с @Table
Отображение сущности на таблицу:
Когда Spring Boot инициализирует JPA, он анализирует аннотацию @Table и создает метаданные для отображения сущности на таблицу в базе данных.
Если параметры name, schema или catalog не указаны, используются значения по умолчанию.
Генерация схемы базы данных:
Если параметр spring.jpa.hibernate.ddl-auto настроен на create, update или create-drop, Hibernate автоматически создаст или обновит таблицу в соответствии с аннотацией @Table.
Пример:
spring.jpa.hibernate.ddl-auto=update
Уникальные ограничения и индексы:
Уникальные ограничения и индексы, заданные через @Table, создаются в базе данных при генерации схемы.
Эти ограничения проверяются на уровне базы данных, что обеспечивает целостность данных.
Интеграция с EntityManager:
EntityManager использует метаданные, созданные на основе аннотации @Table, для выполнения операций с базой данных.
Например, при выполнении запроса SELECT * FROM users, EntityManager знает, что таблица users соответствует сущности User.
#Java #Training #Hard #Spring #SpringDataJPA #Table
Пример использования @Table
Настройки Spring Boot, влияющие на @Table
Автоматическая генерация схемы:
Параметр spring.jpa.hibernate.ddl-auto определяет, как Hibernate управляет схемой базы данных.
Возможные значения:
none: Никаких изменений в схеме не вносится.
create: Схема создается заново при каждом запуске.
update: Схема обновляется в соответствии с сущностями.
create-drop: Схема создается при запуске и удаляется при завершении.
validate: Проверяется соответствие схемы сущностям.
Показ SQL-запросов:
Параметр spring.jpa.show-sql позволяет включить вывод SQL-запросов в консоль.
Пример:
Диалект базы данных:
Параметр spring.jpa.properties.hibernate.dialect определяет диалект базы данных.
Пример:
#Java #Training #Hard #Spring #SpringDataJPA #Table
@Entity
@Table(
name = "users",
schema = "public",
catalog = "my_catalog",
uniqueConstraints = {
@UniqueConstraint(columnNames = {"username"}),
@UniqueConstraint(columnNames = {"email"})
},
indexes = {
@Index(name = "idx_username", columnList = "username"),
@Index(name = "idx_email", columnList = "email")
}
)
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "username", nullable = false, length = 50)
private String username;
@Column(name = "email", unique = true)
private String email;
// Геттеры и сеттеры
}
Настройки Spring Boot, влияющие на @Table
Автоматическая генерация схемы:
Параметр spring.jpa.hibernate.ddl-auto определяет, как Hibernate управляет схемой базы данных.
Возможные значения:
none: Никаких изменений в схеме не вносится.
create: Схема создается заново при каждом запуске.
update: Схема обновляется в соответствии с сущностями.
create-drop: Схема создается при запуске и удаляется при завершении.
validate: Проверяется соответствие схемы сущностям.
Показ SQL-запросов:
Параметр spring.jpa.show-sql позволяет включить вывод SQL-запросов в консоль.
Пример:
spring.jpa.show-sql=true
Диалект базы данных:
Параметр spring.jpa.properties.hibernate.dialect определяет диалект базы данных.
Пример:
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect
#Java #Training #Hard #Spring #SpringDataJPA #Table