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

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

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
Продвинутые аннотации и нюансы работы с датами

4. @CreatedDate и @LastModifiedDate

Эти аннотации используются в Spring Data JPA для автоматического управления полями, хранящими дату создания и дату последнего изменения.

Пример использования:
@Entity
public class Event {
@CreatedDate
private LocalDateTime createdAt;

@LastModifiedDate
private LocalDateTime updatedAt;

// Геттеры и сеттеры
}


Поля createdAt и updatedAt автоматически заполняются при создании и обновлении сущности.

Как это работает под капотом:
Spring Data JPA использует AuditingEntityListener для отслеживания изменений сущностей и автоматического заполнения этих полей.

Плюсы:
Упрощает управление временными метками.
Не требует ручного обновления полей.


Минусы:
Требует настройки аудита в конфигурации Spring.

5. @Scheduled

Эта аннотация используется для запуска задач по расписанию. Она поддерживает работу с датами и временем для выполнения задач в определенные моменты.

Пример использования:
@Component
public class EventScheduler {
@Scheduled(cron = "0 0 12 * * ?") // Запуск каждый день в 12:00
public void scheduleEvent() {
System.out.println("Event scheduled at: " + LocalDateTime.now());
}
}


Как это работает под капотом:
Spring использует TaskScheduler для выполнения методов, помеченных этой аннотацией, в соответствии с указанным расписанием.

Плюсы:
Удобно для выполнения периодических задач.
Поддерживает сложные расписания через cron.


Минусы:
Требует настройки пула потоков для выполнения задач.

6. Нюансы работы с датами

Временные зоны: Всегда учитывайте временные зоны при работе с датами. Используйте
@JsonFormat(timezone = "UTC") или ZonedDateTime.
Иммутабельность: Классы дат в Java (например, LocalDate, LocalDateTime) являются неизменяемыми. Это означает, что любые операции возвращают новый объект.
Сериализация: При работе с REST API убедитесь, что даты сериализуются и десериализуются в правильном формате.


#Java #Training #Spring #Date #CreatedDate #LastModifiedDate #Scheduled
Аннотации @LastModifiedBy и @LastModifiedDate

Эти аннотации являются частью механизма аудита Spring Data и используются для автоматического отслеживания:
@LastModifiedBy - кто последним изменял сущность
@LastModifiedDate - когда были внесены последние изменения

Обе аннотации находятся в пакете org.springframework.data.annotation.

Аннотация @LastModifiedBy

Параметры
Как и @CreatedBy, аннотация не имеет параметров. Применяется к полям, которые должны хранить информацию о последнем редакторе.

Поддерживаемые типы
String (для имен пользователей)
Long/UUID (для ID пользователей)

Любой другой тип, возвращаемый реализацией AuditorAware

Пример использования
@Entity
@EntityListeners(AuditingEntityListener.class)
public class Document {
@LastModifiedBy
private String lastModifiedBy;

// Другие поля
}


Аннотация @LastModifiedDate

Параметры
Не имеет параметров. Применяется к полям даты/времени.

Поддерживаемые типы
Те же, что и для @CreatedDate:
java.time типы (LocalDateTime, ZonedDateTime)
java.util.Date
Long (timestamp)


Пример использования
@Entity
@EntityListeners(AuditingEntityListener.class)
public class Document {
@LastModifiedDate
private LocalDateTime lastModifiedAt;

// Другие поля
}


Комбинированное использование

Полный пример аудита
@Entity
@EntityListeners(AuditingEntityListener.class)
public class Product {
@Id
private Long id;

@CreatedBy
private String createdBy;

@CreatedDate
private LocalDateTime createdAt;

@LastModifiedBy
private String lastModifiedBy;

@LastModifiedDate
private LocalDateTime lastModifiedAt;

// Бизнес-поля
private String name;
private BigDecimal price;
}


Особенности поведения

Инициализация:
@CreatedBy/Date заполняются только при создании
@LastModifiedBy/Date обновляются при каждом изменении

Сценарий обновления:
product.setPrice(new BigDecimal("99.99"));
productRepository.save(product);
Поля lastModifiedBy/At будут автоматически обновлены
Поля createdBy/At останутся без изменений


Настройка в Spring Boot

Обязательная конфигурация
Активация аудита:
@SpringBootApplication
@EnableJpaAuditing
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}


Реализация AuditorAware (для @CreatedBy и @LastModifiedBy):
@Bean
public AuditorAware<String> auditorAware() {
return () -> Optional.ofNullable(SecurityContextHolder.getContext())
.map(SecurityContext::getAuthentication)
.filter(Authentication::isAuthenticated)
.map(Authentication::getName);
}


Дополнительные настройки
Для JPA репозиториев:
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true


Настройка формата даты (опционально):
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
spring.jackson.time-zone=UTC


Практические рекомендации


Для веб-приложений:
Комбинируйте с Spring Security для автоматического определения пользователя
Используйте DTO с аннотацией
@JsonFormat для красивого отображения дат

Для микросервисов:
Вместо имени пользователя можно хранить ID сервиса
Используйте единый часовой пояс (UTC) для всех сервисов


Оптимизация запросов:
@Query("SELECT p FROM Product p WHERE p.lastModifiedAt > :since")
List<Product> findRecentlyModified(@Param("since") LocalDateTime since);


Интеграция с историей изменений:
Можно создать отдельную таблицу для хранения полной истории изменений
Использовать
@PreUpdate и @PrePersist для дополнительного логирования

Ограничения и решения

Проблема: Не обновляется при косвенных изменениях
Решение: Явно вызывать save() или использовать
@Version

Проблема: Неточное время в кластере
Решение: Использовать NTP или временные сервисы


Проблема: Кастомные редакторы (например, системные задания)
Решение: Переопределить AuditorAware для специфических случаев


#Java #Training #Hard #Spring #SpringDataJPA #LastModifiedBy #LastModifiedDate