Основные аннотации JPA: @Entity, @Table, @Id
1. Аннотация @Entity
@Entity указывает, что класс представляет собой сущность базы данных. Каждая сущность соответствует таблице в базе данных.
Пример:
2. Аннотация @Table
@Table используется для настройки имени таблицы и схемы, к которой относится сущность.
Пример:
3. Аннотация @Id
@Id используется для указания первичного ключа таблицы.
Пример:
Другие полезные аннотации
1. @GeneratedValue
Используется вместе с @Id для автоматической генерации значения первичного ключа.
Стратегии генерации:
AUTO — автоматически выбирает стратегию, зависящую от базы данных.
IDENTITY — использует автоинкремент в базе данных.
SEQUENCE — использует специальную таблицу для генерации уникальных значений.
TABLE — сохраняет последовательности значений в отдельной таблице.
2. @Column
Позволяет указать имя столбца, его уникальность, длину и другие параметры.
3. @Transient
Позволяет исключить поле из отображения в базе данных.
Пример полной конфигурации
#Java #Training #Spring #Entity #Table #Id #GeneratedValue #Column #Transient
1. Аннотация @Entity
@Entity указывает, что класс представляет собой сущность базы данных. Каждая сущность соответствует таблице в базе данных.
Пример:
import jakarta.persistence.Entity;
@Entity
public class Product {
private Long id;
private String name;
private Double price;
}
Если класс помечен как @Entity, но таблица не указана явно, Spring автоматически использует название класса для создания таблицы в базе данных.
2. Аннотация @Table
@Table используется для настройки имени таблицы и схемы, к которой относится сущность.
Пример:
import jakarta.persistence.Entity;
import jakarta.persistence.Table;
@Entity
@Table(name = "products", schema = "shop")
public class Product {
private Long id;
private String name;
private Double price;
}
Если имя таблицы не указано, то по умолчанию используется имя класса.
3. Аннотация @Id
@Id используется для указания первичного ключа таблицы.
Пример:
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
@Entity
public class Product {
@Id
private Long id;
private String name;
private Double price;
}
Другие полезные аннотации
1. @GeneratedValue
Используется вместе с @Id для автоматической генерации значения первичного ключа.
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
Стратегии генерации:
AUTO — автоматически выбирает стратегию, зависящую от базы данных.
IDENTITY — использует автоинкремент в базе данных.
SEQUENCE — использует специальную таблицу для генерации уникальных значений.
TABLE — сохраняет последовательности значений в отдельной таблице.
2. @Column
Позволяет указать имя столбца, его уникальность, длину и другие параметры.
import jakarta.persistence.Column;
@Column(name = "product_name", nullable = false, unique = true)
private String name;
3. @Transient
Позволяет исключить поле из отображения в базе данных.
@Transient
private String tempData;
Пример полной конфигурации
import jakarta.persistence.*;
@Entity
@Table(name = "products")
public class Product {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "product_name", nullable = false)
private String name;
private Double price;
@Transient
private String tempData;
// Getters and Setters
}
#Java #Training #Spring #Entity #Table #Id #GeneratedValue #Column #Transient
@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