Java for Beginner
672 subscribers
541 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: @Embeddable, @Embedded, @ElementCollection, @Inheritance, @Cacheable, @Lock, @EntityListeners, @SQLInsert, @SQLUpdate, @SQLDelete

1. @Embeddable и @Embedded

Аннотация
@Embeddable обозначает класс, который будет встраиваться в другие сущности, а @Embedded — указывает, что поле встраивает такой класс.
@Embeddable
public class Address {
private String street;
private String city;
}

@Entity
public class Customer {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@Embedded
private Address address;
}


2. @ElementCollection

Используется для хранения коллекций простых типов или встраиваемых объектов.

@Entity
public class Product {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@ElementCollection
private List<String> tags;
}


3.
@Inheritance

Настраивает стратегию наследования для сущностей.
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class Vehicle {
@Id
private Long id;
}

@Entity
public class Car extends Vehicle {
private int seatingCapacity;
}


4. @Cacheable

Обозначает, что сущность может быть закеширована.
@Entity
@Cacheable
public class Product {
@Id
private Long id;
private String name;
}


5. @Lock

Используется для управления блокировками данных.

@Lock(LockModeType.PESSIMISTIC_WRITE)
@Query("SELECT u FROM User u WHERE u.id = :id")
User findForUpdate(@Param("id") Long id);


6.
@EntityListeners

Позволяет подключать слушатели для отслеживания событий сущности.

@Entity
@EntityListeners(AuditListener.class)
public class Order {
@Id
private Long id;
}


7.
@SQLInsert, @SQLUpdate, @SQLDelete

Эти аннотации позволяют задать кастомные SQL-запросы для операций вставки, обновления и удаления.

@SQLInsert(sql = "INSERT INTO user_audit (id, username) VALUES (?, ?)")
@SQLDelete(sql = "DELETE FROM user_audit WHERE id = ?")
@Entity
public class UserAudit {
@Id
private Long id;
}


#Java #Training #Spring #Embeddable, #Embedded, #ElementCollection, #Inheritance, #Cacheable, #Lock, #EntityListeners, #SQLInsert, #SQLUpdate, #SQLDelete
Аннотация @Inheritance

Аннотация @Inheritance используется в Java Persistence API (JPA) для определения стратегии наследования сущностей. Она позволяет указать, как сущности, связанные отношениями наследования, будут отображаться на таблицы базы данных. Аннотация находится в пакете javax.persistence (или jakarta.persistence в Jakarta EE).

Аннотация @Inheritance принимает один параметр — strategy, который определяет стратегию наследования.

Параметр strategy может принимать одно из следующих значений:
InheritanceType.SINGLE_TABLE:
Все сущности в иерархии наследования отображаются на одну таблицу.
Для различения типов сущностей используется дискриминаторный столбец (discriminator column).

Пример:
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "type", discriminatorType = DiscriminatorType.STRING)
public class Vehicle { ... }


InheritanceType.JOINED:
Каждая сущность в иерархии наследования отображается на отдельную таблицу.
Общие поля хранятся в таблице родительской сущности, а уникальные поля — в таблицах дочерних сущностей.


Пример:
@Inheritance(strategy = InheritanceType.JOINED)
public class Vehicle { ... }


InheritanceType.TABLE_PER_CLASS:
Каждая сущность в иерархии наследования отображается на отдельную таблицу, и все поля (включая унаследованные) хранятся в таблице дочерней сущности.

Пример:
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class Vehicle { ... }


Если аннотация
@Inheritance не указана, JPA по умолчанию использует стратегию InheritanceType.SINGLE_TABLE.

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

Применение: Аннотация
@Inheritance применяется на этапе маппинга сущности JPA. Она определяет, как сущности в иерархии наследования будут отображаться на таблицы базы данных.
Инициализация: При загрузке сущности из базы данных JPA использует указанную стратегию наследования для создания объектов.
Уничтожение: При сохранении сущности в базу данных JPA использует указанную стратегию наследования для записи данных.


Кастомизация стратегии наследования:
Если требуется изменить стратегию наследования для конкретной иерархии сущностей, можно использовать аннотацию @Inheritance с нужным значением параметра strategy.

Пример использования

Стратегия SINGLE_TABLE
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "type", discriminatorType = DiscriminatorType.STRING)
public class Vehicle {
@Id
private Long id;
private String manufacturer;
}

@Entity
@DiscriminatorValue("CAR")
public class Car extends Vehicle {
private int numberOfSeats;
}

@Entity
@DiscriminatorValue("TRUCK")
public class Truck extends Vehicle {
private double payloadCapacity;
}


Стратегия JOINED
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class Vehicle {
@Id
private Long id;
private String manufacturer;
}

@Entity
public class Car extends Vehicle {
private int numberOfSeats;
}

@Entity
public class Truck extends Vehicle {
private double payloadCapacity;
}
Стратегия TABLE_PER_CLASS
java
Copy
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class Vehicle {
@Id
private Long id;
private String manufacturer;
}

@Entity
public class Car extends Vehicle {
private int numberOfSeats;
}

@Entity
public class Truck extends Vehicle {
private double payloadCapacity;
}


#Java #Training #Hard #Spring #SpringDataJPA #Inheritance