Основные аннотации 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
Аннотации JPA для полей: @Column, @GeneratedValue, @ManyToOne
1. Аннотация @Column
Аннотация @Column используется для настройки маппинга поля сущности на столбец таблицы базы данных. С её помощью можно задать имя столбца, его длину, уникальность, возможность быть NULL и другие атрибуты.
Основные параметры:
name — имя столбца в базе данных.
nullable — допускает ли столбец значение NULL.
unique — устанавливает, должны ли значения в столбце быть уникальными.
length — длина для столбцов типа VARCHAR.
columnDefinition — SQL-выражение для явного указания типа столбца.
Пример использования:
В этом примере мы видим, что:
Поле username будет связано со столбцом username, не допускающим NULL и с максимальной длиной 50 символов.
Поле age связано со столбцом с SQL-типом INTEGER, по умолчанию равным 18.
2. Аннотация @GeneratedValue
Аннотация @GeneratedValue используется для указания стратегии генерации значений первичного ключа. Она применима к полям, помеченным как @Id.
Основные стратегии:
AUTO — выбор стратегии определяется провайдером JPA.
IDENTITY — генерация значения средствами базы данных.
SEQUENCE — использование последовательности, определенной в базе данных.
TABLE — использование таблицы для хранения значений идентификаторов.
Пример использования:
3. Аннотация @ManyToOne
Аннотация @ManyToOne используется для определения связи "многие к одному". Она обозначает, что текущее поле является ссылкой на другую сущность.
Пример использования:
#Java #Training #Spring #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.
Например:
Конфигурация JPA:
Spring Boot автоматически настраивает JPA через свойства, такие как:
#Java #Training #Hard #Spring #SpringDataJPA #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.
Например:
Параметры @SequenceGenerator:
name: Имя генератора.
sequenceName: Имя последовательности в базе данных.
allocationSize: Количество значений, которые будут предварительно выделены.
Использование @TableGenerator:
Если используется стратегия GenerationType.TABLE, можно настроить таблицу для генерации значений с помощью аннотации @TableGenerator.
Например:
Параметры @TableGenerator:
name: Имя генератора.
table: Имя таблицы для хранения значений.
pkColumnName: Имя столбца, хранящего имена генераторов.
valueColumnName: Имя столбца, хранящего значения.
Пример использования
В этом примере:
Поле id помечено аннотацией @Id и @GeneratedValue.
Стратегия GenerationType.IDENTITY указывает, что значение id будет генерироваться базой данных автоматически.
#Java #Training #Hard #Spring #SpringDataJPA #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