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
Аннотации JPA для полей: @Column, @GeneratedValue, @ManyToOne

1. Аннотация @Column

Аннотация @Column используется для настройки маппинга поля сущности на столбец таблицы базы данных. С её помощью можно задать имя столбца, его длину, уникальность, возможность быть NULL и другие атрибуты.

Основные параметры:
name — имя столбца в базе данных.
nullable — допускает ли столбец значение NULL.
unique — устанавливает, должны ли значения в столбце быть уникальными.
length — длина для столбцов типа VARCHAR.
columnDefinition — SQL-выражение для явного указания типа столбца.


Пример использования:
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;

@Entity
public class User {

@Id
private Long id;

@Column(name = "username", nullable = false, unique = true, length = 50)
private String username;

@Column(name = "email", nullable = false, unique = true)
private String email;

@Column(name = "age", columnDefinition = "INTEGER DEFAULT 18")
private int age;

// Геттеры и сеттеры
}


В этом примере мы видим, что:
Поле username будет связано со столбцом username, не допускающим NULL и с максимальной длиной 50 символов.
Поле age связано со столбцом с SQL-типом INTEGER, по умолчанию равным 18.


2. Аннотация @GeneratedValue

Аннотация @GeneratedValue используется для указания стратегии генерации значений первичного ключа. Она применима к полям, помеченным как @Id.

Основные стратегии:
AUTO — выбор стратегии определяется провайдером JPA.
IDENTITY — генерация значения средствами базы данных.
SEQUENCE — использование последовательности, определенной в базе данных.
TABLE — использование таблицы для хранения значений идентификаторов.


Пример использования:
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;

@Entity
public class Product {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

private String name;

private double price;

// Геттеры и сеттеры
}
Здесь id будет автоматически генерироваться базой данных.


3. Аннотация @ManyToOne

Аннотация @ManyToOne используется для определения связи "многие к одному". Она обозначает, что текущее поле является ссылкой на другую сущность.

Пример использования:
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.ManyToOne;

@Entity
public class Order {

@Id
private Long id;

private String description;

@ManyToOne
private Customer customer;

// Геттеры и сеттеры
}
Эта аннотация указывает, что множество заказов (Order) могут быть связаны с одним клиентом (Customer).


#Java #Training #Spring #Column #GeneratedValue #ManyToOne
Аннотация @GeneratedValue

Аннотация @GeneratedValue используется в Java Persistence API (JPA) для указания стратегии генерации значений первичного ключа (primary key) для сущности. Она применяется совместно с аннотацией @Id и находится в пакете javax.persistence (или jakarta.persistence в Jakarta EE). Эта аннотация позволяет автоматически генерировать уникальные значения для первичных ключей, что упрощает управление идентификаторами в базе данных.

Аннотация @GeneratedValue принимает два необязательных параметра:
strategy: Определяет стратегию генерации значений. Тип данных — GenerationType.
generator: Указывает имя генератора, который используется для создания значений. Тип данных — String.


Настройки и значения

Параметр strategy:
Определяет, как будут генерироваться значения первичного ключа.

Доступные стратегии:
GenerationType.AUTO (по умолчанию): JPA автоматически выбирает подходящую стратегию на основе используемой базы данных.
GenerationType.IDENTITY: Использует встроенный механизм автоинкремента базы данных (например, AUTO_INCREMENT в MySQL или SERIAL в PostgreSQL).
GenerationType.SEQUENCE: Использует последовательность (sequence) базы данных для генерации значений.
GenerationType.TABLE: Использует отдельную таблицу для хранения и генерации значений первичных ключей.


Параметр generator:
Указывает имя генератора, который должен быть определён с помощью аннотации @SequenceGenerator или @TableGenerator. Это позволяет настроить дополнительные параметры для генерации значений.

Жизненный цикл

Аннотация @GeneratedValue применяется на этапе загрузки метаданных сущности (во время инициализации контекста Spring или при развертывании приложения).

Значение для поля, помеченного @GeneratedValue, генерируется:
При вставке новой сущности в базу данных (persist).
В зависимости от стратегии, значение может генерироваться базой данных или JPA-провайдером (например, Hibernate).


Механизмы Spring и настройки Spring Boot

Spring Data JPA использует аннотацию @GeneratedValue для интеграции с JPA-провайдером (например, Hibernate).
При старте приложения Spring Boot автоматически сканирует сущности, помеченные аннотацией
@Entity, и анализирует их поля, включая те, что помечены @Id и @GeneratedValue.
Spring Boot настраивает EntityManagerFactory и DataSource, которые используются JPA для работы с базой данных.


Настройки Spring Boot, предшествующие работе
@GeneratedValue

Конфигурация источника данных (DataSource):
Spring Boot автоматически настраивает DataSource на основе свойств, указанных в application.properties или application.yml.

Например:
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:
Spring Boot автоматически настраивает JPA через свойства, такие как:
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect
Свойство spring.jpa.hibernate.ddl-auto управляет созданием и обновлением схемы базы данных, включая таблицы и первичные ключи.



#Java #Training #Hard #Spring #SpringDataJPA #GeneratedValue
Обработка значений @GeneratedValue

При вставке новой сущности (persist), JPA проверяет, что поле, помеченное @Id и @GeneratedValue, имеет значение null.

В зависимости от стратегии, значение генерируется:
GenerationType.IDENTITY: Значение генерируется базой данных, и JPA получает его после выполнения вставки.
GenerationType.SEQUENCE: JPA запрашивает следующее значение из последовательности базы данных перед вставкой.
GenerationType.TABLE: JPA использует отдельную таблицу для генерации значений.
GenerationType.AUTO: JPA выбирает подходящую стратегию на основе базы данных.

Варианты настройки

Использование @SequenceGenerator:
Если используется стратегия GenerationType.SEQUENCE, можно настроить последовательность с помощью аннотации @SequenceGenerator.

Например:

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "user_seq")
@SequenceGenerator(name = "user_seq", sequenceName = "USER_SEQ", allocationSize = 1)
private Long id;


Параметры @SequenceGenerator:
name: Имя генератора.
sequenceName: Имя последовательности в базе данных.
allocationSize: Количество значений, которые будут предварительно выделены.


Использование @TableGenerator:
Если используется стратегия GenerationType.TABLE, можно настроить таблицу для генерации значений с помощью аннотации @TableGenerator.

Например:
@Id
@GeneratedValue(strategy = GenerationType.TABLE, generator = "user_table_gen")
@TableGenerator(name = "user_table_gen", table = "ID_GEN", pkColumnName = "GEN_NAME", valueColumnName = "GEN_VALUE")
private Long id;


Параметры @TableGenerator:
name: Имя генератора.
table: Имя таблицы для хранения значений.
pkColumnName: Имя столбца, хранящего имена генераторов.
valueColumnName: Имя столбца, хранящего значения.


Пример использования
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

private String name;

// Геттеры и сеттеры
}


В этом примере:
Поле id помечено аннотацией @Id и @GeneratedValue.
Стратегия GenerationType.IDENTITY указывает, что значение id будет генерироваться базой данных автоматически.


#Java #Training #Hard #Spring #SpringDataJPA #GeneratedValue