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

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

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
Аннотация @IdClass

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

Параметры аннотации

value (обязательный):
Тип: Class<?>.
Описание: Указывает класс, который представляет составной первичный ключ. Этот класс должен быть сериализуемым, иметь конструктор по умолчанию и переопределять методы equals() и hashCode().


Пример:

@IdClass(UserId.class)
public class User {
@Id
private Long departmentId;

@Id
private Long userId;

// Остальные поля и методы
}


Жизненный цикл аннотации

Инициализация:
Аннотация @IdClass обрабатывается во время инициализации JPA-провайдера (например, Hibernate). JPA-провайдер анализирует сущность и создает метаданные для составного ключа.

Выполнение:
Когда сущность сохраняется, обновляется или извлекается из базы данных, JPA-провайдер использует класс, указанный в @IdClass, для работы с составным ключом.

Уничтожение:
Аннотация не имеет явного жизненного цикла уничтожения, так как она используется только для конфигурации составного ключа.

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

Использование составного ключа:
Класс, представляющий составной ключ, должен быть сериализуемым, иметь конструктор по умолчанию и переопределять методы equals() и hashCode():

public class UserId implements Serializable {
private Long departmentId;
private Long userId;

// Конструктор по умолчанию
public UserId() {}

// Конструктор с параметрами
public UserId(Long departmentId, Long userId) {
this.departmentId = departmentId;
this.userId = userId;
}

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

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
UserId userId1 = (UserId) o;
return Objects.equals(departmentId, userId1.departmentId) &&
Objects.equals(userId, userId1.userId);
}

@Override
public int hashCode() {
return Objects.hash(departmentId, userId);
}
}


Использование с @Embeddable:
Вместо @IdClass можно использовать аннотацию @Embeddable для определения составного ключа:

@Embeddable
public class UserId implements Serializable {
private Long departmentId;
private Long userId;

// Конструктор по умолчанию, геттеры, сеттеры, equals, hashCode
}

@Entity
public class User {
@EmbeddedId
private UserId id;

// Остальные поля и методы
}


Использование с репозиториями:
Репозитории Spring Data JPA могут работать с сущностями, имеющими составные ключи:

public interface UserRepository extends JpaRepository<User, UserId> {
// Методы репозитория
}


#Java #Training #Hard #Spring #SpringDataJPA #IdClass