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

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

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
https://telemost.yandex.ru/j/11766846568901 - встреча создана!

Залетаем!
Встреча_в_Телемосте_16_03_25_20_32_18_—_запись.webm
665.9 MB
Сегодняшняя встреча!

@Shikin_Anatoliy написал неплохой обучающий сервис используя основные аннотации Spring.

Несмотря на то что мы не смогли все это протестировать, видео полезно для новичков в спринг, которые хотят написать свой простой веб-сервис!

@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
Аннотация @ElementCollection

Аннотация @ElementCollection используется в Java Persistence API (JPA) для маппинга коллекций базовых типов (например, String, Integer) или встраиваемых объектов (аннотированных @Embeddable) в отдельную таблицу базы данных. Она находится в пакете javax.persistence (или jakarta.persistence в Jakarta EE). Эта аннотация применяется к полям или свойствам сущности, которые представляют собой коллекции, и позволяет сохранять их в отдельной таблице, связанной с основной сущностью.

Аннотация @ElementCollection принимает несколько параметров, которые позволяют настроить маппинг коллекции:

fetch (тип: FetchType):
Указывает стратегию загрузки данных: FetchType.EAGER (жадная загрузка) или FetchType.LAZY (ленивая загрузка).
По умолчанию: FetchType.LAZY.

targetClass (тип: Class<?>):
Указывает класс элементов коллекции, если он не может быть выведен из типа коллекции.
По умолчанию: тип элементов коллекции выводится автоматически.


Дополнительные параметры:
Аннотация @ElementCollection часто используется в сочетании с @CollectionTable для настройки таблицы, в которой хранятся элементы коллекции.

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

Применение: Аннотация @ElementCollection применяется на этапе маппинга сущности JPA. Она используется при создании таблиц в базе данных (если используется автоматическая генерация схемы) и при выполнении операций чтения/записи данных.
Инициализация: При загрузке сущности из базы данных JPA использует указанные параметры для маппинга коллекции.
Уничтожение: При сохранении сущности в базу данных JPA использует указанные параметры для генерации SQL-запросов.


Кастомизация маппинга:
Если требуется кастомизировать маппинг коллекций (например, использовать собственные индексы или ограничения), можно использовать аннотацию @CollectionTable с параметрами uniqueConstraints, indexes и foreignKey.

Пример использования @CollectionTable с кастомизацией:
@ElementCollection
@CollectionTable(
name = "phone_numbers",
joinColumns = @JoinColumn(name = "user_id"),
uniqueConstraints = @UniqueConstraint(columnNames = {"user_id", "phone_number"}),
indexes = @Index(columnList = "phone_number")
)
@Column(name = "phone_number")
private Set<String> phoneNumbers;


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

Использование @CollectionTable:
Позволяет явно указать имя таблицы и столбцы для хранения элементов коллекции.

Использование @Column:
Позволяет указать имя столбца для хранения элементов коллекции.

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

Использование fetch:
Позволяет управлять стратегией загрузки данных (жадная или ленивая загрузка).

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

import java.util.HashMap;

public class Task170325 {
public static void main(String[] args) {
HashMap<String, Integer> map = new HashMap<>();
map.put(new String("a"), 1);
map.put(new String("a"), 2);

System.out.println(map.size());
}
}


#Tasks
Варианты ответа:
Anonymous Quiz
0%
0
47%
1
40%
2
13%
Exception
Я уважаю такой подход к работе 😂 🫡

https://t.me/Java_for_beginner_dev

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

Какой цикл гарантированно выполнится хотя бы один раз?
Anonymous Quiz
14%
for
7%
while
75%
do-while
5%
foreach
Аннотация @OrderColumn

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

Аннотация
@OrderColumn принимает несколько параметров, которые позволяют настроить маппинг порядка элементов:

name (тип: String):

Указывает имя столбца в базе данных, который будет хранить порядковый индекс элементов коллекции.
По умолчанию: если параметр не указан, JPA использует имя поля или свойства сущности, дополненное суффиксом _ORDER (например, items_ORDER).


nullable (тип: boolean):
Указывает, может ли столбец, хранящий порядковый индекс, иметь значение NULL.
По умолчанию: true.


insertable (тип: boolean):
Указывает, должен ли столбец включаться в SQL-запросы INSERT.
По умолчанию: true.


updatable (тип: boolean):
Указывает, должен ли столбец включаться в SQL-запросы UPDATE.
По умолчанию: true.


columnDefinition (тип: String):
Позволяет указать SQL-определение столбца, которое будет использоваться при генерации схемы базы данных.
По умолчанию: не задано.


Пример использования:
@ElementCollection
@OrderColumn(name = "item_order")
private List<String> items;


Значения по умолчанию

Если аннотация @OrderColumn не указана, JPA не сохраняет порядок элементов коллекции в базе данных. Порядок элементов может быть потерян при загрузке данных из базы данных.

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

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


Кастомизация маппинга:
Если требуется кастомизировать маппинг коллекций (например, использовать собственные индексы или ограничения), можно использовать аннотацию @CollectionTable с параметрами uniqueConstraints, indexes и foreignKey.

Пример использования @OrderColumn с кастомизацией:
@ElementCollection
@CollectionTable(name = "items", joinColumns = @JoinColumn(name = "user_id"))
@OrderColumn(name = "item_order", columnDefinition = "INT NOT NULL")
private List<String> items;


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

Использование name:
Позволяет явно указать имя столбца для хранения порядкового индекса.

Использование nullable:
Позволяет контролировать, может ли столбец, хранящий порядковый индекс, быть NULL.

Использование columnDefinition:
Позволяет указать точное SQL-определение столбца, что полезно для сложных сценариев.

Использование @CollectionTable:
Позволяет настроить таблицу, в которой хранятся элементы коллекции, включая уникальные ограничения и индексы.

#Java #Training #Hard #Spring #SpringDataJPA #OrderColumn
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Аннотация @PrimaryKeyJoinColumn

Аннотация @PrimaryKeyJoinColumn используется в Java Persistence API (JPA) для указания связи между сущностями, где первичный ключ одной сущности используется как внешний ключ для другой сущности. Она находится в пакете javax.persistence (или jakarta.persistence в Jakarta EE). Эта аннотация применяется в наследовании сущностей (стратегия JOINED) или в отношениях @OneToOne, где первичный ключ одной сущности является одновременно и внешним ключом для другой.

Аннотация @PrimaryKeyJoinColumn принимает несколько параметров, которые позволяют настроить маппинг первичного ключа как внешнего ключа:

name (тип: String):
Указывает имя столбца в текущей сущности, который используется как внешний ключ.
По умолчанию: если параметр не указан, JPA использует имя первичного ключа связанной сущности.


referencedColumnName (тип: String):
Указывает имя столбца в целевой сущности, на который ссылается внешний ключ.
По умолчанию: если параметр не указан, JPA использует первичный ключ целевой сущности.


columnDefinition (тип: String):
Позволяет указать SQL-определение столбца, которое будет использоваться при генерации схемы базы данных.
По умолчанию: не задано.


foreignKey (тип: ForeignKey):
Позволяет указать определение внешнего ключа для генерации схемы базы данных.
По умолчанию: не задано.


Пример использования:
@Entity
@PrimaryKeyJoinColumn(name = "employee_id", referencedColumnName = "id")
public class Employee extends Person {
// Дополнительные поля и методы
}


Значения по умолчанию


Если аннотация @PrimaryKeyJoinColumn не указана, JPA использует имя первичного ключа текущей сущности в качестве имени столбца внешнего ключа и первичный ключ целевой сущности в качестве referencedColumnName.

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

Применение: Аннотация @PrimaryKeyJoinColumn применяется на этапе маппинга сущности JPA. Она используется при создании таблиц в базе данных (если используется автоматическая генерация схемы) и при выполнении операций чтения/записи данных.
Инициализация: При загрузке сущности из базы данных JPA использует указанные параметры для маппинга первичного ключа как внешнего ключа.
Уничтожение: При сохранении сущности в базу данных JPA использует указанные параметры для генерации SQL-запросов.


Кастомизация маппинга:

Если требуется кастомизировать маппинг внешних ключей (например, использовать собственные индексы или ограничения), можно использовать параметр foreignKey.

Пример использования foreignKey:
@Entity
@PrimaryKeyJoinColumn(
name = "employee_id",
referencedColumnName = "id",
foreignKey = @ForeignKey(name = "fk_employee_person")
)
public class Employee extends Person {
// Дополнительные поля и методы
}


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

Использование name и referencedColumnName:
Позволяет явно указать имена столбцов в базе данных, что полезно при работе с существующими схемами.

Использование columnDefinition:
Позволяет указать точное SQL-определение столбца, что полезно для сложных сценариев.

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

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

public class Task180325 {
public static void main(String[] args) {
int a = 5;
double b = 2;
Long c = (long) (a / b);
System.out.println(c);
}
}


#Tasks
Варианты ответа:
Anonymous Quiz
36%
2
25%
2.5
26%
2L
13%
Exception
Ну это тогда не сеньор 🤨 😁

https://t.me/Java_for_beginner_dev

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

Какой оператор используется для проверки типа объекта?
Anonymous Quiz
31%
typeof
4%
is
7%
equals
57%
instanceof
Аннотация @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
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Аннотации @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