[Spring boot] Jpa entity listener thực hiện một cái gì đó trước và sau khi động vào database

Vấn đề

  • Nay mình được các giao cho cái việc đồng bộ cái database với elasticsearch, đầu tiên là mình dùng thằng logstash cho nó chạy schedule 5 phút 1 phát, nhưng nó lại bị miss cái trường hợp delete và lại nhìn nó không ổn lắm :bowtie: . Vậy là mình đi hỏi các cao nhân, các cao nhân chỉ cứ đọc binlog ra rồi ghi vào ES, việc này sẽ đảm bảo chắc chắn hành động đã thực hiện thành công trên database rồi mình làm tương tự với ES thôi :grimacing:
  • Nhưng bên oracle thì không phải binlog, nó là archived log thì phải, tìm mãi chả có bài gì nói liên quan đến thằng này (chắc tại mình không biết key), đọc doc của oracle thì tớ sợ lắm :cry: ấy thế vô tình thế nào lại thấy cái annotation EntityListeners

EntityListeners

Thí dụ

  • Đầu tiên mình tạo một class entity listener
@Slf4j
public class UserEntityListener {

    @PrePersist
    void onPrePersist(UserEntity user) {
        log.info("PrePersist: " + user);
    }

    @PostPersist
    void onPostPersist(UserEntity user) {
        log.info("PostPersist: " + user);
    }

    @PreUpdate
    void onPreUpdate(UserEntity user) {
        log.info("PreUpdate: " + user);
    }

    @PostUpdate
    void onPostUpdate(UserEntity user) {
        log.info("PostUpdate: " + user);
    }

    @PreRemove
    void onPreRemove(UserEntity user) {
        log.info("PreRemove: " + user);
    }

    @PostRemove
    void onPostRemove(UserEntity user) {
        log.info("PostRemove: " + user);
    }
}
  • Đây với mỗi hành động tương ứng nó sẽ vào pre trước khi nó động đên database và vào post sau khi nó đông tới database. Rồi tiếp mình tạo cái entity này
@Entity
@EntityListeners(UserEntityListener.class)
public class UserEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;
    private String username;
    private String password;
}
  • Đây mình dùng cái annotation EntityListeners với cái class listener mình vừa tạo
  • Tiếp là tới đoạn thử này
@SpringBootApplication
public class JpaEntityListenerApplication {

    public static void main(String[] args) {
        SpringApplication.run(JpaEntityListenerApplication.class, args);
    }

    @Bean
    public CommandLineRunner demo(UserRepository repository) {
        return (args) -> {
            UserEntity user = UserEntity.builder()
                    .username("xin chao")
                    .password("123123")
                    .build();
            repository.saveAndFlush(user);

            Optional<UserEntity> userOptional = repository.findById(user.getId());
            if (userOptional.isEmpty()) throw new NotFoundException("not found");
            userOptional.get().setUsername("hello");
            repository.save(userOptional.get());

            repository.delete(user);
        };
    }

}

Tổng kết

  • Demo của mình chỉ có vậy thôi, còn phần code thực tế của mình sau khi ví dụ cập nhật thành công, phần xử lý ở đấy sẽ vào phương thức onPostUpdate rồi ở đấy mình sẽ push một message lên kafka để cái động chí làm việc với ES sẽ cập nhật lại :D
  • Nếu các bạn không biết làm gì thì có thể lưu log chẳng hạn, mình nghĩ nó cũng hữu ích đấy :innocent:
  • Cảm ơn bạn đã đọc đến đây nhé, các bạn để lại góp ý cho mình dưới comment nhé, đây là link source demo https://github.com/hunghhdev/guide/tree/master/spring-boot/jpa-entity-listener :heart::heart::heart:
Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

hunghh.dev

8 bài viết.
10 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
7 0
Xin chào các bạn đọc, trong seri này mình dự định sẽ chia sẻ cách dùng spring security để phân quyền trong web service, cách đọc ghi một JWT, rồi t...
hunghh.dev viết 9 tháng trước
7 0
White
6 1
Restful api Rest (Representational State Transfer) hiểu nôm na nó là một kiểu kiến trúc được dùng để giao tiếp giữa các máy tính, được truyền tải...
hunghh.dev viết 8 tháng trước
6 1
White
3 0
Ở (Link) mình đã tạo một số model và tạo thử một api register, ở phần này mình sẽ hướng dẫn các bạn tạo một chuỗi JWT và khi login sẽ chả về cái ch...
hunghh.dev viết 9 tháng trước
3 0
Bài viết liên quan
White
4 0
I used Spring boot, Hibernate few times back then at University, I'v started using it again recently. In this (Link), I want to check how Spring J...
Rey viết gần 2 năm trước
4 0
White
0 0
Giới thiệu Trong bài hôm nay chúng ta sẽ tìm hiểu cách handle request POST của Spring Boot. Trước đó, bạn nên biết 1. 「Spring Boot 8」Tạo Web He...
https://loda.me viết hơn 1 năm trước
0 0
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
8 bài viết.
10 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!