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

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

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
Please open Telegram to view this post
VIEW IN TELEGRAM
Аннотация @Embeddable

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

Аннотация
@Embeddable не принимает параметров. Она просто указывает, что класс может быть встроен в другую сущность.

Пример использования:
@Embeddable
public class Address {
private String street;
private String city;
private String zipCode;
}


Класс, помеченный @Embeddable, по умолчанию не имеет отдельной таблицы в базе данных. Его поля включаются в таблицу сущности, которая его использует.
Если встроенный класс содержит поля, которые сами являются сущностями или коллекциями, их маппинг должен быть явно настроен с использованием других аннотаций JPA (например, @OneToMany, @ManyToOne).

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

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


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

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

Использование встроенных классов:
Подходит для случаев, когда требуется повторно использовать группу полей в нескольких сущностях.
Упрощает код, так как не требуется дублировать поля в разных сущностях.


Переопределение маппинга:
Позволяет гибко настраивать маппинг полей встроенного класса для каждой сущности, используя @AttributeOverride и @AttributeOverrides.

Использование встроенных классов с коллекциями:

Если встроенный класс содержит коллекции, их маппинг должен быть явно настроен с использованием аннотаций JPA (например, @ElementCollection).

Пример использования
@Embeddable
public class Address {
private String street;
private String city;
private String zipCode;
}

@Entity
public class User {
@Id
private Long id;

@Embedded
private Address homeAddress;

@Embedded
@AttributeOverrides({
@AttributeOverride(name = "street", column = @Column(name = "work_street")),
@AttributeOverride(name = "city", column = @Column(name = "work_city"))
})
private Address workAddress;
}


В этом примере:

Класс Address помечен как @Embeddable и может быть встроен в сущность User.
Поля homeAddress и workAddress включаются в таблицу User.
Для workAddress используется переопределение маппинга с помощью
@AttributeOverrides.

#Java #Training #Hard #Spring #SpringDataJPA #Embeddable
Что выведет код?

public class Task100325 {
public static void print(int a) {
System.out.println("int: " + a);
}

public static void print(double a) {
System.out.println("double: " + a);
}
public static void print(float a) {
System.out.println("float: " + a);
}

public static void main(String[] args) {
print(10);
print(10L);
}
}


#Tasks
Из наставления "Юный Девопс" 😂

https://t.me/Java_for_beginner_dev

#Mems
Please open Telegram to view this post
VIEW IN TELEGRAM
Вопросы с собеседования 👩‍💻

Что произойдёт, если не указать модификатор доступа для метода?
Anonymous Quiz
5%
Метод станет private
21%
Метод станет public
61%
Метод станет default
12%
Ошибка компиляции
Аннотация @Embedded

Аннотация @Embedded используется в Java Persistence API (JPA) для указания того, что поле сущности является встроенным объектом (embedded object). Встроенный объект — это класс, помеченный аннотацией @Embeddable, который не является самостоятельной сущностью, но его поля включаются в таблицу сущности, которая его использует. Аннотация @Embedded находится в пакете javax.persistence (или jakarta.persistence в Jakarta EE).

Аннотация @Embedded не принимает параметров. Она просто указывает, что поле сущности является встроенным объектом.

Пример использования:
@Entity
public class User {
@Id
private Long id;

@Embedded
private Address address;
}


Если аннотация @Embedded не указана, JPA автоматически распознает встроенные объекты, если их класс помечен аннотацией @Embeddable.
Поля встроенного объекта включаются в таблицу сущности, которая его использует.

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

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


Кастомизация маппинга:
Если требуется переопределить маппинг полей встроенного объекта, можно использовать аннотации @AttributeOverride и @AttributeOverrides в сущности, которая использует встроенный объект.

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

Использование встроенных объектов:

Подходит для случаев, когда требуется повторно использовать группу полей в нескольких сущностях.
Упрощает код, так как не требуется дублировать поля в разных сущностях.


Переопределение маппинга:
Позволяет гибко настраивать маппинг полей встроенного объекта для каждой сущности, используя @AttributeOverride и @AttributeOverrides.

Использование встроенных объектов с коллекциями:
Если встроенный объект содержит коллекции, их маппинг должен быть явно настроен с использованием аннотаций JPA (например, @ElementCollection).

#Java #Training #Hard #Spring #SpringDataJPA #Embedded
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Аннотация @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
Что выведет код?

public class Task110325 {
public static void main(String[] args) {
String str = "Hello, Java!";
String result = str.substring(str.indexOf("J"), str.length() - 2).toUpperCase();
System.out.println(result);
}
}


#Tasks
Варианты ответа:
Anonymous Quiz
18%
JAVA
55%
JAV
14%
HELLO, JAVA
14%
RuntimeException
Прикол в том что лечить их он не умеет 🤪 🤣

https://t.me/Java_for_beginner_dev

#Mems
Please open Telegram to view this post
VIEW IN TELEGRAM
Вопросы с собеседования 👩‍💻

Что такое 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.


Пример использования:
@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
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Аннотация @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
Что выведет код?

public class Task120325 {
public static void main(String[] args) {
int i = 0;
while (i++ < 5) {
if (i == 3) return;
System.out.print(i + " ");
}
}
}


#Tasks
Варианты ответа:
Anonymous Quiz
14%
1 2 4 5
5%
1 2 3 4 5
2%
2 3 4 5
80%
1 2
И вся она посвящена твоему коду 😱😅

https://t.me/Java_for_beginner_dev

#Mems
Please open Telegram to view this post
VIEW IN TELEGRAM