JPA слушатель событий - PullRequest
       14

JPA слушатель событий

0 голосов
/ 05 апреля 2020

Мне нужно создать приложение, которое получает записи из базы данных, равно некоторому значению, и если оно возвращает true, оно выполнит какое-то действие. Мне было интересно, может ли JPA сделать что-то подобное.

У меня есть сущность Game:

@Data
@Entity
public class Game {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    public Game() {

    }

    @OneToOne
    private Team teamBlue;

    @OneToOne
    private Team teamRed;

    @DateTimeFormat(pattern = "HH:mm:ss yyyy-MM-dd")
    private LocalDateTime localDateTime;
}

и GameRepository, которая возвращает Game:

@Repository
public interface GameRepository extends JpaRepository<Game, Long> {
    @Override
    Optional<Game> findById(Long aLong);
}

Я хочу проверить, равно ли значение LocalDateTime из Game текущему LocalDateTime (LocalDateTime.now()), и если это так, выполнить какое-либо действие. Конечно, я мог бы использовать @Scheduled и вызывать метод каждые 1 час, но мне интересно, возможно ли то, что я описываю.

Краткое резюме:

Game сущность в базе данных с LocalDateTime = 2020-04-05 21: 00: 00

Текущая дата-время: 2020-04-05 12:00:00 (ничего не делать, потому что текущая дата-время не равно Game дата-время)

[9 часов спустя]

Game сущность в базе данных (неизменяемая) с LocalDateTime = 2020-04-05 21: 00: 00

Текущая дата-время: 2020 -04-05 21:00:00 (текущая дата и время совпадают с датой Game, поэтому выполните некоторые действия (например, System.out.println(game))).

1 Ответ

0 голосов
/ 06 апреля 2020

Я бы предложил запланировать работу с аннотацией @Scheduled, которая будет обрабатывать данные с базой данных, используя данные весны jpa.

@Scheduled(fixedRate=0 * * * *)
@Transactional
public void scheduleGameJob() {
    Optional<Game> game = gameRepo.findById(1L);
    if (game.isPresent()) {
     LocalDateTime gameTime = game.get().getLocalDateTime();
     if (gameTime.equals(LocalDateTime.now())) {
      //do some action (for example System.out.println(game))).
     }
    }
}
...