Аннотация @EntityGraph
Аннотация @EntityGraph используется в Spring Data JPA для управления стратегией загрузки связанных сущностей (например, EAGER или LAZY). Она позволяет динамически определять, какие ассоциации должны быть загружены вместе с основной сущностью, что помогает избежать проблемы N+1 запросов. Аннотация находится в пакете org.springframework.data.jpa.repository.EntityGraph.
Параметры аннотации
value (необязательный):
Тип: String.
Значение по умолчанию: "".
Описание: Указывает имя именованного графа сущности (Named EntityGraph), который должен быть использован. Именованный граф должен быть определен в сущности с помощью аннотации @NamedEntityGraph.
Пример:
type (необязательный):
Тип: EntityGraphType.
Значение по умолчанию: EntityGraphType.FETCH.
Описание: Определяет тип графа сущности.
Возможные значения:
FETCH: Загружает только указанные ассоциации.
LOAD: Загружает указанные ассоциации, а остальные загружает в соответствии с их стратегией загрузки (например, LAZY или EAGER).
Пример:
attributePaths (необязательный):
Тип: String[].
Значение по умолчанию: {}.
Описание: Указывает пути к атрибутам сущности, которые должны быть загружены. Это альтернатива использованию именованного графа.
Пример:
Жизненный цикл аннотации
Инициализация:
Аннотация @EntityGraph обрабатывается во время инициализации Spring-контекста. Spring Data JPA анализирует методы репозитория и настраивает графы сущностей.
Выполнение:
Когда метод репозитория вызывается, Spring Data JPA применяет указанный граф сущности к запросу, загружая указанные ассоциации.
Уничтожение:
Аннотация не имеет явного жизненного цикла уничтожения, так как она используется только для конфигурации загрузки сущностей.
Варианты настройки
Использование именованных графов:
Именованные графы сущностей можно определить в сущности с помощью аннотации @NamedEntityGraph:
Использование динамических графов:
Динамические графы можно указать с помощью параметра attributePaths:
Комбинирование с @Query:
Аннотация @EntityGraph может использоваться вместе с @Query для более сложных запросов:
Использование нескольких графов:
Можно указать несколько графов сущностей, если это поддерживается JPA-провайдером.
#Java #Training #Hard #Spring #SpringDataJPA #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
Аннотация @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 обрабатывается во время инициализации Spring-контекста. Spring Data JPA анализирует методы репозитория и настраивает блокировки.
Выполнение:
Когда метод репозитория вызывается, Spring Data JPA применяет указанную блокировку к запросу. Блокировка сохраняется до завершения транзакции.
Уничтожение:
Аннотация не имеет явного жизненного цикла уничтожения, так как она используется только для конфигурации блокировок.
Варианты настройки
Использование пессимистических блокировок:
Пессимистические блокировки полезны для предотвращения конфликтов при параллельном доступе к данным:
Использование оптимистических блокировок:
Оптимистические блокировки полезны для предотвращения конфликтов при обновлении данных:
Комбинирование с @Query:
Аннотация @Lock может использоваться вместе с @Query для более сложных запросов:
Использование с @Transactional:
Методы с @Lock должны выполняться в транзакции, чтобы блокировка сохранялась до завершения транзакции:
#Java #Training #Hard #Spring #SpringDataJPA #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
Что выведет код?
#Tasks
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
Варианты ответа:
Anonymous Quiz
26%
null
50%
Default
9%
Ничего не выведет
15%
Exception какой-нибудь
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.
Значение по умолчанию: "".
Описание: Указывает имя хранимой процедуры или функции в базе данных. Если не указано, используется имя метода.
Пример:
procedureName (необязательный):
Тип: String.
Значение по умолчанию: "".
Описание: Альтернативное имя для параметра value. Указывает имя хранимой процедуры или функции.
Пример:
outputParameterName (необязательный):
Тип: String.
Значение по умолчанию: "".
Описание: Указывает имя выходного параметра, если хранимая процедура возвращает значение через выходной параметр.
Пример:
Жизненный цикл аннотации
Инициализация:
Аннотация @Procedure обрабатывается во время инициализации Spring-контекста. Spring Data JPA анализирует методы репозитория и настраивает вызовы хранимых процедур.
Выполнение:
Когда метод репозитория вызывается, Spring Data JPA выполняет указанную хранимую процедуру или функцию через JPA-провайдер (например, Hibernate).
Уничтожение:
Аннотация не имеет явного жизненного цикла уничтожения, так как она используется только для конфигурации вызовов хранимых процедур.
Варианты настройки
Использование именованных хранимых процедур:
Именованные хранимые процедуры можно определить в сущности с помощью аннотации @NamedStoredProcedureQuery:
Использование выходных параметров:
Если хранимая процедура возвращает значение через выходной параметр, можно указать его имя с помощью параметра outputParameterName:
Использование с @Query:
Аннотация @Procedure может использоваться вместе с @Query для более сложных сценариев:
Использование с @Transactional:
Методы с @Procedure должны выполняться в транзакции, чтобы гарантировать атомарность операций:
#Java #Training #Hard #Spring #SpringDataJPA #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
Please open Telegram to view this post
VIEW IN TELEGRAM
Аннотация @IdClass
Аннотация @IdClass используется в JPA (Java Persistence API) для указания класса, который представляет составной первичный ключ сущности. Она применяется, когда сущность имеет несколько полей, которые вместе образуют уникальный идентификатор (составной ключ). Аннотация находится в пакете javax.persistence.
Параметры аннотации
value (обязательный):
Тип: Class<?>.
Описание: Указывает класс, который представляет составной первичный ключ. Этот класс должен быть сериализуемым, иметь конструктор по умолчанию и переопределять методы equals() и hashCode().
Пример:
Жизненный цикл аннотации
Инициализация:
Аннотация @IdClass обрабатывается во время инициализации JPA-провайдера (например, Hibernate). JPA-провайдер анализирует сущность и создает метаданные для составного ключа.
Выполнение:
Когда сущность сохраняется, обновляется или извлекается из базы данных, JPA-провайдер использует класс, указанный в @IdClass, для работы с составным ключом.
Уничтожение:
Аннотация не имеет явного жизненного цикла уничтожения, так как она используется только для конфигурации составного ключа.
Варианты настройки
Использование составного ключа:
Класс, представляющий составной ключ, должен быть сериализуемым, иметь конструктор по умолчанию и переопределять методы equals() и hashCode():
Использование с @Embeddable:
Вместо @IdClass можно использовать аннотацию @Embeddable для определения составного ключа:
Использование с репозиториями:
Репозитории Spring Data JPA могут работать с сущностями, имеющими составные ключи:
#Java #Training #Hard #Spring #SpringDataJPA #IdClass
Аннотация @IdClass используется в JPA (Java Persistence API) для указания класса, который представляет составной первичный ключ сущности. Она применяется, когда сущность имеет несколько полей, которые вместе образуют уникальный идентификатор (составной ключ). Аннотация находится в пакете javax.persistence.
Параметры аннотации
value (обязательный):
Тип: Class<?>.
Описание: Указывает класс, который представляет составной первичный ключ. Этот класс должен быть сериализуемым, иметь конструктор по умолчанию и переопределять методы equals() и hashCode().
Пример:
@IdClass(UserId.class)
public class User {
@Id
private Long departmentId;
@Id
private Long userId;
// Остальные поля и методы
}
Жизненный цикл аннотации
Инициализация:
Аннотация @IdClass обрабатывается во время инициализации JPA-провайдера (например, Hibernate). JPA-провайдер анализирует сущность и создает метаданные для составного ключа.
Выполнение:
Когда сущность сохраняется, обновляется или извлекается из базы данных, JPA-провайдер использует класс, указанный в @IdClass, для работы с составным ключом.
Уничтожение:
Аннотация не имеет явного жизненного цикла уничтожения, так как она используется только для конфигурации составного ключа.
Варианты настройки
Использование составного ключа:
Класс, представляющий составной ключ, должен быть сериализуемым, иметь конструктор по умолчанию и переопределять методы equals() и hashCode():
public class UserId implements Serializable {
private Long departmentId;
private Long userId;
// Конструктор по умолчанию
public UserId() {}
// Конструктор с параметрами
public UserId(Long departmentId, Long userId) {
this.departmentId = departmentId;
this.userId = userId;
}
// Геттеры и сеттеры
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
UserId userId1 = (UserId) o;
return Objects.equals(departmentId, userId1.departmentId) &&
Objects.equals(userId, userId1.userId);
}
@Override
public int hashCode() {
return Objects.hash(departmentId, userId);
}
}
Использование с @Embeddable:
Вместо @IdClass можно использовать аннотацию @Embeddable для определения составного ключа:
@Embeddable
public class UserId implements Serializable {
private Long departmentId;
private Long userId;
// Конструктор по умолчанию, геттеры, сеттеры, equals, hashCode
}
@Entity
public class User {
@EmbeddedId
private UserId id;
// Остальные поля и методы
}
Использование с репозиториями:
Репозитории Spring Data JPA могут работать с сущностями, имеющими составные ключи:
public interface UserRepository extends JpaRepository<User, UserId> {
// Методы репозитория
}
#Java #Training #Hard #Spring #SpringDataJPA #IdClass
Что выведет код?
#Tasks
public class Task280325 {
public static void main(String[] args) {
int x = 10;
int y = 20;
if(x == 10)
if(y == 10)
System.out.println("A");
else
System.out.println("B");
System.out.println("C");
}
}
#Tasks
Please open Telegram to view this post
VIEW IN TELEGRAM
Вопросы с собеседования 👩💻
Какой оператор используется для побитового "ИЛИ"?
Какой оператор используется для побитового "ИЛИ"?
Anonymous Quiz
40%
||
2%
&
44%
|
13%
&&
Аннотация @MapsId
Аннотация @MapsId используется в JPA (Java Persistence API) для указания, что внешний ключ сущности также является её первичным ключом. Это полезно при работе с отношениями "один к одному" или "многие к одному", где дочерняя сущность использует первичный ключ родительской сущности в качестве своего собственного первичного ключа. Аннотация находится в пакете javax.persistence.
Параметры аннотации
value (необязательный):
Тип: String.
Значение по умолчанию: "".
Описание: Указывает имя атрибута сущности, который является первичным ключом. Если не указано, используется первичный ключ родительской сущности.
Пример:
Жизненный цикл аннотации
Инициализация:
Аннотация @MapsId обрабатывается во время инициализации JPA-провайдера (например, Hibernate). JPA-провайдер анализирует сущность и создает метаданные для связи с родительской сущностью.
Выполнение:
Когда сущность сохраняется, обновляется или извлекается из базы данных, JPA-провайдер использует первичный ключ родительской сущности в качестве первичного ключа дочерней сущности.
Уничтожение:
Аннотация не имеет явного жизненного цикла уничтожения, так как она используется только для конфигурации связи с родительской сущностью.
Варианты настройки
Использование с @OneToOne:
Аннотация @MapsId часто используется с отношением "один к одному":
Использование с @ManyToOne:
Аннотация @MapsId также может использоваться с отношением "многие к одному":
Использование с составными ключами:
Аннотация @MapsId может использоваться с составными ключами, если родительская сущность имеет составной ключ:
Использование с репозиториями:
Репозитории Spring Data JPA могут работать с сущностями, имеющими аннотацию @MapsId:
#Java #Training #Hard #Spring #SpringDataJPA #MapsId
Аннотация @MapsId используется в JPA (Java Persistence API) для указания, что внешний ключ сущности также является её первичным ключом. Это полезно при работе с отношениями "один к одному" или "многие к одному", где дочерняя сущность использует первичный ключ родительской сущности в качестве своего собственного первичного ключа. Аннотация находится в пакете javax.persistence.
Параметры аннотации
value (необязательный):
Тип: String.
Значение по умолчанию: "".
Описание: Указывает имя атрибута сущности, который является первичным ключом. Если не указано, используется первичный ключ родительской сущности.
Пример:
@MapsId("userId")
@OneToOne
@JoinColumn(name = "user_id")
private User user;
Жизненный цикл аннотации
Инициализация:
Аннотация @MapsId обрабатывается во время инициализации JPA-провайдера (например, Hibernate). JPA-провайдер анализирует сущность и создает метаданные для связи с родительской сущностью.
Выполнение:
Когда сущность сохраняется, обновляется или извлекается из базы данных, JPA-провайдер использует первичный ключ родительской сущности в качестве первичного ключа дочерней сущности.
Уничтожение:
Аннотация не имеет явного жизненного цикла уничтожения, так как она используется только для конфигурации связи с родительской сущностью.
Варианты настройки
Использование с @OneToOne:
Аннотация @MapsId часто используется с отношением "один к одному":
@Entity
public class UserProfile {
@Id
private Long userId;
@MapsId
@OneToOne
@JoinColumn(name = "user_id")
private User user;
// Остальные поля и методы
}
Использование с @ManyToOne:
Аннотация @MapsId также может использоваться с отношением "многие к одному":
@Entity
public class Order {
@Id
private Long orderId;
@MapsId("userId")
@ManyToOne
@JoinColumn(name = "user_id")
private User user;
// Остальные поля и методы
}
Использование с составными ключами:
Аннотация @MapsId может использоваться с составными ключами, если родительская сущность имеет составной ключ:
@Entity
public class UserProfile {
@EmbeddedId
private UserProfileId id;
@MapsId("userId")
@ManyToOne
@JoinColumns({
@JoinColumn(name = "department_id", referencedColumnName = "departmentId"),
@JoinColumn(name = "user_id", referencedColumnName = "userId")
})
private User user;
// Остальные поля и методы
}
Использование с репозиториями:
Репозитории Spring Data JPA могут работать с сущностями, имеющими аннотацию @MapsId:
public interface UserProfileRepository extends JpaRepository<UserProfile, Long> {
// Методы репозитория
}
#Java #Training #Hard #Spring #SpringDataJPA #MapsId
Всем доброго субботнего утра! ☀️
Еще одна неделя позади и все ближе лето!✈️
Надеюсь у всех остались силы пописать свои пет-проекты😄
Напоминаю!
Завтра мы как всегда собираемся в 16:00 по МСК, для лайф-кодинга! Напишем телегам чат-бота, который будет показывать погоду по запросу⛅
Вроде бы и не сложно, но писать будем на Spring.
А в остальном - теплых Вам выходных! ✌️
Еще одна неделя позади и все ближе лето!
Надеюсь у всех остались силы пописать свои пет-проекты
Напоминаю!
Завтра мы как всегда собираемся в 16:00 по МСК, для лайф-кодинга! Напишем телегам чат-бота, который будет показывать погоду по запросу
Вроде бы и не сложно, но писать будем на Spring.
А в остальном - теплых Вам выходных! ✌️
Please open Telegram to view this post
VIEW IN TELEGRAM