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

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

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
Всем привет! 🖐

Сегодня встречаемся в 16:00 по МСК, в Яндекс.Телемост, как всегда!

Сегодня рассмотрим аннотацию @Transactional и все что с ней связано.

Рассмотрим:
🔜 что такие транзакции и для чего они нужны.
🔜 настройки, возможности, атрибуты.
🔜 нюансы использования.

Жду всех, как всегда!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
https://telemost.yandex.ru/j/65164825931386

Встреча создана! Залетаем!
✈️
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Теперь мы знаем аннотацию @Transactional.

Встреча от 23.03.2025


Запись встречи -
YOUTUBE
RUTUBE

На сегодняшней встрече мы разобрали аннотацию
@Transactional:

🔜 Зачем нам вообще нужна @Transactional
🔜 Варианты настроек, свойств.
🔜 Написали код, потестили и посмотрели как это работает.

Ссылка на Git - https://github.com/Oleborn/TransactionReserch.git

Смотрите, комментируйте, задавайте вопросы! Обязательно подписывайтесь на ютуб и рутюб каналы!!!

Всем хорошего настроения и терпения при просмотре! 🍸
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
📌 Факт дня:

А вы знали, что первый "компьютерный аукцион" был создан в 1995 году?

"eBay", основанный Пьером Омидьяром, начинался как AuctionWeb, где первым лотом стал его личный, сломанный лазерный указатель за $14,83.


history

#facts
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
📌 Цитата дня: Джон Кармак

"История — это не то, что случилось, а то, что ты можешь сделать с данными."


Джон Кармак, создатель Doom, сказал это в 2013 году на конференции QuakeCon, обсуждая важность интерпретации данных.

Почитать короткую биографию
И его история

#Citation #Biography
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Теперь переходим к рассмотрению аннотаций Spring Data JPA.

Аннотация @Query

Аннотация @Query используется в Spring Data JPA для определения пользовательских JPQL (Java Persistence Query Language) или нативных SQL-запросов непосредственно в репозиторных интерфейсах. Она позволяет гибко настраивать запросы к базе данных, не полагаясь на автоматически генерируемые методы Spring Data. Аннотация находится в пакете org.springframework.data.jpa.repository.

Параметры аннотации

value (обязательный):
Тип: String.
Описание: Содержит JPQL или SQL-запрос. Если запрос JPQL, он должен соответствовать синтаксису JPA. Если это нативный SQL-запрос, необходимо указать параметр nativeQuery = true.


Пример:
@Query("SELECT u FROM User u WHERE u.email = ?1")
User findByEmail(String email);


nativeQuery (необязательный):
Тип: boolean.
Значение по умолчанию: false.

Описание: Указывает, является ли запрос нативным SQL-запросом. Если true, запрос выполняется как сырой SQL-запрос.

Пример:
@Query(value = "SELECT * FROM users WHERE email = ?1", nativeQuery = true)
User findByEmail(String email);


countQuery (необязательный):
Тип: String.
Описание: Используется для указания запроса, который будет выполнен для подсчета общего количества записей при использовании пагинации. Актуально только для нативных запросов.


Пример:
@Query(value = "SELECT * FROM users WHERE active = true", 
countQuery = "SELECT COUNT(*) FROM users WHERE active = true",
nativeQuery = true)
Page<User> findActiveUsers(Pageable pageable);


name (необязательный):
Тип: String.
Описание: Указывает имя именованного запроса, который должен быть определен в метаданных JPA (например, в orm.xml или через аннотацию
@NamedQuery).

Пример:
@Query(name = "User.findByEmail")
User findByEmail(String email);


countName (необязательный):
Тип: String.
Описание: Указывает имя именованного запроса для подсчета количества записей. Используется вместе с name.


Пример:
@Query(name = "User.findActiveUsers", countName = "User.countActiveUsers")
Page<User> findActiveUsers(Pageable pageable);


Жизненный цикл аннотации

Инициализация:
Аннотация @Query обрабатывается во время инициализации Spring-контекста. Spring Data JPA анализирует репозиторные интерфейсы и создает прокси-объекты для методов, помеченных @Query.

Выполнение:
Когда метод репозитория вызывается, Spring Data JPA выполняет запрос, указанный в @Query. Если запрос JPQL, он преобразуется в SQL с помощью JPA-провайдера (например, Hibernate). Если запрос нативный, он выполняется напрямую.

Уничтожение:
Аннотация не имеет явного жизненного цикла уничтожения, так как она используется только для конфигурации запросов.

Механизмы Spring, связанные с @Query

Spring Data JPA:
Spring Data JPA предоставляет реализацию репозиториев, которая автоматически обрабатывает аннотацию @Query. Она интегрируется с JPA-провайдером (например, Hibernate) для выполнения запросов.

JPA-провайдер:

JPA-провайдер (например, Hibernate) отвечает за преобразование JPQL-запросов в SQL и их выполнение. Для нативных запросов JPA-провайдер передает SQL напрямую в базу данных.

Транзакционность:
По умолчанию методы репозитория выполняются в транзакции. Это можно настроить с помощью аннотации @Transactional.

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

Использование именованных запросов:
Вместо указания запроса непосредственно в @Query, можно использовать именованные запросы, определенные в orm.xml или через @NamedQuery.

Пагинация и сортировка:
Методы с @Query могут поддерживать пагинацию и сортировку, если возвращают Page, Slice или List с параметром Pageable.

Проекции:
Можно использовать проекции DTO для возврата только необходимых полей:

@Query("SELECT new com.example.UserDTO(u.id, u.name) FROM User u WHERE u.email = ?1")
UserDTO findUserDtoByEmail(String email);


Динамические запросы:
Для сложных запросов можно использовать JpaSpecificationExecutor или Querydsl.

#Java #Training #Hard #Spring #SpringDataJPA #Query
👌2
Что выведет код?

public class Task240325 {
static int factorial(int n) {
if (n == 0 || n == 1) {
return 1;
}
return n * factorial(n - 1);
}

public static void main(String[] args) {
System.out.println(factorial(4));
}
}


#Tasks
👍1
Варианты ответа:
Anonymous Quiz
3%
1
6%
10
65%
24
26%
Exception какой-нибудь
👍2
И безнадежность во взгляде 🤣

https://t.me/Java_for_beginner_dev

#Mems
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3
Аннотация @Modifying

Аннотация @Modifying используется в Spring Data JPA для указания того, что метод репозитория выполняет модифицирующие операции (например, UPDATE, DELETE, INSERT) в базе данных. Она применяется в сочетании с аннотацией @Query и находится в пакете org.springframework.data.jpa.repository.

Параметры аннотации

flushAutomatically (необязательный):
Тип: boolean.
Значение по умолчанию: false.
Описание: Если установлено в true, то перед выполнением запроса будет выполнен сброс (flush) контекста (Persistence Context). Это гарантирует, что все ожидающие изменения будут синхронизированы с базой данных перед выполнением модифицирующего запроса.


Пример:
@Modifying(flushAutomatically = true)
@Query("UPDATE User u SET u.active = false WHERE u.lastLogin < :date")
void deactivateUsers(@Param("date") LocalDate date);


clearAutomatically (необязательный):
Тип: boolean.
Значение по умолчанию: false.
Описание: Если установлено в true, то после выполнения запроса будет очищен (clear) контекст (Persistence Context). Это полезно, чтобы избежать использования устаревших данных из кэша первого уровня.


Пример:
@Modifying(clearAutomatically = true)
@Query("DELETE FROM User u WHERE u.active = false")
void deleteInactiveUsers();


Жизненный цикл аннотации

Инициализация:
Аннотация @Modifying обрабатывается во время инициализации Spring-контекста. Spring Data JPA анализирует методы репозитория, помеченные @Modifying, и настраивает их для выполнения модифицирующих операций.

Выполнение:
Когда метод репозитория вызывается, Spring Data JPA выполняет запрос, указанный в @Query, с учетом настроек @Modifying. Если flushAutomatically = true, выполняется сброс контекста перед запросом. Если clearAutomatically = true, контекст очищается после запроса.

Уничтожение:

Аннотация не имеет явного жизненного цикла уничтожения, так как она используется только для конфигурации выполнения запросов.

Механизмы Spring, связанные с @Modifying

Spring Data JPA:
Spring Data JPA предоставляет реализацию репозиториев, которая автоматически обрабатывает аннотацию @Modifying. Она интегрируется с JPA-провайдером (например, Hibernate) для выполнения модифицирующих запросов.

JPA-провайдер:
JPA-провайдер (например, Hibernate) отвечает за выполнение модифицирующих запросов. Для операций UPDATE и DELETE JPA-провайдер использует механизм EntityManager.

Транзакционность:
Методы, помеченные @Modifying, должны выполняться в транзакции. Если транзакция не настроена, Spring Data JPA выбросит исключение. Транзакционность можно настроить с помощью аннотации @Transactional.
Spring Boot автоматически настраивает менеджер транзакций (PlatformTransactionManager). Для методов с @Modifying рекомендуется явно указать транзакционность:

@Transactional
@Modifying
@Query("UPDATE User u SET u.active = false WHERE u.lastLogin < :date")
void deactivateUsers(@Param("date") LocalDate date);


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

Использование flushAutomatically:
Установка flushAutomatically = true полезна, если в контексте есть изменения, которые должны быть синхронизированы с базой данных перед выполнением модифицирующего запроса.

Использование clearAutomatically:
Установка clearAutomatically = true полезна, если после выполнения модифицирующего запроса необходимо избежать использования устаревших данных из кэша первого уровня.

Комбинирование с @Query:
Аннотация @Modifying всегда используется вместе с @Query. Например:

Использование @Transactional:
Методы с @Modifying должны быть помечены аннотацией @Transactional, чтобы гарантировать атомарность операций.

#Java #Training #Hard #Spring #SpringDataJPA #Modifying
👍2
📌 Факт дня

А вы знали, что первый портативный "цифровой проигрыватель" был выпущен в 1979 году?

1 июля 1979 года в свет вышел Sony Walkman TPS-L2, став первым портативным устройством для прослушивания кассет, вдохновив на развитие MP3-плееры.


proof

#facts
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
📌 Цитата дня: Бьярне Страуструп

"Я создал C++, чтобы сделать программирование более удобным."


Бьярне Страуструп, создатель C++, сказал это в 1985 году в интервью журналу IEEE, объясняя цель языка.

Почитать короткую биографию
И немного хабра

#Citation #Biography
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Аннотация @Param

Аннотация @Param используется в Spring Data JPA для привязки параметров метода к именованным параметрам в JPQL или нативных SQL-запросах. Она позволяет явно указать, какие аргументы метода должны быть переданы в запрос. Аннотация находится в пакете org.springframework.data.repository.query.

Параметры аннотации

value (обязательный):
Тип: String.
Описание: Указывает имя параметра, которое будет использоваться в запросе. Это имя должно совпадать с именем параметра в запросе, указанном в
@Query.

Пример:
@Query("SELECT u FROM User u WHERE u.email = :email")
User findByEmail(@Param("email") String email);


Жизненный цикл аннотации

Инициализация:
Аннотация @Param обрабатывается во время инициализации Spring-контекста. Spring Data JPA анализирует методы репозитория и связывает параметры метода с именованными параметрами в запросе.

Выполнение:
Когда метод репозитория вызывается, Spring Data JPA подставляет значения параметров метода в запрос, используя имена, указанные в @Param.

Уничтожение:
Аннотация не имеет явного жизненного цикла уничтожения, так как она используется только для привязки параметров.

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

Использование в JPQL:
Аннотация @Param используется для привязки параметров в JPQL-запросах:

@Query("SELECT u FROM User u WHERE u.email = :email AND u.age > :age")
User findByEmailAndAge(@Param("email") String email, @Param("age") int age);


Использование в нативных SQL-запросах:
Аннотация @Param также может использоваться в нативных SQL-запросах:

@Query(value = "SELECT * FROM users WHERE email = :email", nativeQuery = true)
User findByEmail(@Param("email") String email);


Использование с @Modifying:
Аннотация @Param может использоваться в методах, помеченных @Modifying, для выполнения модифицирующих операций:

@Modifying
@Query("UPDATE User u SET u.active = :active WHERE u.email = :email")
void updateUserStatus(@Param("email") String email, @Param("active") boolean active);


#Java #Training #Hard #Spring #SpringDataJPA #Param
👍3
Что выведет код?

public class Task250325 {
public static void main(String[] args) {
String s1 = "Java";
String s2 = new String("Java");
String s3 = s1.intern();

System.out.println(s1 == s2);
System.out.println(s1 == s3);
}
}


#Tasks
👍1
Варианты ответа:
Anonymous Quiz
16%
true true
56%
false true
12%
true false
16%
false false
👍5
Личная коллекция каждого опытного разработчика 🫢 🤪

https://t.me/Java_for_beginner_dev

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