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

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

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
Основные аннотации JPA: @Entity, @Table, @Id

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 и ниже:
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.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