Аннотация @SecondaryTable
Аннотация @SecondaryTable используется в Java Persistence API (JPA) для указания дополнительной таблицы, связанной с основной таблицей сущности. Она находится в пакете javax.persistence (или jakarta.persistence в Jakarta EE). Эта аннотация применяется, когда сущность должна быть распределена между несколькими таблицами в базе данных, и позволяет маппить поля сущности на столбцы в дополнительной таблице.
Аннотация @SecondaryTable принимает несколько параметров, которые позволяют настроить связь с дополнительной таблицей:
name (тип: String):
Указывает имя дополнительной таблицы в базе данных.
Обязательный параметр.
catalog (тип: String):
Указывает каталог базы данных, в котором находится дополнительная таблица.
По умолчанию: каталог по умолчанию для базы данных.
schema (тип: String):
Указывает схему базы данных, в которой находится дополнительная таблица.
По умолчанию: схема по умолчанию для базы данных.
pkJoinColumns (тип: PrimaryKeyJoinColumn[]):
Указывает столбцы, которые связывают основную таблицу с дополнительной таблицей через первичный ключ.
Каждый элемент массива является аннотацией @PrimaryKeyJoinColumn, которая настраивает соответствующий столбец.
По умолчанию: JPA создает один столбец, ссылающийся на первичный ключ основной таблицы.
uniqueConstraints (тип: UniqueConstraint[]):
Позволяет задать уникальные ограничения для дополнительной таблицы.
Каждый элемент массива является аннотацией @UniqueConstraint, которая настраивает уникальное ограничение.
По умолчанию: уникальные ограничения не заданы.
indexes (тип: Index[]):
Позволяет задать индексы для дополнительной таблицы.
Каждый элемент массива является аннотацией @Index, которая настраивает индекс.
По умолчанию: индексы не заданы.
foreignKey (тип: ForeignKey):
Позволяет указать определение внешнего ключа для связи между основной и дополнительной таблицами.
По умолчанию: не задано.
Пример использования:
Если аннотация @SecondaryTable не указана, JPA предполагает, что все поля сущности маппятся на основную таблицу.
Кастомизация маппинга:
Если требуется кастомизировать маппинг таблиц (например, использовать собственные индексы или ограничения), можно использовать параметры uniqueConstraints, indexes и foreignKey.
Пример использования uniqueConstraints и indexes:
Варианты настройки
Использование name:
Позволяет явно указать имя дополнительной таблицы.
Использование pkJoinColumns:
Позволяет настроить столбцы, связывающие основную таблицу с дополнительной таблицей.
Использование uniqueConstraints:
Позволяет задать уникальные ограничения для дополнительной таблицы.
Использование indexes:
Позволяет улучшить производительность запросов к дополнительной таблице.
Использование foreignKey:
Позволяет задать определение внешнего ключа для связи между основной и дополнительной таблицами.
#Java #Training #Hard #Spring #SpringDataJPA #SecondaryTable
Аннотация @SecondaryTable используется в Java Persistence API (JPA) для указания дополнительной таблицы, связанной с основной таблицей сущности. Она находится в пакете javax.persistence (или jakarta.persistence в Jakarta EE). Эта аннотация применяется, когда сущность должна быть распределена между несколькими таблицами в базе данных, и позволяет маппить поля сущности на столбцы в дополнительной таблице.
Аннотация @SecondaryTable принимает несколько параметров, которые позволяют настроить связь с дополнительной таблицей:
name (тип: String):
Указывает имя дополнительной таблицы в базе данных.
Обязательный параметр.
catalog (тип: String):
Указывает каталог базы данных, в котором находится дополнительная таблица.
По умолчанию: каталог по умолчанию для базы данных.
schema (тип: String):
Указывает схему базы данных, в которой находится дополнительная таблица.
По умолчанию: схема по умолчанию для базы данных.
pkJoinColumns (тип: PrimaryKeyJoinColumn[]):
Указывает столбцы, которые связывают основную таблицу с дополнительной таблицей через первичный ключ.
Каждый элемент массива является аннотацией @PrimaryKeyJoinColumn, которая настраивает соответствующий столбец.
По умолчанию: JPA создает один столбец, ссылающийся на первичный ключ основной таблицы.
uniqueConstraints (тип: UniqueConstraint[]):
Позволяет задать уникальные ограничения для дополнительной таблицы.
Каждый элемент массива является аннотацией @UniqueConstraint, которая настраивает уникальное ограничение.
По умолчанию: уникальные ограничения не заданы.
indexes (тип: Index[]):
Позволяет задать индексы для дополнительной таблицы.
Каждый элемент массива является аннотацией @Index, которая настраивает индекс.
По умолчанию: индексы не заданы.
foreignKey (тип: ForeignKey):
Позволяет указать определение внешнего ключа для связи между основной и дополнительной таблицами.
По умолчанию: не задано.
Пример использования:
@Entity
@Table(name = "employee")
@SecondaryTable(
name = "employee_details",
pkJoinColumns = @PrimaryKeyJoinColumn(name = "employee_id")
)
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(table = "employee_details")
private String address;
@Column(table = "employee_details")
private String phoneNumber;
// Геттеры и сеттеры
}
Если аннотация @SecondaryTable не указана, JPA предполагает, что все поля сущности маппятся на основную таблицу.
Кастомизация маппинга:
Если требуется кастомизировать маппинг таблиц (например, использовать собственные индексы или ограничения), можно использовать параметры uniqueConstraints, indexes и foreignKey.
Пример использования uniqueConstraints и indexes:
@Entity
@Table(name = "employee")
@SecondaryTable(
name = "employee_details",
pkJoinColumns = @PrimaryKeyJoinColumn(name = "employee_id"),
uniqueConstraints = @UniqueConstraint(columnNames = {"employee_id", "phoneNumber"}),
indexes = @Index(columnList = "phoneNumber")
)
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(table = "employee_details")
private String address;
@Column(table = "employee_details")
private String phoneNumber;
// Геттеры и сеттеры
}
Варианты настройки
Использование name:
Позволяет явно указать имя дополнительной таблицы.
Использование pkJoinColumns:
Позволяет настроить столбцы, связывающие основную таблицу с дополнительной таблицей.
Использование uniqueConstraints:
Позволяет задать уникальные ограничения для дополнительной таблицы.
Использование indexes:
Позволяет улучшить производительность запросов к дополнительной таблице.
Использование foreignKey:
Позволяет задать определение внешнего ключа для связи между основной и дополнительной таблицами.
#Java #Training #Hard #Spring #SpringDataJPA #SecondaryTable
Аннотации @NamedQuery и @NamedQueries
Аннотации @NamedQuery и @NamedQueries используются в Java Persistence API (JPA) для определения именованных запросов (Named Queries), которые могут быть выполнены в рамках сущности. Они находятся в пакете javax.persistence (или jakarta.persistence в Jakarta EE).
@NamedQuery: Позволяет определить один именованный запрос.
@NamedQueries: Позволяет определить несколько именованных запросов для одной сущности.
Именованные запросы полезны для централизации и повторного использования JPQL (Java Persistence Query Language) или SQL-запросов.
@NamedQuery
Аннотация @NamedQuery принимает следующие параметры:
name (обязательный):
Уникальное имя запроса. Обычно используется формат EntityName.queryName.
Пример: "User.findByEmail".
query (обязательный):
Строка, содержащая JPQL или SQL-запрос.
Пример: "SELECT u FROM User u WHERE u.email = :email".
lockMode (необязательный):
Определяет режим блокировки для запроса. Возможные значения:
LockModeType.NONE (по умолчанию).
LockModeType.READ.
LockModeType.WRITE.
LockModeType.OPTIMISTIC.
LockModeType.PESSIMISTIC_READ.
LockModeType.PESSIMISTIC_WRITE.
hints (необязательный):
Массив подсказок (hints), которые могут быть переданы провайдеру JPA (например, Hibernate) для настройки выполнения запроса.
Пример: @QueryHint(name = "org.hibernate.cacheable", value = "true").
Пример использования:
@NamedQueries
Аннотация @NamedQueries используется для группировки нескольких аннотаций @NamedQuery. Она принимает массив @NamedQuery.
Пример использования:
Значения по умолчанию
Если параметры lockMode или hints не указаны, используются значения по умолчанию (LockModeType.NONE и пустой массив подсказок соответственно).
Жизненный цикл
Применение: Аннотации @NamedQuery и @NamedQueries применяются на этапе загрузки метаданных сущности JPA. Они регистрируются в EntityManagerFactory и доступны через EntityManager.
Инициализация: Запросы компилируются и кэшируются при создании EntityManagerFactory.
Уничтожение: Запросы остаются доступными до тех пор, пока существует EntityManagerFactory.
Кэширование запросов:
Spring Boot поддерживает кэширование запросов через Hibernate. Например:
Это может быть полезно для оптимизации производительности именованных запросов.
Интеграция с Spring Data JPA:
Spring Data JPA автоматически связывает именованные запросы с методами репозитория, если имя метода соответствует имени запроса.
Например, метод findByEmail в репозитории будет автоматически связан с именованным запросом User.findByEmail.
Варианты настройки
Использование JPQL:
Именованные запросы могут быть написаны на JPQL, что обеспечивает переносимость между разными базами данных.
Использование нативного SQL:
Если требуется использовать нативный SQL, можно указать это в запросе:
Кэширование запросов:
Для оптимизации производительности можно включить кэширование запросов через подсказки (hints).
Динамические запросы:
Если именованные запросы недостаточно гибки, можно использовать @Query в Spring Data JPA для определения запросов непосредственно в репозитории.
Пример использования @Query:
#Java #Training #Hard #Spring #SpringDataJPA #NamedQuery #NamedQueries
Аннотации @NamedQuery и @NamedQueries используются в Java Persistence API (JPA) для определения именованных запросов (Named Queries), которые могут быть выполнены в рамках сущности. Они находятся в пакете javax.persistence (или jakarta.persistence в Jakarta EE).
@NamedQuery: Позволяет определить один именованный запрос.
@NamedQueries: Позволяет определить несколько именованных запросов для одной сущности.
Именованные запросы полезны для централизации и повторного использования JPQL (Java Persistence Query Language) или SQL-запросов.
@NamedQuery
Аннотация @NamedQuery принимает следующие параметры:
name (обязательный):
Уникальное имя запроса. Обычно используется формат EntityName.queryName.
Пример: "User.findByEmail".
query (обязательный):
Строка, содержащая JPQL или SQL-запрос.
Пример: "SELECT u FROM User u WHERE u.email = :email".
lockMode (необязательный):
Определяет режим блокировки для запроса. Возможные значения:
LockModeType.NONE (по умолчанию).
LockModeType.READ.
LockModeType.WRITE.
LockModeType.OPTIMISTIC.
LockModeType.PESSIMISTIC_READ.
LockModeType.PESSIMISTIC_WRITE.
hints (необязательный):
Массив подсказок (hints), которые могут быть переданы провайдеру JPA (например, Hibernate) для настройки выполнения запроса.
Пример: @QueryHint(name = "org.hibernate.cacheable", value = "true").
Пример использования:
@NamedQuery(
name = "User.findByEmail",
query = "SELECT u FROM User u WHERE u.email = :email",
hints = {
@QueryHint(name = "org.hibernate.cacheable", value = "true")
}
)
@NamedQueries
Аннотация @NamedQueries используется для группировки нескольких аннотаций @NamedQuery. Она принимает массив @NamedQuery.
Пример использования:
@NamedQueries({
@NamedQuery(
name = "User.findByEmail",
query = "SELECT u FROM User u WHERE u.email = :email"
),
@NamedQuery(
name = "User.findAllActive",
query = "SELECT u FROM User u WHERE u.active = true"
)
})
Значения по умолчанию
Если параметры lockMode или hints не указаны, используются значения по умолчанию (LockModeType.NONE и пустой массив подсказок соответственно).
Жизненный цикл
Применение: Аннотации @NamedQuery и @NamedQueries применяются на этапе загрузки метаданных сущности JPA. Они регистрируются в EntityManagerFactory и доступны через EntityManager.
Инициализация: Запросы компилируются и кэшируются при создании EntityManagerFactory.
Уничтожение: Запросы остаются доступными до тех пор, пока существует EntityManagerFactory.
Кэширование запросов:
Spring Boot поддерживает кэширование запросов через Hibernate. Например:
spring.jpa.properties.hibernate.cache.use_query_cache=true
Это может быть полезно для оптимизации производительности именованных запросов.
Интеграция с Spring Data JPA:
Spring Data JPA автоматически связывает именованные запросы с методами репозитория, если имя метода соответствует имени запроса.
Например, метод findByEmail в репозитории будет автоматически связан с именованным запросом User.findByEmail.
Варианты настройки
Использование JPQL:
Именованные запросы могут быть написаны на JPQL, что обеспечивает переносимость между разными базами данных.
Использование нативного SQL:
Если требуется использовать нативный SQL, можно указать это в запросе:
@NamedQuery(
name = "User.findByEmailNative",
query = "SELECT * FROM users WHERE email = :email",
resultClass = User.class
)
Кэширование запросов:
Для оптимизации производительности можно включить кэширование запросов через подсказки (hints).
Динамические запросы:
Если именованные запросы недостаточно гибки, можно использовать @Query в Spring Data JPA для определения запросов непосредственно в репозитории.
Пример использования @Query:
public interface UserRepository extends JpaRepository<User, Long> {
@Query("SELECT u FROM User u WHERE u.email = :email")
User findByEmail(@Param("email") String email);
}
#Java #Training #Hard #Spring #SpringDataJPA #NamedQuery #NamedQueries
Что выведет код?
#Tasks
import java.util.HashSet;
public class Task190325 {
public static void main(String[] args) {
Set<String> set = new HashSet<>();
String s1 = new String("a");
String s2 = new String("a");
set.add(s1);
set.add(s2);
set.add(null);
set.remove(null);
System.out.println(set.size());
}
}
#Tasks
Please open Telegram to view this post
VIEW IN TELEGRAM
Вопросы с собеседования 👩💻
Что произойдёт при делении числа на 0 в Java?
Что произойдёт при делении числа на 0 в Java?
Anonymous Quiz
6%
Вернётся 0
4%
Программа завершится без ошибок
78%
Выбросится исключение ArithmeticException
12%
Вернётся бесконечность
Аннотации @NamedNativeQuery и @NamedNativeQueries
Аннотации @NamedNativeQuery и @NamedNativeQueries используются в Java Persistence API (JPA) для определения именованных нативных SQL-запросов (Named Native Queries). Они находятся в пакете javax.persistence (или jakarta.persistence в Jakarta EE).
@NamedNativeQuery: Позволяет определить один именованный нативный SQL-запрос.
@NamedNativeQueries: Позволяет определить несколько именованных нативных SQL-запросов для одной сущности.
Нативные запросы полезны, когда требуется использовать специфические для базы данных функции или оптимизировать выполнение запросов, которые сложно выразить через JPQL.
@NamedNativeQuery
Аннотация @NamedNativeQuery принимает следующие параметры:
name (обязательный):
Уникальное имя запроса. Обычно используется формат EntityName.queryName.
Пример: "User.findByEmailNative".
query (обязательный):
Строка, содержащая нативный SQL-запрос.
Пример: "SELECT * FROM users WHERE email = :email".
resultClass (необязательный):
Класс сущности, к которому будет маппиться результат запроса.
Пример: resultClass = User.class.
resultSetMapping (необязательный):
Имя маппинга результата, определенного с помощью @SqlResultSetMapping.
Используется, если результат запроса не соответствует напрямую сущности.
hints (необязательный):
Массив подсказок (hints), которые могут быть переданы провайдеру JPA (например, Hibernate) для настройки выполнения запроса.
Пример: @QueryHint(name = "org.hibernate.cacheable", value = "true").
Пример использования:
@NamedNativeQueries
Аннотация @NamedNativeQueries используется для группировки нескольких аннотаций @NamedNativeQuery. Она принимает массив @NamedNativeQuery.
Пример использования:
Значения по умолчанию
Если параметры resultClass, resultSetMapping или hints не указаны, используются значения по умолчанию (отсутствие маппинга и пустой массив подсказок соответственно).
Варианты настройки
Использование нативного SQL:
Нативные запросы позволяют использовать специфические для базы данных функции и оптимизации.
Маппинг результатов:
Если результат запроса не соответствует напрямую сущности, можно использовать @SqlResultSetMapping для кастомизации маппинга.
Пример использования @SqlResultSetMapping:
Кэширование запросов:
Для оптимизации производительности можно включить кэширование запросов через подсказки (hints).
Динамические нативные запросы:
Если именованные нативные запросы недостаточно гибки, можно использовать @Query с параметром nativeQuery = true в Spring Data JPA для определения запросов непосредственно в репозитории.
Пример использования @Query:
#Java #Training #Hard #Spring #SpringDataJPA #NamedNativeQuery #NamedNativeQueries
Аннотации @NamedNativeQuery и @NamedNativeQueries используются в Java Persistence API (JPA) для определения именованных нативных SQL-запросов (Named Native Queries). Они находятся в пакете javax.persistence (или jakarta.persistence в Jakarta EE).
@NamedNativeQuery: Позволяет определить один именованный нативный SQL-запрос.
@NamedNativeQueries: Позволяет определить несколько именованных нативных SQL-запросов для одной сущности.
Нативные запросы полезны, когда требуется использовать специфические для базы данных функции или оптимизировать выполнение запросов, которые сложно выразить через JPQL.
@NamedNativeQuery
Аннотация @NamedNativeQuery принимает следующие параметры:
name (обязательный):
Уникальное имя запроса. Обычно используется формат EntityName.queryName.
Пример: "User.findByEmailNative".
query (обязательный):
Строка, содержащая нативный SQL-запрос.
Пример: "SELECT * FROM users WHERE email = :email".
resultClass (необязательный):
Класс сущности, к которому будет маппиться результат запроса.
Пример: resultClass = User.class.
resultSetMapping (необязательный):
Имя маппинга результата, определенного с помощью @SqlResultSetMapping.
Используется, если результат запроса не соответствует напрямую сущности.
hints (необязательный):
Массив подсказок (hints), которые могут быть переданы провайдеру JPA (например, Hibernate) для настройки выполнения запроса.
Пример: @QueryHint(name = "org.hibernate.cacheable", value = "true").
Пример использования:
@NamedNativeQuery(
name = "User.findByEmailNative",
query = "SELECT * FROM users WHERE email = :email",
resultClass = User.class,
hints = {
@QueryHint(name = "org.hibernate.cacheable", value = "true")
}
)
@NamedNativeQueries
Аннотация @NamedNativeQueries используется для группировки нескольких аннотаций @NamedNativeQuery. Она принимает массив @NamedNativeQuery.
Пример использования:
@NamedNativeQueries({
@NamedNativeQuery(
name = "User.findByEmailNative",
query = "SELECT * FROM users WHERE email = :email",
resultClass = User.class
),
@NamedNativeQuery(
name = "User.findAllActiveNative",
query = "SELECT * FROM users WHERE active = 1",
resultClass = User.class
)
})
Значения по умолчанию
Если параметры resultClass, resultSetMapping или hints не указаны, используются значения по умолчанию (отсутствие маппинга и пустой массив подсказок соответственно).
Варианты настройки
Использование нативного SQL:
Нативные запросы позволяют использовать специфические для базы данных функции и оптимизации.
Маппинг результатов:
Если результат запроса не соответствует напрямую сущности, можно использовать @SqlResultSetMapping для кастомизации маппинга.
Пример использования @SqlResultSetMapping:
@SqlResultSetMapping(
name = "UserMapping",
entities = @EntityResult(entityClass = User.class)
)
@NamedNativeQuery(
name = "User.findByEmailNative",
query = "SELECT * FROM users WHERE email = :email",
resultSetMapping = "UserMapping"
)
Кэширование запросов:
Для оптимизации производительности можно включить кэширование запросов через подсказки (hints).
Динамические нативные запросы:
Если именованные нативные запросы недостаточно гибки, можно использовать @Query с параметром nativeQuery = true в Spring Data JPA для определения запросов непосредственно в репозитории.
Пример использования @Query:
public interface UserRepository extends JpaRepository<User, Long> {
@Query(nativeQuery = true, value = "SELECT * FROM users WHERE email = :email")
User findByEmailNative(@Param("email") String email);
}
#Java #Training #Hard #Spring #SpringDataJPA #NamedNativeQuery #NamedNativeQueries
Аннотации @Convert и @Converter
Аннотации @Convert и @Converter используются в Java Persistence API (JPA) для кастомизации маппинга атрибутов сущности на базу данных. Они находятся в пакете javax.persistence (или jakarta.persistence в Jakarta EE).
@Converter: Позволяет определить класс, который реализует интерфейс AttributeConverter для преобразования атрибута сущности в тип, поддерживаемый базой данных, и наоборот.
@Convert: Позволяет применить конкретный конвертер к атрибуту сущности.
Эти аннотации полезны, когда требуется сохранить в базе данных сложные типы данных (например, перечисления, коллекции или пользовательские объекты), которые не поддерживаются напрямую JPA.
Параметры и настройки
@Converter
Аннотация @Converter применяется к классу, который реализует интерфейс AttributeConverter. Она принимает следующие параметры:
autoApply (необязательный):
Если true, конвертер автоматически применяется ко всем атрибутам сущности, которые имеют соответствующий тип.
Если false, конвертер применяется только к тем атрибутам, которые явно аннотированы @Convert.
По умолчанию: false.
Пример использования:
@Convert
Аннотация @Convert применяется к атрибуту сущности для указания конкретного конвертера. Она принимает следующие параметры:
converter (обязательный):
Класс конвертера, который должен быть применен к атрибуту.
Пример: converter = StatusConverter.class.
attributeName (необязательный):
Используется для указания атрибута вложенного объекта (например, в @Embeddable).
По умолчанию: не используется.
Пример использования:
Значения по умолчанию
Если параметр autoApply не указан в @Converter, по умолчанию используется false.
Если параметр attributeName не указан в @Convert, конвертер применяется к текущему атрибуту.
Жизненный цикл
Применение: Конвертеры применяются на этапе маппинга сущности JPA. Они используются при сохранении сущности в базу данных и при загрузке сущности из базы данных.
Инициализация: Конвертеры инициализируются при создании EntityManagerFactory.
Уничтожение: Конвертеры остаются активными до тех пор, пока существует EntityManagerFactory.
Автоматическое применение конвертеров:
Если конвертер аннотирован @Converter(autoApply = true), он автоматически применяется ко всем атрибутам соответствующего типа в сущностях.
#Java #Training #Hard #Spring #SpringDataJPA #Convert #Converter
Аннотации @Convert и @Converter используются в Java Persistence API (JPA) для кастомизации маппинга атрибутов сущности на базу данных. Они находятся в пакете javax.persistence (или jakarta.persistence в Jakarta EE).
@Converter: Позволяет определить класс, который реализует интерфейс AttributeConverter для преобразования атрибута сущности в тип, поддерживаемый базой данных, и наоборот.
@Convert: Позволяет применить конкретный конвертер к атрибуту сущности.
Эти аннотации полезны, когда требуется сохранить в базе данных сложные типы данных (например, перечисления, коллекции или пользовательские объекты), которые не поддерживаются напрямую JPA.
Параметры и настройки
@Converter
Аннотация @Converter применяется к классу, который реализует интерфейс AttributeConverter. Она принимает следующие параметры:
autoApply (необязательный):
Если true, конвертер автоматически применяется ко всем атрибутам сущности, которые имеют соответствующий тип.
Если false, конвертер применяется только к тем атрибутам, которые явно аннотированы @Convert.
По умолчанию: false.
Пример использования:
@Converter(autoApply = true)
public class StatusConverter implements AttributeConverter<Status, String> {
@Override
public String convertToDatabaseColumn(Status status) {
return status.name().toLowerCase();
}
@Override
public Status convertToEntityAttribute(String dbData) {
return Status.valueOf(dbData.toUpperCase());
}
}
@Convert
Аннотация @Convert применяется к атрибуту сущности для указания конкретного конвертера. Она принимает следующие параметры:
converter (обязательный):
Класс конвертера, который должен быть применен к атрибуту.
Пример: converter = StatusConverter.class.
attributeName (необязательный):
Используется для указания атрибута вложенного объекта (например, в @Embeddable).
По умолчанию: не используется.
Пример использования:
@Entity
public class User {
@Convert(converter = StatusConverter.class)
private Status status;
}
Значения по умолчанию
Если параметр autoApply не указан в @Converter, по умолчанию используется false.
Если параметр attributeName не указан в @Convert, конвертер применяется к текущему атрибуту.
Жизненный цикл
Применение: Конвертеры применяются на этапе маппинга сущности JPA. Они используются при сохранении сущности в базу данных и при загрузке сущности из базы данных.
Инициализация: Конвертеры инициализируются при создании EntityManagerFactory.
Уничтожение: Конвертеры остаются активными до тех пор, пока существует EntityManagerFactory.
Автоматическое применение конвертеров:
Если конвертер аннотирован @Converter(autoApply = true), он автоматически применяется ко всем атрибутам соответствующего типа в сущностях.
#Java #Training #Hard #Spring #SpringDataJPA #Convert #Converter
Кастомизация конвертеров:
Spring Boot позволяет регистрировать конвертеры вручную через конфигурацию EntityManagerFactory.
Пример ручной регистрации конвертера:
Варианты настройки
Автоматическое применение:
Используйте @Converter(autoApply = true), если конвертер должен применяться ко всем атрибутам соответствующего типа.
Ручное применение:
Используйте @Convert(converter = MyConverter.class), если конвертер должен применяться только к конкретным атрибутам.
Кастомизация маппинга:
Для сложных сценариев можно использовать @Embeddable и @Embedded в сочетании с конвертерами.
Пример использования @Embeddable:
Использование вложенных объектов:
Конвертеры могут применяться к атрибутам вложенных объектов через параметр attributeName в @Convert.
#Java #Training #Hard #Spring #SpringDataJPA #Convert #Converter
Spring Boot позволяет регистрировать конвертеры вручную через конфигурацию EntityManagerFactory.
Пример ручной регистрации конвертера:
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource) {
LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
em.setDataSource(dataSource);
em.setPackagesToScan("com.example.domain");
HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
em.setJpaVendorAdapter(vendorAdapter);
Map<String, Object> properties = new HashMap<>();
properties.put("hibernate.dialect", "org.hibernate.dialect.MySQL8Dialect");
properties.put("hibernate.hbm2ddl.auto", "update");
em.setJpaPropertyMap(properties);
// Регистрация конвертера
em.setSharedCacheMode(SharedCacheMode.ENABLE_SELECTIVE);
em.getJpaPropertyMap().put("javax.persistence.bean.validation.mode", "none");
em.getJpaPropertyMap().put("hibernate.session_factory.interceptor", new EmptyInterceptor() {
@Override
public void onSave(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) {
// Логика перехвата
}
});
return em;
}
Варианты настройки
Автоматическое применение:
Используйте @Converter(autoApply = true), если конвертер должен применяться ко всем атрибутам соответствующего типа.
Ручное применение:
Используйте @Convert(converter = MyConverter.class), если конвертер должен применяться только к конкретным атрибутам.
Кастомизация маппинга:
Для сложных сценариев можно использовать @Embeddable и @Embedded в сочетании с конвертерами.
Пример использования @Embeddable:
@Embeddable
public class Address {
private String street;
private String city;
@Convert(converter = ZipCodeConverter.class)
private String zipCode;
}
Использование вложенных объектов:
Конвертеры могут применяться к атрибутам вложенных объектов через параметр attributeName в @Convert.
#Java #Training #Hard #Spring #SpringDataJPA #Convert #Converter
Что выведет код?
#Tasks
public class Task200325 {
public static void main(String[] args) {
int[] arr = new int[5];
arr[0] = 1;
arr[1] = 2;
arr[2] = arr[0] + arr[1];
arr[3] = arr[2] + arr[1];
arr[4] = arr[3] + arr[2];
System.out.println(arr[4]);
}
}
#Tasks
Please open Telegram to view this post
VIEW IN TELEGRAM
Вопросы с собеседования 👩💻
Какой оператор используется для логического "И"?
Какой оператор используется для логического "И"?
Anonymous Quiz
13%
||
85%
&&
0%
!
2%
|
Аннотации @PrePersist и @PostPersist
Аннотации @PrePersist и @PostPersist используются в Java Persistence API (JPA) для указания методов обратного вызова (callback), которые выполняются до и после сохранения сущности в базу данных. Они находятся в пакете javax.persistence (или jakarta.persistence в Jakarta EE).
@PrePersist: Метод, аннотированный @PrePersist, вызывается перед тем, как сущность будет сохранена в базу данных (перед выполнением persist).
@PostPersist: Метод, аннотированный @PostPersist, вызывается после того, как сущность была успешно сохранена в базу данных (после выполнения persist).
Эти аннотации полезны для выполнения дополнительной логики, например, инициализации значений, валидации или логирования, до или после сохранения сущности.
Параметры и настройки
Аннотации @PrePersist и @PostPersist не принимают параметров. Они применяются к методам сущности, которые должны быть вызваны в соответствующий момент жизненного цикла сущности.
Требования к методам:
Метод должен быть void и не принимать параметров.
Метод может иметь любой модификатор доступа (public, protected, private).
Метод не должен быть статическим.
Пример использования:
Жизненный цикл
@PrePersist:
Вызывается перед выполнением операции persist в EntityManager.
Используется для инициализации или валидации данных перед сохранением.
Пример: установка значений по умолчанию, генерация UUID, проверка обязательных полей.
@PostPersist:
Вызывается после успешного выполнения операции persist и фиксации транзакции.
Используется для выполнения действий после сохранения, например, логирования или отправки уведомлений.
Пример: логирование ID сохраненной сущности, отправка события в систему сообщений.
Логирование жизненного цикла:
Для отладки можно включить логирование жизненного цикла сущностей через Hibernate:
Кастомизация событий:
Если требуется более сложная обработка событий, можно использовать @EntityListeners для определения слушателей сущностей.
Пример использования @EntityListeners:
Варианты настройки
Использование @EntityListeners:
Для разделения логики можно вынести методы обратного вызова в отдельный класс и использовать @EntityListeners.
Глобальные слушатели:
Для применения логики ко всем сущностям можно зарегистрировать глобальный слушатель через Hibernate.
Пример глобального слушателя:
Регистрация глобального слушателя в Hibernate:
#Java #Training #Hard #Spring #SpringDataJPA #PrePersist #PostPersist
Аннотации @PrePersist и @PostPersist используются в Java Persistence API (JPA) для указания методов обратного вызова (callback), которые выполняются до и после сохранения сущности в базу данных. Они находятся в пакете javax.persistence (или jakarta.persistence в Jakarta EE).
@PrePersist: Метод, аннотированный @PrePersist, вызывается перед тем, как сущность будет сохранена в базу данных (перед выполнением persist).
@PostPersist: Метод, аннотированный @PostPersist, вызывается после того, как сущность была успешно сохранена в базу данных (после выполнения persist).
Эти аннотации полезны для выполнения дополнительной логики, например, инициализации значений, валидации или логирования, до или после сохранения сущности.
Параметры и настройки
Аннотации @PrePersist и @PostPersist не принимают параметров. Они применяются к методам сущности, которые должны быть вызваны в соответствующий момент жизненного цикла сущности.
Требования к методам:
Метод должен быть void и не принимать параметров.
Метод может иметь любой модификатор доступа (public, protected, private).
Метод не должен быть статическим.
Пример использования:
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@PrePersist
private void beforePersist() {
System.out.println("Before persisting user: " + this.name);
if (this.name == null) {
this.name = "DEFAULT_NAME";
}
}
@PostPersist
private void afterPersist() {
System.out.println("User persisted with ID: " + this.id);
}
}
Жизненный цикл
@PrePersist:
Вызывается перед выполнением операции persist в EntityManager.
Используется для инициализации или валидации данных перед сохранением.
Пример: установка значений по умолчанию, генерация UUID, проверка обязательных полей.
@PostPersist:
Вызывается после успешного выполнения операции persist и фиксации транзакции.
Используется для выполнения действий после сохранения, например, логирования или отправки уведомлений.
Пример: логирование ID сохраненной сущности, отправка события в систему сообщений.
Логирование жизненного цикла:
Для отладки можно включить логирование жизненного цикла сущностей через Hibernate:
spring.jpa.properties.hibernate.ejb.event.post-persist=org.hibernate.event.internal.DefaultPersistEventListener
Кастомизация событий:
Если требуется более сложная обработка событий, можно использовать @EntityListeners для определения слушателей сущностей.
Пример использования @EntityListeners:
@Entity
@EntityListeners(UserListener.class)
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
}
public class UserListener {
@PrePersist
public void beforePersist(User user) {
System.out.println("Before persisting user: " + user.getName());
}
@PostPersist
public void afterPersist(User user) {
System.out.println("User persisted with ID: " + user.getId());
}
}
Варианты настройки
Использование @EntityListeners:
Для разделения логики можно вынести методы обратного вызова в отдельный класс и использовать @EntityListeners.
Глобальные слушатели:
Для применения логики ко всем сущностям можно зарегистрировать глобальный слушатель через Hibernate.
Пример глобального слушателя:
public class GlobalEntityListener {
@PrePersist
public void beforePersist(Object entity) {
System.out.println("Before persisting entity: " + entity.getClass().getSimpleName());
}
@PostPersist
public void afterPersist(Object entity) {
System.out.println("Entity persisted: " + entity.getClass().getSimpleName());
}
}
Регистрация глобального слушателя в Hibernate:
spring.jpa.properties.hibernate.ejb.event.pre-persist=com.example.GlobalEntityListener
spring.jpa.properties.hibernate.ejb.event.post-persist=com.example.GlobalEntityListener
#Java #Training #Hard #Spring #SpringDataJPA #PrePersist #PostPersist