java Sping Boot 存储库如何缓存X实体直到保存到数据库

yeotifhr  于 2023-02-28  发布在  Java
关注(0)|答案(1)|浏览(163)

我目前正在为我的SpringBoot应用程序实现一个基于数据库的日志记录器。由于在短时间内可能会有数百个日志,我正在寻找一种方法来存储特定数量的日志之前,他们被保存在数据库中。
我试着重写一个自定义仓库的保存()方法,就像其他文章中提到的那样,但我最终遇到了bean错误,它根本没有做它应该做的事情。我也试着直接在我的Logger中实现它,但由于PrimaryKey ID只在使用Repository.save()方法后设置,所以我的Logs在之后混淆了。

kzipqqlq

kzipqqlq1#

也许你可以用JPA callbacks for the different lifecycle events(PrePersist, PostPersist, etc...)
假设您已经实现了用于管理图书的实体和存储库,那么您可以定义一个利用上述事件的服务。
您的实体:

@Entity
@EntityListeners(BookLoggingService.class)
class Book {

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private Long id;

private String title;

private String isbn;

public Book() {}

public Book(String title, String isbn) {
    this.title = title;
    this.isbn = isbn;
}

public String getTitle() {
    return title;
}

public String getIsbn() {
    return isbn;
}

@Override
public String toString() {
    return "Book [id=" + id + ", title=" + title + ", isbn=" + isbn + "]";
}
}

您的存储库:

interface BookRepository extends CrudRepository<Book, Long> {

}

您的日志记录逻辑:

class BookLoggingService {

private static final Log log = LogFactory.getLog(BookLoggingService.class);

@PrePersist
void actOnPrePersist(Book book) {
    // implement your logging
    log.info("on pre persist of book: " + book);
}

@PostPersist
void actOnPostPersist(Book book) {
    // implement your logging logic
    log.info("the after persist: " + book.toString());
}

@PreRemove
void actOnPreRemove(Book book) {
    // implement your logging logic
    log.info("the before removed: " + book.toString());
}

@PostRemove
void actOnPostRemove(Book book) {
    // implement your logging logic
    log.info("the after removed: " + book.toString());
}

}
然后你会看到这样的东西:

相关问题