Please open Telegram to view this post
VIEW IN TELEGRAM
Вопросы с собеседования 👩💻
Что такое null в Java?
Что такое null в Java?
Anonymous Quiz
8%
Число 0
11%
Пустая строка
79%
Отсутствие ссылки на объект
2%
Выполнение ошибки
Аннотации @DiscriminatorColumn и @DiscriminatorValue
Аннотации @DiscriminatorColumn и @DiscriminatorValue используются в Java Persistence API (JPA) для работы с наследованием сущностей, когда применяется стратегия InheritanceType.SINGLE_TABLE. Они помогают различать типы сущностей в одной таблице базы данных.
@DiscriminatorColumn: Определяет столбец в таблице базы данных, который хранит информацию о типе сущности.
@DiscriminatorValue: Указывает значение, которое будет храниться в дискриминаторном столбце для конкретной сущности.
Обе аннотации находятся в пакете javax.persistence (или jakarta.persistence в Jakarta EE).
Аннотация @DiscriminatorColumn
Аннотация @DiscriminatorColumn принимает следующие параметры:
name: Имя дискриминаторного столбца в таблице базы данных.
По умолчанию: "DTYPE".
discriminatorType: Тип данных дискриминаторного столбца.
Может принимать одно из следующих значений:
DiscriminatorType.STRING: Столбец хранит строковые значения (по умолчанию).
DiscriminatorType.CHAR: Столбец хранит символьные значения.
DiscriminatorType.INTEGER: Столбец хранит целочисленные значения.
По умолчанию: DiscriminatorType.STRING.
columnDefinition: Определение столбца в SQL (например, тип данных и ограничения).
По умолчанию: генерируется автоматически.
length: Длина столбца (актуально для строковых типов).
По умолчанию: 31.
Пример использования:
Аннотация @DiscriminatorValue
Аннотация @DiscriminatorValue принимает один параметр — value, который определяет значение, хранимое в дискриминаторном столбце для конкретной сущности.
Пример использования:
Если @DiscriminatorColumn не указана, JPA по умолчанию создает столбец с именем "DTYPE" и типом DiscriminatorType.STRING.
Если @DiscriminatorValue не указана, JPA использует имя класса сущности в качестве значения.
Жизненный цикл
Применение: Аннотации применяются на этапе маппинга сущности JPA. Они определяют, как сущности будут различаться в одной таблице.
Инициализация: При загрузке сущности из базы данных JPA использует значение дискриминаторного столбца для определения типа сущности.
Уничтожение: При сохранении сущности в базу данных JPA записывает значение дискриминаторного столбца.
Кастомизация дискриминаторного столбца:
Если требуется изменить параметры дискриминаторного столбца (например, имя или тип), можно использовать аннотацию @DiscriminatorColumn с нужными значениями.
Пример использования
В этом примере:
Сущности Car и Truck наследуются от Vehicle.
В таблице Vehicle создается столбец vehicle_type, который хранит значения "CAR" для автомобилей и "TRUCK" для грузовиков.
#Java #Training #Hard #Spring #SpringDataJPA #DiscriminatorColumn #DiscriminatorValue
Аннотации @DiscriminatorColumn и @DiscriminatorValue используются в Java Persistence API (JPA) для работы с наследованием сущностей, когда применяется стратегия InheritanceType.SINGLE_TABLE. Они помогают различать типы сущностей в одной таблице базы данных.
@DiscriminatorColumn: Определяет столбец в таблице базы данных, который хранит информацию о типе сущности.
@DiscriminatorValue: Указывает значение, которое будет храниться в дискриминаторном столбце для конкретной сущности.
Обе аннотации находятся в пакете javax.persistence (или jakarta.persistence в Jakarta EE).
Аннотация @DiscriminatorColumn
Аннотация @DiscriminatorColumn принимает следующие параметры:
name: Имя дискриминаторного столбца в таблице базы данных.
По умолчанию: "DTYPE".
discriminatorType: Тип данных дискриминаторного столбца.
Может принимать одно из следующих значений:
DiscriminatorType.STRING: Столбец хранит строковые значения (по умолчанию).
DiscriminatorType.CHAR: Столбец хранит символьные значения.
DiscriminatorType.INTEGER: Столбец хранит целочисленные значения.
По умолчанию: DiscriminatorType.STRING.
columnDefinition: Определение столбца в SQL (например, тип данных и ограничения).
По умолчанию: генерируется автоматически.
length: Длина столбца (актуально для строковых типов).
По умолчанию: 31.
Пример использования:
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "vehicle_type", discriminatorType = DiscriminatorType.STRING, length = 20)
public class Vehicle {
@Id
private Long id;
private String manufacturer;
}
Аннотация @DiscriminatorValue
Аннотация @DiscriminatorValue принимает один параметр — value, который определяет значение, хранимое в дискриминаторном столбце для конкретной сущности.
Пример использования:
@Entity
@DiscriminatorValue("CAR")
public class Car extends Vehicle {
private int numberOfSeats;
}
@Entity
@DiscriminatorValue("TRUCK")
public class Truck extends Vehicle {
private double payloadCapacity;
}
Если @DiscriminatorColumn не указана, JPA по умолчанию создает столбец с именем "DTYPE" и типом DiscriminatorType.STRING.
Если @DiscriminatorValue не указана, JPA использует имя класса сущности в качестве значения.
Жизненный цикл
Применение: Аннотации применяются на этапе маппинга сущности JPA. Они определяют, как сущности будут различаться в одной таблице.
Инициализация: При загрузке сущности из базы данных JPA использует значение дискриминаторного столбца для определения типа сущности.
Уничтожение: При сохранении сущности в базу данных JPA записывает значение дискриминаторного столбца.
Кастомизация дискриминаторного столбца:
Если требуется изменить параметры дискриминаторного столбца (например, имя или тип), можно использовать аннотацию @DiscriminatorColumn с нужными значениями.
Пример использования
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "vehicle_type", discriminatorType = DiscriminatorType.STRING, length = 20)
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;
}
В этом примере:
Сущности Car и Truck наследуются от Vehicle.
В таблице Vehicle создается столбец vehicle_type, который хранит значения "CAR" для автомобилей и "TRUCK" для грузовиков.
#Java #Training #Hard #Spring #SpringDataJPA #DiscriminatorColumn #DiscriminatorValue
Аннотация @MappedSuperclass
Аннотация @MappedSuperclass используется в Java Persistence API (JPA) для обозначения класса, который является суперклассом для сущностей, но сам по себе не является сущностью. Этот класс может содержать общие поля и методы, которые будут унаследованы дочерними сущностями. Аннотация находится в пакете javax.persistence (или jakarta.persistence в Jakarta EE).
Аннотация @MappedSuperclass не принимает параметров. Её основная цель — указать, что класс является маппированным суперклассом, и его поля и методы должны быть унаследованы дочерними сущностями.
Пример использования:
Жизненный цикл
Применение: Аннотация @MappedSuperclass применяется на этапе маппинга сущностей JPA. Она указывает, что поля и методы суперкласса должны быть включены в маппинг дочерних сущностей.
Инициализация: При загрузке сущности из базы данных JPA учитывает поля, унаследованные от маппированного суперкласса.
Уничтожение: При сохранении сущности в базу данных JPA сохраняет значения полей, унаследованных от маппированного суперкласса.
Механизмы Spring и настройки Spring Boot
JPA и Hibernate: Spring Data JPA использует провайдеров JPA (например, Hibernate) для работы с базой данных. Аннотация @MappedSuperclass обрабатывается на уровне JPA, но Spring обеспечивает интеграцию через EntityManager и репозитории.
Наследование сущностей: Spring Data JPA поддерживает наследование сущностей, включая использование @MappedSuperclass. Это позволяет избежать дублирования кода и упрощает управление общими полями.
Настройки Spring Boot
Spring Boot упрощает настройку JPA через свойства конфигурации. Вот несколько ключевых настроек, которые могут влиять на работу @MappedSuperclass:
Генерация схемы базы данных:
Если используется автоматическая генерация схемы (например, через Hibernate), Spring Boot настраивает это через свойство:
В этом случае Hibernate создаст таблицы для дочерних сущностей, включая поля, унаследованные от маппированного суперкласса.
Интеграция с репозиториями:
Spring Data JPA предоставляет репозитории для работы с сущностями. Дочерние сущности, наследующие от @MappedSuperclass, могут быть использованы в репозиториях как обычные сущности.
Пример репозитория:
Варианты настройки
Использование @MappedSuperclass для общих полей:
Подходит для случаев, когда несколько сущностей имеют общие поля (например, id, createdAt, updatedAt).
Упрощает поддержку кода и уменьшает дублирование.
Использование @Embeddable и @Embedded:
Если требуется повторное использование группы полей в нескольких сущностях, можно использовать аннотации @Embeddable и @Embedded. Это альтернатива @MappedSuperclass.
Использование наследования стратегий JPA:
В JPA также доступны другие стратегии наследования, такие как SINGLE_TABLE, JOINED и TABLE_PER_CLASS. Они могут быть использованы вместо @MappedSuperclass, если требуется более сложная модель наследования.
Пример использования стратегии SINGLE_TABLE:
#Java #Training #Hard #Spring #SpringDataJPA #MappedSuperclass
Аннотация @MappedSuperclass используется в Java Persistence API (JPA) для обозначения класса, который является суперклассом для сущностей, но сам по себе не является сущностью. Этот класс может содержать общие поля и методы, которые будут унаследованы дочерними сущностями. Аннотация находится в пакете javax.persistence (или jakarta.persistence в Jakarta EE).
Аннотация @MappedSuperclass не принимает параметров. Её основная цель — указать, что класс является маппированным суперклассом, и его поля и методы должны быть унаследованы дочерними сущностями.
Пример использования:
@MappedSuperclass
public abstract class BaseEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "created_at")
private LocalDateTime createdAt;
// Геттеры и сеттеры
}
@Entity
public class User extends BaseEntity {
private String name;
private String email;
}
Жизненный цикл
Применение: Аннотация @MappedSuperclass применяется на этапе маппинга сущностей JPA. Она указывает, что поля и методы суперкласса должны быть включены в маппинг дочерних сущностей.
Инициализация: При загрузке сущности из базы данных JPA учитывает поля, унаследованные от маппированного суперкласса.
Уничтожение: При сохранении сущности в базу данных JPA сохраняет значения полей, унаследованных от маппированного суперкласса.
Механизмы Spring и настройки Spring Boot
JPA и Hibernate: Spring Data JPA использует провайдеров JPA (например, Hibernate) для работы с базой данных. Аннотация @MappedSuperclass обрабатывается на уровне JPA, но Spring обеспечивает интеграцию через EntityManager и репозитории.
Наследование сущностей: Spring Data JPA поддерживает наследование сущностей, включая использование @MappedSuperclass. Это позволяет избежать дублирования кода и упрощает управление общими полями.
Настройки Spring Boot
Spring Boot упрощает настройку JPA через свойства конфигурации. Вот несколько ключевых настроек, которые могут влиять на работу @MappedSuperclass:
Генерация схемы базы данных:
Если используется автоматическая генерация схемы (например, через Hibernate), Spring Boot настраивает это через свойство:
spring.jpa.hibernate.ddl-auto=update
В этом случае Hibernate создаст таблицы для дочерних сущностей, включая поля, унаследованные от маппированного суперкласса.
Интеграция с репозиториями:
Spring Data JPA предоставляет репозитории для работы с сущностями. Дочерние сущности, наследующие от @MappedSuperclass, могут быть использованы в репозиториях как обычные сущности.
Пример репозитория:
public interface UserRepository extends JpaRepository<User, Long> {
}
Варианты настройки
Использование @MappedSuperclass для общих полей:
Подходит для случаев, когда несколько сущностей имеют общие поля (например, id, createdAt, updatedAt).
Упрощает поддержку кода и уменьшает дублирование.
Использование @Embeddable и @Embedded:
Если требуется повторное использование группы полей в нескольких сущностях, можно использовать аннотации @Embeddable и @Embedded. Это альтернатива @MappedSuperclass.
Использование наследования стратегий JPA:
В JPA также доступны другие стратегии наследования, такие как SINGLE_TABLE, JOINED и TABLE_PER_CLASS. Они могут быть использованы вместо @MappedSuperclass, если требуется более сложная модель наследования.
Пример использования стратегии SINGLE_TABLE:
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
public abstract class BaseEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
}
@Entity
public class User extends BaseEntity {
private String name;
}
#Java #Training #Hard #Spring #SpringDataJPA #MappedSuperclass
Что выведет код?
#Tasks
public class Task120325 {
public static void main(String[] args) {
int i = 0;
while (i++ < 5) {
if (i == 3) return;
System.out.print(i + " ");
}
}
}
#Tasks
Please open Telegram to view this post
VIEW IN TELEGRAM
Вопросы с собеседования 👩💻
Какой метод преобразует строку в целое число?
Какой метод преобразует строку в целое число?
Anonymous Quiz
6%
parseString()
15%
Integer.valueOf()
13%
String.toInt()
67%
Integer.parseInt()
Аннотация @OneToOne
Аннотация @OneToOne используется в Java Persistence API (JPA) для обозначения отношения "один к одному" между двумя сущностями. Она указывает, что одна сущность связана с другой сущностью через уникальное отношение. Аннотация находится в пакете javax.persistence (или jakarta.persistence в Jakarta EE).
Аннотация @OneToOne принимает несколько параметров для настройки отношения:
targetEntity: Указывает класс целевой сущности (если он не может быть выведен из типа поля).
Пример:
cascade: Определяет каскадные операции, которые должны быть применены к связанной сущности.
Возможные значения: CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE, CascadeType.REFRESH, CascadeType.DETACH, CascadeType.ALL.
Пример:
fetch: Определяет стратегию загрузки связанной сущности.
Возможные значения: FetchType.EAGER (загрузка сразу) или FetchType.LAZY (ленивая загрузка).
Пример:
optional:Указывает, может ли связанная сущность быть null.
По умолчанию: true.
Пример:
mappedBy: Указывает поле в целевой сущности, которое управляет отношением (используется на стороне, которая не владеет отношением).
Пример:
orphanRemoval: Указывает, должна ли связанная сущность быть удалена при удалении её из коллекции или установке в null.
По умолчанию: false.
Пример:
Если параметры не указаны, используются значения по умолчанию:
fetch = FetchType.EAGER
optional = true
orphanRemoval = false
Жизненный цикл
Применение: Аннотация @OneToOne применяется на этапе маппинга сущностей JPA. Она указывает, что между двумя сущностями существует отношение "один к одному".
Инициализация: При загрузке сущности из базы данных JPA загружает связанную сущность в зависимости от стратегии загрузки (EAGER или LAZY).
Уничтожение: При удалении сущности JPA учитывает каскадные операции и параметр orphanRemoval.
Ленивая загрузка (Lazy Loading):
Spring Boot поддерживает ленивую загрузку через прокси-объекты Hibernate. Для этого необходимо включить поддержку прокси в настройках:
Интеграция с репозиториями:
Spring Data JPA предоставляет репозитории для работы с сущностями. Отношения @OneToOne могут быть использованы в репозиториях как обычные поля.
Пример репозитория:
Варианты настройки
Одностороннее отношение:
Отношение управляется одной из сущностей. Пример:
Двустороннее отношение:
Отношение управляется обеими сущностями. Пример:
Каскадные операции:
Используются для автоматического применения операций к связанной сущности. Пример:
Ленивая загрузка:
Используется для оптимизации производительности. Пример:
#Java #Training #Hard #Spring #SpringDataJPA #OneToOne
Аннотация @OneToOne используется в Java Persistence API (JPA) для обозначения отношения "один к одному" между двумя сущностями. Она указывает, что одна сущность связана с другой сущностью через уникальное отношение. Аннотация находится в пакете javax.persistence (или jakarta.persistence в Jakarta EE).
Аннотация @OneToOne принимает несколько параметров для настройки отношения:
targetEntity: Указывает класс целевой сущности (если он не может быть выведен из типа поля).
Пример:
@OneToOne(targetEntity = Address.class)
private Address address;
cascade: Определяет каскадные операции, которые должны быть применены к связанной сущности.
Возможные значения: CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE, CascadeType.REFRESH, CascadeType.DETACH, CascadeType.ALL.
Пример:
@OneToOne(cascade = CascadeType.ALL)
private Address address;
fetch: Определяет стратегию загрузки связанной сущности.
Возможные значения: FetchType.EAGER (загрузка сразу) или FetchType.LAZY (ленивая загрузка).
Пример:
@OneToOne(fetch = FetchType.LAZY)
private Address address;
optional:Указывает, может ли связанная сущность быть null.
По умолчанию: true.
Пример:
@OneToOne(optional = false)
private Address address;
mappedBy: Указывает поле в целевой сущности, которое управляет отношением (используется на стороне, которая не владеет отношением).
Пример:
@OneToOne(mappedBy = "user")
private Profile profile;
orphanRemoval: Указывает, должна ли связанная сущность быть удалена при удалении её из коллекции или установке в null.
По умолчанию: false.
Пример:
@OneToOne(orphanRemoval = true)
private Address address;
Если параметры не указаны, используются значения по умолчанию:
fetch = FetchType.EAGER
optional = true
orphanRemoval = false
Жизненный цикл
Применение: Аннотация @OneToOne применяется на этапе маппинга сущностей JPA. Она указывает, что между двумя сущностями существует отношение "один к одному".
Инициализация: При загрузке сущности из базы данных JPA загружает связанную сущность в зависимости от стратегии загрузки (EAGER или LAZY).
Уничтожение: При удалении сущности JPA учитывает каскадные операции и параметр orphanRemoval.
Ленивая загрузка (Lazy Loading):
Spring Boot поддерживает ленивую загрузку через прокси-объекты Hibernate. Для этого необходимо включить поддержку прокси в настройках:
spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true
Интеграция с репозиториями:
Spring Data JPA предоставляет репозитории для работы с сущностями. Отношения @OneToOne могут быть использованы в репозиториях как обычные поля.
Пример репозитория:
public interface UserRepository extends JpaRepository<User, Long> {
}
Варианты настройки
Одностороннее отношение:
Отношение управляется одной из сущностей. Пример:
@Entity
public class User {
@OneToOne
private Address address;
}
Двустороннее отношение:
Отношение управляется обеими сущностями. Пример:
@Entity
public class User {
@OneToOne(mappedBy = "user")
private Profile profile;
}
@Entity
public class Profile {
@OneToOne
@JoinColumn(name = "user_id")
private User user;
}
Каскадные операции:
Используются для автоматического применения операций к связанной сущности. Пример:
@OneToOne(cascade = CascadeType.ALL)
private Address address;
Ленивая загрузка:
Используется для оптимизации производительности. Пример:
@OneToOne(fetch = FetchType.LAZY)
private Address address;
#Java #Training #Hard #Spring #SpringDataJPA #OneToOne
Аннотации @OneToMany и @ManyToOne
Аннотации @OneToMany и @ManyToOne используются в Java Persistence API (JPA) для обозначения отношений "один ко многим" и "многие к одному" между сущностями. Они находятся в пакете javax.persistence (или jakarta.persistence в Jakarta EE).
@OneToMany: Указывает, что одна сущность связана с коллекцией других сущностей.
@ManyToOne: Указывает, что множество сущностей связано с одной сущностью.
Эти аннотации часто используются вместе для описания двусторонних отношений.
Параметры и настройки
@OneToMany
targetEntity:
Указывает класс целевой сущности (если он не может быть выведен из типа поля).
Пример:
cascade: (#CASCADE)
Определяет каскадные операции, которые должны быть применены к связанным сущностям.
Возможные значения: CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE, CascadeType.REFRESH, CascadeType.DETACH, CascadeType.ALL.
CascadeType.PERSIST:
Каскадное сохранение. Если сущность сохраняется (например, через EntityManager.persist()), то связанные сущности также будут сохранены.
CascadeType.MERGE:
Каскадное обновление. Если сущность обновляется (например, через EntityManager.merge()), то связанные сущности также будут обновлены.
CascadeType.REMOVE:
Каскадное удаление. Если сущность удаляется (например, через EntityManager.remove()), то связанные сущности также будут удалены.
CascadeType.REFRESH:
Каскадное обновление состояния. Если сущность обновляется из базы данных (например, через EntityManager.refresh()), то связанные сущности также будут обновлены.
CascadeType.DETACH:
Каскадное отсоединение. Если сущность отсоединяется от контекста persistence (например, через EntityManager.detach()), то связанные сущности также будут отсоединены.
CascadeType.ALL:
Каскадное применение всех операций. Включает в себя PERSIST, MERGE, REMOVE, REFRESH, и DETACH. Все операции, применяемые к сущности, будут каскадно применены к связанным сущностям.
Пример:
fetch:
Определяет стратегию загрузки связанных сущностей.
Возможные значения: FetchType.EAGER (загрузка сразу) или FetchType.LAZY (ленивая загрузка).
По умолчанию: FetchType.LAZY.
Пример:
mappedBy:
Указывает поле в целевой сущности, которое управляет отношением (используется на стороне, которая не владеет отношением).
Пример:
orphanRemoval:
Указывает, должны ли связанные сущности быть удалены при удалении их из коллекции или установке в null.
По умолчанию: false.
Пример:
@ManyToOne
Также как и для @OneToMany
targetEntity
cascade
fetch
Но отличается наличием:
optional:
Указывает, может ли связанная сущность быть null.
По умолчанию: true.
Пример:
Значения по умолчанию
Для @OneToMany:
fetch = FetchType.LAZY
orphanRemoval = false
Для @ManyToOne:
fetch = FetchType.EAGER
optional = true
Жизненный цикл
Применение: Аннотации применяются на этапе маппинга сущностей JPA. Они указывают на отношения между сущностями.
Инициализация: При загрузке сущности из базы данных JPA загружает связанные сущности в зависимости от стратегии загрузки (EAGER или LAZY).
Уничтожение: При удалении сущности JPA учитывает каскадные операции и параметр orphanRemoval.
Варианты настройки
Одностороннее отношение:
Отношение управляется одной из сущностей. Пример:
Двустороннее отношение:
Отношение управляется обеими сущностями. Пример:
#Java #Training #Hard #Spring #SpringDataJPA #OneToMany #ManyToOne
Аннотации @OneToMany и @ManyToOne используются в Java Persistence API (JPA) для обозначения отношений "один ко многим" и "многие к одному" между сущностями. Они находятся в пакете javax.persistence (или jakarta.persistence в Jakarta EE).
@OneToMany: Указывает, что одна сущность связана с коллекцией других сущностей.
@ManyToOne: Указывает, что множество сущностей связано с одной сущностью.
Эти аннотации часто используются вместе для описания двусторонних отношений.
Параметры и настройки
@OneToMany
targetEntity:
Указывает класс целевой сущности (если он не может быть выведен из типа поля).
Пример:
@OneToMany(targetEntity = Order.class)
private List<Order> orders;
cascade: (#CASCADE)
Определяет каскадные операции, которые должны быть применены к связанным сущностям.
Возможные значения: CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE, CascadeType.REFRESH, CascadeType.DETACH, CascadeType.ALL.
CascadeType.PERSIST:
Каскадное сохранение. Если сущность сохраняется (например, через EntityManager.persist()), то связанные сущности также будут сохранены.
CascadeType.MERGE:
Каскадное обновление. Если сущность обновляется (например, через EntityManager.merge()), то связанные сущности также будут обновлены.
CascadeType.REMOVE:
Каскадное удаление. Если сущность удаляется (например, через EntityManager.remove()), то связанные сущности также будут удалены.
CascadeType.REFRESH:
Каскадное обновление состояния. Если сущность обновляется из базы данных (например, через EntityManager.refresh()), то связанные сущности также будут обновлены.
CascadeType.DETACH:
Каскадное отсоединение. Если сущность отсоединяется от контекста persistence (например, через EntityManager.detach()), то связанные сущности также будут отсоединены.
CascadeType.ALL:
Каскадное применение всех операций. Включает в себя PERSIST, MERGE, REMOVE, REFRESH, и DETACH. Все операции, применяемые к сущности, будут каскадно применены к связанным сущностям.
Пример:
@OneToMany(cascade = CascadeType.ALL)
private List<Order> orders;
fetch:
Определяет стратегию загрузки связанных сущностей.
Возможные значения: FetchType.EAGER (загрузка сразу) или FetchType.LAZY (ленивая загрузка).
По умолчанию: FetchType.LAZY.
Пример:
@OneToMany(fetch = FetchType.EAGER)
private List<Order> orders;
mappedBy:
Указывает поле в целевой сущности, которое управляет отношением (используется на стороне, которая не владеет отношением).
Пример:
@OneToMany(mappedBy = "customer")
private List<Order> orders;
orphanRemoval:
Указывает, должны ли связанные сущности быть удалены при удалении их из коллекции или установке в null.
По умолчанию: false.
Пример:
@OneToMany(orphanRemoval = true)
private List<Order> orders;
@ManyToOne
Также как и для @OneToMany
targetEntity
cascade
fetch
Но отличается наличием:
optional:
Указывает, может ли связанная сущность быть null.
По умолчанию: true.
Пример:
@ManyToOne(optional = false)
private Customer customer;
Значения по умолчанию
Для @OneToMany:
fetch = FetchType.LAZY
orphanRemoval = false
Для @ManyToOne:
fetch = FetchType.EAGER
optional = true
Жизненный цикл
Применение: Аннотации применяются на этапе маппинга сущностей JPA. Они указывают на отношения между сущностями.
Инициализация: При загрузке сущности из базы данных JPA загружает связанные сущности в зависимости от стратегии загрузки (EAGER или LAZY).
Уничтожение: При удалении сущности JPA учитывает каскадные операции и параметр orphanRemoval.
Варианты настройки
Одностороннее отношение:
Отношение управляется одной из сущностей. Пример:
@Entity
public class Customer {
@OneToMany
private List<Order> orders;
}
Двустороннее отношение:
Отношение управляется обеими сущностями. Пример:
@Entity
public class Customer {
@OneToMany(mappedBy = "customer")
private List<Order> orders;
}
@Entity
public class Order {
@ManyToOne
@JoinColumn(name = "customer_id")
private Customer customer;
}
#Java #Training #Hard #Spring #SpringDataJPA #OneToMany #ManyToOne
Что выведет код?
#Tasks
class A1303 {
void print() {
System.out.println("A");
}
}
class B1303 extends A1303 {
void print() {
System.out.println("B");
}
}
class C1303 extends B1303 {
void print() {
super.print();
System.out.println("C");
}
}
public class Task130325 {
public static void main(String[] args) {
A1303 a = new C1303();
a.print();
}
}
#Tasks
Please open Telegram to view this post
VIEW IN TELEGRAM
Вопросы с собеседования 👩💻
Что произойдёт, если попытаться обратиться к элементу массива за его пределами?
Что произойдёт, если попытаться обратиться к элементу массива за его пределами?
Anonymous Quiz
7%
Вернётся null
87%
Выбросится ArrayIndexOutOfBoundsException
3%
Программа завершится без ошибок
3%
Вернётся случайное значение
Аннотация @ManyToMany
Аннотация @ManyToMany используется в Java Persistence API (JPA) для обозначения отношения "многие ко многим" между двумя сущностями. Она указывает, что множество сущностей одной стороны связано с множеством сущностей другой стороны. Аннотация находится в пакете javax.persistence (или jakarta.persistence в Jakarta EE).
Аннотация @ManyToMany принимает несколько параметров для настройки отношения:
targetEntity:
Указывает класс целевой сущности (если он не может быть выведен из типа поля).
Пример:
cascade: (#CASCADE)
Определяет каскадные операции, которые должны быть применены к связанным сущностям.
Возможные значения: CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE, CascadeType.REFRESH, CascadeType.DETACH, CascadeType.ALL.
Пример:
fetch:
Определяет стратегию загрузки связанных сущностей.
Возможные значения: FetchType.EAGER (загрузка сразу) или FetchType.LAZY (ленивая загрузка).
По умолчанию: FetchType.LAZY.
Пример:
mappedBy:
Указывает поле в целевой сущности, которое управляет отношением (используется на стороне, которая не владеет отношением).
Пример:
orphanRemoval:
Указывает, должны ли связанные сущности быть удалены при удалении их из коллекции или установке в null.
По умолчанию: false.
Пример:
Значения по умолчанию
Если параметры не указаны, используются значения по умолчанию:
fetch = FetchType.LAZY
orphanRemoval = false
Жизненный цикл
Применение: Аннотация @ManyToMany применяется на этапе маппинга сущностей JPA. Она указывает, что между двумя сущностями существует отношение "многие ко многим".
Инициализация: При загрузке сущности из базы данных JPA загружает связанные сущности в зависимости от стратегии загрузки (EAGER или LAZY).
Уничтожение: При удалении сущности JPA учитывает каскадные операции и параметр orphanRemoval.
Варианты настройки
Одностороннее отношение:
Отношение управляется одной из сущностей. Пример:
Двустороннее отношение:
Отношение управляется обеими сущностями. Пример:
Каскадные операции:
Используются для автоматического применения операций к связанным сущностям. Пример:
Ленивая загрузка:
Используется для оптимизации производительности. Пример:
Кастомизация промежуточной таблицы:
С помощью аннотации @JoinTable можно настроить промежуточную таблицу для отношения "многие ко многим". Пример:
#Java #Training #Hard #Spring #SpringDataJPA #ManyToMany
Аннотация @ManyToMany используется в Java Persistence API (JPA) для обозначения отношения "многие ко многим" между двумя сущностями. Она указывает, что множество сущностей одной стороны связано с множеством сущностей другой стороны. Аннотация находится в пакете javax.persistence (или jakarta.persistence в Jakarta EE).
Аннотация @ManyToMany принимает несколько параметров для настройки отношения:
targetEntity:
Указывает класс целевой сущности (если он не может быть выведен из типа поля).
Пример:
@ManyToMany(targetEntity = Role.class)
private List<Role> roles;
cascade: (#CASCADE)
Определяет каскадные операции, которые должны быть применены к связанным сущностям.
Возможные значения: CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE, CascadeType.REFRESH, CascadeType.DETACH, CascadeType.ALL.
Пример:
@ManyToMany(cascade = CascadeType.ALL)
private List<Role> roles;
fetch:
Определяет стратегию загрузки связанных сущностей.
Возможные значения: FetchType.EAGER (загрузка сразу) или FetchType.LAZY (ленивая загрузка).
По умолчанию: FetchType.LAZY.
Пример:
@ManyToMany(fetch = FetchType.EAGER)
private List<Role> roles;
mappedBy:
Указывает поле в целевой сущности, которое управляет отношением (используется на стороне, которая не владеет отношением).
Пример:
@ManyToMany(mappedBy = "users")
private List<Role> roles;
orphanRemoval:
Указывает, должны ли связанные сущности быть удалены при удалении их из коллекции или установке в null.
По умолчанию: false.
Пример:
@ManyToMany(orphanRemoval = true)
private List<Role> roles;
Значения по умолчанию
Если параметры не указаны, используются значения по умолчанию:
fetch = FetchType.LAZY
orphanRemoval = false
Жизненный цикл
Применение: Аннотация @ManyToMany применяется на этапе маппинга сущностей JPA. Она указывает, что между двумя сущностями существует отношение "многие ко многим".
Инициализация: При загрузке сущности из базы данных JPA загружает связанные сущности в зависимости от стратегии загрузки (EAGER или LAZY).
Уничтожение: При удалении сущности JPA учитывает каскадные операции и параметр orphanRemoval.
Варианты настройки
Одностороннее отношение:
Отношение управляется одной из сущностей. Пример:
@Entity
public class User {
@ManyToMany
private List<Role> roles;
}
Двустороннее отношение:
Отношение управляется обеими сущностями. Пример:
@Entity
public class User {
@ManyToMany(mappedBy = "users")
private List<Role> roles;
}
@Entity
public class Role {
@ManyToMany
@JoinTable(
name = "user_role",
joinColumns = @JoinColumn(name = "role_id"),
inverseJoinColumns = @JoinColumn(name = "user_id")
)
private List<User> users;
}
Каскадные операции:
Используются для автоматического применения операций к связанным сущностям. Пример:
@ManyToMany(cascade = CascadeType.ALL)
private List<Role> roles;
Ленивая загрузка:
Используется для оптимизации производительности. Пример:
@ManyToMany(fetch = FetchType.LAZY)
private List<Role> roles;
Кастомизация промежуточной таблицы:
С помощью аннотации @JoinTable можно настроить промежуточную таблицу для отношения "многие ко многим". Пример:
@ManyToMany
@JoinTable(
name = "user_role",
joinColumns = @JoinColumn(name = "user_id"),
inverseJoinColumns = @JoinColumn(name = "role_id")
)
private List<Role> roles;
#Java #Training #Hard #Spring #SpringDataJPA #ManyToMany