Вопросы с собеседования 👩💻
Что такое default метод в интерфейсе?
Что такое default метод в интерфейсе?
Anonymous Quiz
13%
Метод без реализации
87%
Метод с реализацией по умолчанию
0%
Приватный метод
0%
Статический метод
@Generated в Hibernate
Аннотация @Generated указывает, что значение поля автоматически генерируется базой данных (например, через DEFAULT, TRIGGER, AUTO_INCREMENT или вычисляемый столбец). В отличие от @Formula, поле сохраняется в БД, но Hibernate обновляет его после вставки или обновления. Находится в пакете org.hibernate.annotations.
Атрибуты аннотации
GenerationTime (обязательный):
Определяет, когда значение генерируется:
GenerationTime.INSERT – только при вставке (например, AUTO_INCREMENT).
GenerationTime.ALWAYS – при вставке и обновлении (например, триггеры или DEFAULT-значения).
value (необязательный, String):
SQL-выражение, которое генерирует значение (если БД поддерживает, например, DEFAULT CURRENT_TIMESTAMP).
Используется редко, так как обычно генерация определяется на стороне БД.
Жизненный цикл
При сохранении (INSERT)
Если GenerationTime.INSERT или GenerationTime.ALWAYS:
Hibernate выполняет INSERT, пропуская это поле.
После вставки делает SELECT (или использует RETURNING в PostgreSQL), чтобы получить сгенерированное значение.
Пример для AUTO_INCREMENT:
При обновлении (UPDATE)
Если GenerationTime.ALWAYS:
Hibernate пропускает поле в UPDATE.
После обновления делает SELECT для получения нового значения.
Пример для триггера, обновляющего last_modified:
Кэширование
Если включен кэш второго уровня (@Cacheable), Hibernate обновляет значение в кэше после SELECT.
Механизмы Hibernate и настройки
1. Как Hibernate обрабатывает @Generated
Генерация SQL:
Поле исключается из INSERT/UPDATE.
Для получения значения выполняется дополнительный SELECT (если БД не поддерживает RETURNING).
Поддержка RETURNING (PostgreSQL, Oracle, SQL Server):
Если диалект поддерживает RETURNING, Hibernate использует его вместо отдельного SELECT:
2. Зависимость от диалекта БД
Поведение зависит от возможностей БД:
MySQL: AUTO_INCREMENT, DEFAULT CURRENT_TIMESTAMP.
PostgreSQL: SERIAL, GENERATED ALWAYS AS IDENTITY, триггеры.
Oracle: SEQUENCE + триггеры, DEFAULT-значения.
Примеры использования
1. Автоинкрементный ID
Эквивалент Hibernate:
2. Временная метка создания
3. Триггер для аудита
Ограничения и альтернативы
Ограничения:
Не все БД поддерживают RETURNING:
Для MySQL требуется дополнительный SELECT.
Нет контроля над генерацией:
Логика полностью определяется БД (триггеры, DEFAULT).
Альтернативы:
@PrePersist и @PreUpdate (JPA):
#Java #Training #Hard #Spring #Hibernate #Generated
Аннотация @Generated указывает, что значение поля автоматически генерируется базой данных (например, через DEFAULT, TRIGGER, AUTO_INCREMENT или вычисляемый столбец). В отличие от @Formula, поле сохраняется в БД, но Hibernate обновляет его после вставки или обновления. Находится в пакете org.hibernate.annotations.
Атрибуты аннотации
GenerationTime (обязательный):
Определяет, когда значение генерируется:
GenerationTime.INSERT – только при вставке (например, AUTO_INCREMENT).
GenerationTime.ALWAYS – при вставке и обновлении (например, триггеры или DEFAULT-значения).
value (необязательный, String):
SQL-выражение, которое генерирует значение (если БД поддерживает, например, DEFAULT CURRENT_TIMESTAMP).
Используется редко, так как обычно генерация определяется на стороне БД.
Жизненный цикл
При сохранении (INSERT)
Если GenerationTime.INSERT или GenerationTime.ALWAYS:
Hibernate выполняет INSERT, пропуская это поле.
После вставки делает SELECT (или использует RETURNING в PostgreSQL), чтобы получить сгенерированное значение.
Пример для AUTO_INCREMENT:
INSERT INTO users (name) VALUES ('Alice'); -- id не указывается
SELECT last_insert_id(); -- Hibernate получает сгенерированный ID
При обновлении (UPDATE)
Если GenerationTime.ALWAYS:
Hibernate пропускает поле в UPDATE.
После обновления делает SELECT для получения нового значения.
Пример для триггера, обновляющего last_modified:
UPDATE users SET name = 'Bob' WHERE id = 1; -- last_modified не указывается
SELECT last_modified FROM users WHERE id = 1; -- Hibernate получает новое значение
Кэширование
Если включен кэш второго уровня (@Cacheable), Hibernate обновляет значение в кэше после SELECT.
Механизмы Hibernate и настройки
1. Как Hibernate обрабатывает @Generated
Генерация SQL:
Поле исключается из INSERT/UPDATE.
Для получения значения выполняется дополнительный SELECT (если БД не поддерживает RETURNING).
Поддержка RETURNING (PostgreSQL, Oracle, SQL Server):
Если диалект поддерживает RETURNING, Hibernate использует его вместо отдельного SELECT:
INSERT INTO users (name) VALUES ('Alice') RETURNING id, created_at;
2. Зависимость от диалекта БД
Поведение зависит от возможностей БД:
MySQL: AUTO_INCREMENT, DEFAULT CURRENT_TIMESTAMP.
PostgreSQL: SERIAL, GENERATED ALWAYS AS IDENTITY, триггеры.
Oracle: SEQUENCE + триггеры, DEFAULT-значения.
Примеры использования
1. Автоинкрементный ID
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY) // Аналог для JPA
private Long id;
Эквивалент Hibernate:
@Id
@Generated(GenerationTime.INSERT)
private Long id;
2. Временная метка создания
@Column(insertable = false) // Не указывается в INSERT
@Generated(GenerationTime.INSERT)
private LocalDateTime createdAt; // DEFAULT CURRENT_TIMESTAMP в БД
3. Триггер для аудита
@Column(updatable = false)
@Generated(GenerationTime.ALWAYS)
private LocalDateTime lastModified; // Обновляется триггером БД
Ограничения и альтернативы
Ограничения:
Не все БД поддерживают RETURNING:
Для MySQL требуется дополнительный SELECT.
Нет контроля над генерацией:
Логика полностью определяется БД (триггеры, DEFAULT).
Альтернативы:
@PrePersist и @PreUpdate (JPA):
@PrePersist
private void prePersist() {
this.createdAt = LocalDateTime.now();
}
Плюс: работает везде. Минус: значение генерируется в Java, а не в БД.
#Java #Training #Hard #Spring #Hibernate #Generated
@Immutable в Hibernate
Аннотация @Immutable помечает сущность или коллекцию как неизменяемую, что означает, что Hibernate игнорирует любые попытки обновления или удаления таких объектов. Это полезно для оптимизации производительности и предотвращения случайных изменений.
Пакет: org.hibernate.annotations.
1. Применение и параметры
@Immutable не имеет параметров — это маркерная аннотация.
Где может применяться:
На уровне класса (сущности):
На уровне коллекции:
2. Жизненный цикл и поведение
При загрузке:
Объекты загружаются как обычно, но Hibernate не отслеживает изменения (не добавляет их в PersistenceContext для dirty-checking).
При попытке обновления:
Выбрасывается исключение UnsupportedOperationException (если попытаться изменить поле или вызвать entityManager.merge()).
При удалении:
Игнорируется (если только не используется @SQLDelete с кастомным запросом).
Кэширование:
Сущности с @Immutable идеально подходят для кэширования (например, @Cacheable), так как никогда не меняются.
Механизмы Hibernate и Spring Boot
1. Как Hibernate обрабатывает @Immutable
Оптимизации:
Пропускает dirty-checking для таких сущностей, что ускоряет flush().
Не создает прокси для ленивых загрузок (если @Immutable применен к коллекции).
Исключения:
Session.update(), Session.merge(), Session.delete() игнорируются или выбрасывают исключение.
2. Интеграция с JPA и Spring Boot
JPA-аналоги:
Стандарт JPA не имеет прямой замены @Immutable, но можно эмулировать через:
Примеры использования
1. Справочные данные (Countries, Currencies)
Запросы только на чтение:
2. Логи и аудит (неизменяемые записи)
3. Неизменяемые коллекции
Ограничения и обходные пути
1. Что нельзя сделать с @Immutable
Обновлять поля: Даже через нативный SQL (entityManager.createNativeQuery("UPDATE...")), если только не отключить проверки Hibernate.
Каскадные операции: CascadeType.PERSIST работает, но MERGE, DELETE — нет.
2. Альтернативы
Read-only транзакции (Spring):
DTO и проекции:
#Java #Training #Hard #Spring #Hibernate #Immutable
Аннотация @Immutable помечает сущность или коллекцию как неизменяемую, что означает, что Hibernate игнорирует любые попытки обновления или удаления таких объектов. Это полезно для оптимизации производительности и предотвращения случайных изменений.
Пакет: org.hibernate.annotations.
1. Применение и параметры
@Immutable не имеет параметров — это маркерная аннотация.
Где может применяться:
На уровне класса (сущности):
@Entity
@Immutable
public class LogEntry { ... }
Все экземпляры LogEntry становятся read-only.
На уровне коллекции:
@OneToMany
@Immutable
private List<LogEntry> logs; // Элементы коллекции нельзя изменить
2. Жизненный цикл и поведение
При загрузке:
Объекты загружаются как обычно, но Hibernate не отслеживает изменения (не добавляет их в PersistenceContext для dirty-checking).
При попытке обновления:
Выбрасывается исключение UnsupportedOperationException (если попытаться изменить поле или вызвать entityManager.merge()).
При удалении:
Игнорируется (если только не используется @SQLDelete с кастомным запросом).
Кэширование:
Сущности с @Immutable идеально подходят для кэширования (например, @Cacheable), так как никогда не меняются.
Механизмы Hibernate и Spring Boot
1. Как Hibernate обрабатывает @Immutable
Оптимизации:
Пропускает dirty-checking для таких сущностей, что ускоряет flush().
Не создает прокси для ленивых загрузок (если @Immutable применен к коллекции).
Исключения:
Session.update(), Session.merge(), Session.delete() игнорируются или выбрасывают исключение.
2. Интеграция с JPA и Spring Boot
JPA-аналоги:
Стандарт JPA не имеет прямой замены @Immutable, но можно эмулировать через:
@Entity
@DynamicUpdate(false) // Отключает генерацию UPDATE
@org.hibernate.annotations.OptimisticLocking(type = NONE) // Отключает версионирование
public class LogEntry { ... }
Примеры использования
1. Справочные данные (Countries, Currencies)
@Entity
@Immutable
public class Currency {
@Id
private String code; // USD, EUR
private String name;
// Нет сеттеров
}
Запросы только на чтение:
List<Currency> currencies = entityManager
.createQuery("SELECT c FROM Currency c", Currency.class)
.getResultList();
2. Логи и аудит (неизменяемые записи)
@Entity
@Immutable
public class AuditLog {
@Id @GeneratedValue
private Long id;
private String action;
@Column(updatable = false)
private LocalDateTime createdAt;
}
3. Неизменяемые коллекции
@Entity
public class User {
@Id private Long id;
@OneToMany
@Immutable
private List<LoginHistory> history; // История логинов только для чтения
}
Ограничения и обходные пути
1. Что нельзя сделать с @Immutable
Обновлять поля: Даже через нативный SQL (entityManager.createNativeQuery("UPDATE...")), если только не отключить проверки Hibernate.
Каскадные операции: CascadeType.PERSIST работает, но MERGE, DELETE — нет.
2. Альтернативы
Read-only транзакции (Spring):
@Transactional(readOnly = true) // Оптимизация на уровне JDBC
public List<Currency> getCurrencies() { ... }
DTO и проекции:
public interface CurrencyView {
String getCode();
String getName();
}
Плюс: не требуют Hibernate-сущностей.
#Java #Training #Hard #Spring #Hibernate #Immutable
Что выведет код?
#Tasks
import java.util.HashMap;
public class Task110425 {
public static void main(String[] args) {
HashMap<String, Integer> map = new HashMap<>();
map.put("A", 1);
map.put(new String("A"), 2);
map.put("B", 3);
System.out.println(map.get("A"));
}
}
#Tasks
Please open Telegram to view this post
VIEW IN TELEGRAM
Вопросы с собеседования 👩💻
Что такое TreeSet?
Что такое TreeSet?
Anonymous Quiz
16%
Коллекция пар "ключ-значение"
4%
Массив фиксированного размера
2%
Класс для работы с потоками
78%
Отсортированная коллекция уникальных элементов
@Index в Hibernate
Аннотация @Index в Hibernate используется для определения индекса на одном или нескольких столбцах таблицы базы данных. Индексы ускоряют поиск и сортировку данных, но могут замедлять операции вставки и обновления.
Пакет: org.hibernate.annotations
Применяется к: классу (на уровне @Table), полю или свойству.
Параметры и настройки
Аннотация @Index имеет следующие атрибуты:
name (String):
Название индекса в БД.
Если не указано, Hibernate сгенерирует имя автоматически (например, IDX_<TABLE>_<COLUMN>).
columnList (String):
Обязательный параметр.
Список столбцов, входящих в индекс, через запятую (например, "username, email").
Поддерживает порядок сортировки: "username ASC, email DESC".
unique (boolean, по умолчанию false):
Если true, создает уникальный индекс (аналог UNIQUE INDEX в SQL).
options (String):
Дополнительные SQL-опции для индекса (например, "USING HASH" для MySQL).
Жизненный цикл и обработка
Во время компиляции:
Hibernate анализирует аннотацию и включает её в метаданные ORM.
При старте приложения (Hibernate bootstrap):
Индекс добавляется в DDL-скрипт при автоматической генерации схемы (hibernate.hbm2ddl.auto=create/update).
Если БД уже существует, Hibernate не изменяет индексы при update (только создает новые).
Во время выполнения:
Индекс используется СУБД для оптимизации запросов, но Hibernate напрямую его не контролирует.
Механизмы Hibernate и Spring Boot, влияющие на @Index
Генерация DDL (hibernate.hbm2ddl.auto):
create – создает таблицы и индексы при старте.
update – добавляет новые индексы, но не удаляет старые.
validate – проверяет соответствие модели и БД (включая индексы).
none – отключает управление схемой.
Настройки Spring Boot (application.properties):
Альтернативные способы определения индексов:
Через @Table(indexes = @Index(...)):
Через schema.sql (ручное управление индексами).
Кастомизация имен индексов:
Глобальное именование через ImplicitNamingStrategy (редко используется для индексов).
Особенности и ограничения
СУБД-специфичные индексы (например, частичные индексы в PostgreSQL) требуют @Index(options = "WHERE condition") или ручного SQL.
Составные индексы (columnList = "col1, col2") работают только в указанном порядке.
Миграции: Для сложных изменений индексов лучше использовать Flyway/Liquibase.
#Java #Training #Hard #Spring #Hibernate #Index
Аннотация @Index в Hibernate используется для определения индекса на одном или нескольких столбцах таблицы базы данных. Индексы ускоряют поиск и сортировку данных, но могут замедлять операции вставки и обновления.
Пакет: org.hibernate.annotations
Применяется к: классу (на уровне @Table), полю или свойству.
Параметры и настройки
Аннотация @Index имеет следующие атрибуты:
name (String):
Название индекса в БД.
Если не указано, Hibernate сгенерирует имя автоматически (например, IDX_<TABLE>_<COLUMN>).
columnList (String):
Обязательный параметр.
Список столбцов, входящих в индекс, через запятую (например, "username, email").
Поддерживает порядок сортировки: "username ASC, email DESC".
unique (boolean, по умолчанию false):
Если true, создает уникальный индекс (аналог UNIQUE INDEX в SQL).
options (String):
Дополнительные SQL-опции для индекса (например, "USING HASH" для MySQL).
Жизненный цикл и обработка
Во время компиляции:
Hibernate анализирует аннотацию и включает её в метаданные ORM.
При старте приложения (Hibernate bootstrap):
Индекс добавляется в DDL-скрипт при автоматической генерации схемы (hibernate.hbm2ddl.auto=create/update).
Если БД уже существует, Hibernate не изменяет индексы при update (только создает новые).
Во время выполнения:
Индекс используется СУБД для оптимизации запросов, но Hibernate напрямую его не контролирует.
Механизмы Hibernate и Spring Boot, влияющие на @Index
Генерация DDL (hibernate.hbm2ddl.auto):
create – создает таблицы и индексы при старте.
update – добавляет новые индексы, но не удаляет старые.
validate – проверяет соответствие модели и БД (включая индексы).
none – отключает управление схемой.
Настройки Spring Boot (application.properties):
spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.default_schema=public
spring.jpa.show-sql=true
Альтернативные способы определения индексов:
Через @Table(indexes = @Index(...)):
@Entity
@Table(indexes = @Index(name = "idx_user_email", columnList = "email", unique = true))
public class User { ... }
Через schema.sql (ручное управление индексами).
Кастомизация имен индексов:
Глобальное именование через ImplicitNamingStrategy (редко используется для индексов).
Особенности и ограничения
СУБД-специфичные индексы (например, частичные индексы в PostgreSQL) требуют @Index(options = "WHERE condition") или ручного SQL.
Составные индексы (columnList = "col1, col2") работают только в указанном порядке.
Миграции: Для сложных изменений индексов лучше использовать Flyway/Liquibase.
#Java #Training #Hard #Spring #Hibernate #Index
Всем доброго, субботнего утра! 🖐
Как прошла неделя?
Сегодня выходной, поэтому мы посмотрим подборку смешных видосов и делать ничего не будем!😜
А завтра в обычное время допишем футбольный сервис с @Shikin_Anatoliy!💪
Всем хороших выходных!🥳
Как прошла неделя?
Сегодня выходной, поэтому мы посмотрим подборку смешных видосов и делать ничего не будем!
А завтра в обычное время допишем футбольный сервис с @Shikin_Anatoliy!
Всем хороших выходных!
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Всем привет! ✌️
Сегодня мы вновь соберемся с @Shikin_Anatoliy, в 16:00 по МСК в Яндекс.Телемост, чтобы закончить тестовое задание по написанию футбольного сервиса.⚽️
Приходите и учитесь вместе с нами! 💪
Ждем всех 🫵
Сегодня мы вновь соберемся с @Shikin_Anatoliy, в 16:00 по МСК в Яндекс.Телемост, чтобы закончить тестовое задание по написанию футбольного сервиса.
Приходите и учитесь вместе с нами! 💪
Ждем всех 🫵
Please open Telegram to view this post
VIEW IN TELEGRAM