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

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

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
Аннотация @Transactional

Аннотация @Transactional используется в Spring для управления транзакциями на уровне методов или классов. Она позволяет декларативно определять границы транзакций, их поведение и настройки. Аннотация находится в пакете org.springframework.transaction.annotation.

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

value (необязательный):
Тип: String.
Значение по умолчанию: "".
Описание: Указывает имя менеджера транзакций (бина PlatformTransactionManager), который должен использоваться для управления транзакцией. Если не указано, используется менеджер транзакций по умолчанию.


Пример:
@Transactional("customTransactionManager")
public void performOperation() {
// Логика метода
}


propagation (необязательный):
Тип: Propagation.
Значение по умолчанию: Propagation.REQUIRED.
Описание: Определяет поведение распространения транзакции.


Возможные значения:
REQUIRED: Использует текущую транзакцию, если она существует, или создает новую.
REQUIRES_NEW: Всегда создает новую транзакцию, приостанавливая текущую, если она существует.
SUPPORTS: Использует текущую транзакцию, если она существует, но не создает новую.
NOT_SUPPORTED: Выполняет метод вне транзакции, приостанавливая текущую, если она существует.
MANDATORY: Требует наличия активной транзакции, иначе выбрасывает исключение.
NEVER: Запрещает выполнение метода в транзакции, иначе выбрасывает исключение.
NESTED: Создает вложенную транзакцию, если текущая транзакция существует.


Пример:
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void performOperation() {
// Логика метода
}


isolation (необязательный):
Тип: Isolation.
Значение по умолчанию: Isolation.DEFAULT.
Описание: Определяет уровень изоляции транзакции.


Возможные значения:
DEFAULT: Использует уровень изоляции по умолчанию для базы данных.
READ_UNCOMMITTED: Позволяет читать незафиксированные изменения других транзакций.
READ_COMMITTED: Гарантирует, что читаются только зафиксированные данные.
REPEATABLE_READ: Гарантирует, что данные, прочитанные в транзакции, не изменятся другими транзакциями.
SERIALIZABLE: Самый строгий уровень изоляции, предотвращает любые конфликты.


Пример:
@Transactional(isolation = Isolation.READ_COMMITTED)
public void performOperation() {
// Логика метода
}


timeout (необязательный):
Тип: int.
Значение по умолчанию: -1 (без тайм-аута).
Описание: Указывает максимальное время выполнения транзакции в секундах. Если время превышено, транзакция откатывается.


Пример:
@Transactional(timeout = 10)
public void performOperation() {
// Логика метода
}


readOnly (необязательный)
Тип: boolean.
Значение по умолчанию: false.
Описание: Указывает, является ли транзакция только для чтения. Если true, это может оптимизировать выполнение запросов.


Пример:
@Transactional(readOnly = true)
public void readData() {
// Логика метода
}


rollbackFor (необязательный):
Тип: Class<? extends Throwable>[].
Значение по умолчанию: {}.
Описание: Указывает типы исключений, при которых транзакция должна быть откачена. По умолчанию откат происходит только для непроверяемых исключений (RuntimeException и его подклассов).


Пример:
@Transactional(rollbackFor = {CustomException.class})
public void performOperation() throws CustomException {
// Логика метода
}


noRollbackFor (необязательный):
Тип: Class<? extends Throwable>[].
Значение по умолчанию: {}.
Описание: Указывает типы исключений, при которых транзакция не должна быть откачена.


Пример:
@Transactional(noRollbackFor = {CustomException.class})
public void performOperation() throws CustomException {
// Логика метода
}


#Java #Training #Hard #Spring #SpringDataJPA #Transactional
Жизненный цикл аннотации

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

Выполнение:
Когда метод вызывается, Spring проверяет настройки транзакции и начинает новую транзакцию (или использует существующую) в соответствии с параметрами propagation.
Если метод завершается успешно, транзакция фиксируется (commit). Если возникает исключение, транзакция откатывается (rollback), если это указано в параметрах.


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

После завершения метода транзакция завершается (фиксируется или откатывается), и ресурсы освобождаются.

Механизмы Spring и настройки Spring Boot

Spring AOP (Aspect-Oriented Programming):

Spring использует AOP для создания прокси-объектов, которые перехватывают вызовы методов, помеченных @Transactional, и управляют транзакциями.

PlatformTransactionManager:
Spring предоставляет интерфейс PlatformTransactionManager для управления транзакциями. Реализации включают DataSourceTransactionManager (для JDBC) и JpaTransactionManager (для JPA).

TransactionTemplate:
Для программного управления транзакциями можно использовать TransactionTemplate.

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

Использование нескольких менеджеров транзакций:
Если в приложении используется несколько источников данных, можно настроить несколько менеджеров транзакций и указывать их в параметре value аннотации @Transactional.

Программное управление транзакциями:
Для сложных сценариев можно использовать TransactionTemplate:
@Autowired
private TransactionTemplate transactionTemplate;

public void performOperation() {
transactionTemplate.execute(status -> {
// Логика метода
return null;
});
}


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

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

Аннотация @EnableJpaRepositories используется в Spring Data JPA для активации репозиториев JPA в приложении. Она сканирует пакеты и регистрирует интерфейсы, расширяющие JpaRepository, как бины Spring. Аннотация находится в пакете org.springframework.data.jpa.repository.config.

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

basePackages (необязательный):
Тип: String[].
Значение по умолчанию: {}.
Описание: Указывает пакеты, которые должны быть сканированы для поиска репозиториев JPA. Если не указано, используется пакет, в котором находится класс с аннотацией.


Пример:
@EnableJpaRepositories(basePackages = "com.example.repositories")


basePackageClasses (необязательный):
Тип: Class<?>[].
Значение по умолчанию: {}.
Описание: Указывает классы, пакеты которых должны быть сканированы для поиска репозиториев JPA. Это альтернатива basePackages.


Пример:
@EnableJpaRepositories(basePackageClasses = {UserRepository.class, ProductRepository.class})


includeFilters (необязательный):
Тип: ComponentScan.Filter[].
Значение по умолчанию: {}.
Описание: Указывает фильтры для включения определенных классов в сканирование репозиториев.


Пример:
@EnableJpaRepositories(includeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = CustomRepository.class))


excludeFilters (необязательный):
Тип: ComponentScan.Filter[].
Значение по умолчанию: {}.
Описание: Указывает фильтры для исключения определенных классов из сканирования репозиториев.


Пример:
@EnableJpaRepositories(excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = ExcludedRepository.class))


repositoryImplementationPostfix (необязательный):
Тип: String.
Значение по умолчанию: "Impl".
Описание: Указывает постфикс для классов реализации репозиториев.


Пример:
@EnableJpaRepositories(repositoryImplementationPostfix = "CustomImpl")


entityManagerFactoryRef (необязательный):
Тип: String.
Значение по умолчанию: "entityManagerFactory".
Описание: Указывает имя бина EntityManagerFactory, который должен использоваться для репозиториев.


Пример:
@EnableJpaRepositories(entityManagerFactoryRef = "customEntityManagerFactory")


transactionManagerRef (необязательный):
Тип: String.
Значение по умолчанию: "transactionManager".
Описание: Указывает имя бина PlatformTransactionManager, который должен использоваться для управления транзакциями репозиториев.


Пример:
@EnableJpaRepositories(transactionManagerRef = "customTransactionManager")


considerNestedRepositories (необязательный):
Тип: boolean.
Значение по умолчанию: false.
Описание: Указывает, должны ли сканироваться вложенные репозитории (например, внутри других классов).


Пример:
@EnableJpaRepositories(considerNestedRepositories = true)


enableDefaultTransactions (необязательный):
Тип: boolean.
Значение по умолчанию: true.
Описание: Указывает, должны ли методы репозиториев выполняться в транзакции по умолчанию.


Пример:
@EnableJpaRepositories(enableDefaultTransactions = false)


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

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

Выполнение:
Когда приложение запущено, Spring Data JPA создает прокси-объекты для интерфейсов репозиториев, которые реализуют методы, определенные в JpaRepository и пользовательских запросах.

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

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

public class Task260325 {
public static void main(String[] args) {
long x = 10L;
int y = 10;
int z = (int) ((x > y) ? x : y * (x=+3));
System.out.println(z);
}
}


#Tasks
Варианты ответа:
Anonymous Quiz
13%
10
20%
30
43%
130
25%
Exception какой-то
Щас придет тестировщик и все сломает 🫢 🤪

https://t.me/Java_for_beginner_dev

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

Аннотация @EntityGraph используется в Spring Data JPA для управления стратегией загрузки связанных сущностей (например, EAGER или LAZY). Она позволяет динамически определять, какие ассоциации должны быть загружены вместе с основной сущностью, что помогает избежать проблемы N+1 запросов. Аннотация находится в пакете org.springframework.data.jpa.repository.EntityGraph.

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

value (необязательный):
Тип: String.
Значение по умолчанию: "".
Описание: Указывает имя именованного графа сущности (Named EntityGraph), который должен быть использован. Именованный граф должен быть определен в сущности с помощью аннотации
@NamedEntityGraph.

Пример:
@EntityGraph(value = "User.withAddress")
User findById(Long id);


type (необязательный):
Тип: EntityGraphType.
Значение по умолчанию: EntityGraphType.FETCH.
Описание: Определяет тип графа сущности.


Возможные значения:
FETCH: Загружает только указанные ассоциации.
LOAD: Загружает указанные ассоциации, а остальные загружает в соответствии с их стратегией загрузки (например, LAZY или EAGER).


Пример:
@EntityGraph(type = EntityGraphType.LOAD)
User findById(Long id);


attributePaths (необязательный):
Тип: String[].
Значение по умолчанию: {}.
Описание: Указывает пути к атрибутам сущности, которые должны быть загружены. Это альтернатива использованию именованного графа.


Пример:
@EntityGraph(attributePaths = {"address", "orders"})
User findById(Long id);


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

Инициализация:

Аннотация @EntityGraph обрабатывается во время инициализации Spring-контекста. Spring Data JPA анализирует методы репозитория и настраивает графы сущностей.

Выполнение:
Когда метод репозитория вызывается, Spring Data JPA применяет указанный граф сущности к запросу, загружая указанные ассоциации.

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

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

Использование именованных графов:
Именованные графы сущностей можно определить в сущности с помощью аннотации @NamedEntityGraph:
@Entity
@NamedEntityGraph(name = "User.withAddress", attributeNodes = @NamedAttributeNode("address"))
public class User {
// Поля и методы
}


Использование динамических графов:
Динамические графы можно указать с помощью параметра attributePaths:
@EntityGraph(attributePaths = {"address", "orders"})
User findById(Long id);


Комбинирование с @Query:
Аннотация @EntityGraph может использоваться вместе с @Query для более сложных запросов:
@EntityGraph(attributePaths = {"address"})
@Query("SELECT u FROM User u WHERE u.email = :email")
User findByEmail(@Param("email") String email);


Использование нескольких графов:
Можно указать несколько графов сущностей, если это поддерживается JPA-провайдером.

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

Аннотация @Lock используется в Spring Data JPA для указания типа блокировки, которая должна быть применена при выполнении запроса. Это полезно для управления параллельным доступом к данным и предотвращения проблем, таких как потерянные обновления или грязное чтение. Аннотация находится в пакете org.springframework.data.jpa.repository.Lock.

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

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

Возможные значения:
LockModeType.PESSIMISTIC_READ: Пессимистическая блокировка для чтения. Позволяет другим транзакциям читать данные, но не изменять их.
LockModeType.PESSIMISTIC_WRITE: Пессимистическая блокировка для записи. Блокирует данные для чтения и записи другими транзакциями.
LockModeType.PESSIMISTIC_FORCE_INCREMENT: Пессимистическая блокировка с принудительным увеличением версии (используется с оптимистичной блокировкой).
LockModeType.OPTIMISTIC: Оптимистическая блокировка. Проверяет версию сущности при фиксации транзакции.
LockModeType.OPTIMISTIC_FORCE_INCREMENT: Оптимистическая блокировка с принудительным увеличением версии.
LockModeType.NONE: Отсутствие блокировки (по умолчанию).

Пример:
@Lock(LockModeType.PESSIMISTIC_WRITE)
User findById(Long id);


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

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

Выполнение:
Когда метод репозитория вызывается, Spring Data JPA применяет указанную блокировку к запросу. Блокировка сохраняется до завершения транзакции.

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

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

Использование пессимистических блокировок:
Пессимистические блокировки полезны для предотвращения конфликтов при параллельном доступе к данным:
@Lock(LockModeType.PESSIMISTIC_WRITE)
User findById(Long id);


Использование оптимистических блокировок:
Оптимистические блокировки полезны для предотвращения конфликтов при обновлении данных:
@Lock(LockModeType.OPTIMISTIC)
User findById(Long id);


Комбинирование с @Query:
Аннотация @Lock может использоваться вместе с @Query для более сложных запросов:
@Lock(LockModeType.PESSIMISTIC_WRITE)
@Query("SELECT u FROM User u WHERE u.email = :email")
User findByEmail(@Param("email") String email);


Использование с @Transactional:
Методы с @Lock должны выполняться в транзакции, чтобы блокировка сохранялась до завершения транзакции:
@Transactional
@Lock(LockModeType.PESSIMISTIC_WRITE)
User findById(Long id);


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

import java.util.Optional;

public class Task270325 {
public static void main(String[] args) {
Optional<String> optional = Optional.ofNullable(null);
System.out.println(optional.orElse("Default"));
}
}


#Tasks
Ну придумал бы, щас все так делают 🤪😂

https://t.me/Java_for_beginner_dev

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

Что такое оператор %?
Anonymous Quiz
7%
Деление чисел
91%
Остаток от деления
0%
Умножение
2%
Сравнение
Аннотация @Procedure

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

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

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

Описание: Указывает имя хранимой процедуры или функции в базе данных. Если не указано, используется имя метода.

Пример:
@Procedure("calculate_discount")
BigDecimal calculateDiscount(@Param("orderId") Long orderId);


procedureName (необязательный):

Тип: String.
Значение по умолчанию: "".
Описание: Альтернативное имя для параметра value. Указывает имя хранимой процедуры или функции.


Пример:
@Procedure(procedureName = "calculate_discount")
BigDecimal calculateDiscount(@Param("orderId") Long orderId);


outputParameterName (необязательный):
Тип: String.
Значение по умолчанию: "".
Описание: Указывает имя выходного параметра, если хранимая процедура возвращает значение через выходной параметр.


Пример:
@Procedure(outputParameterName = "discount")
BigDecimal calculateDiscount(@Param("orderId") Long orderId);


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

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

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

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

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


Использование именованных хранимых процедур:
Именованные хранимые процедуры можно определить в сущности с помощью аннотации @NamedStoredProcedureQuery:

@Entity
@NamedStoredProcedureQuery(
name = "calculate_discount",
procedureName = "calculate_discount",
parameters = {
@StoredProcedureParameter(mode = ParameterMode.IN, name = "orderId", type = Long.class),
@StoredProcedureParameter(mode = ParameterMode.OUT, name = "discount", type = BigDecimal.class)
}
)
public class Order {
// Поля и методы
}


Использование выходных параметров:
Если хранимая процедура возвращает значение через выходной параметр, можно указать его имя с помощью параметра outputParameterName:

@Procedure(outputParameterName = "discount")
BigDecimal calculateDiscount(@Param("orderId") Long orderId);


Использование с @Query:
Аннотация @Procedure может использоваться вместе с @Query для более сложных сценариев:
@Procedure
@Query(value = "CALL calculate_discount(:orderId, :discount)", nativeQuery = true)
BigDecimal calculateDiscount(@Param("orderId") Long orderId, @Param("discount") BigDecimal discount);


Использование с @Transactional:
Методы с @Procedure должны выполняться в транзакции, чтобы гарантировать атомарность операций:
@Transactional
@Procedure("calculate_discount")
BigDecimal calculateDiscount(@Param("orderId") Long orderId);


#Java #Training #Hard #Spring #SpringDataJPA #Procedure
Небольшой анонс на воскресение 😏

Чат-бот на Spring 🚀

👍 - интересно
👎 - не очень
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM