赞
踩
之前的文章<<Spring Boot:Spring Data JPA开启审计功能,自动保存操作人操作时间>>介绍过JPA自动存储操作人、操作时间等信息,在开发过程中我们可能遇到需要对实体的其他属性信息在增删改前后进行监听的情况,从原理上来说之前的文章只是一种特例,SpringBoot框架已经帮我们实现。这里记录一下通过Spring Data JPA的EntityListeners注解实现自定义监听的过程。下面案例对之前的代码进行改造,未涉及到的源码具体可参照<<Spring Boot:Idea从零开始初始化后台项目>>。
创建组件类CompanyListener实现对HCompany实体的持久化监听(这里监听方法中仅仅打印日志信息,具体监听业务操作视情况而定)。监听操作主要通过以下几个注解实现,通过将方法添加指定注解完成在实体持久化不同阶段的监听:
@PrePersist 在实体保存到数据库之前执行的操作@PostPersist 在实体保存到数据库之后执行的操作@PreUpdate 在实体更新到数据库之前执行的操作@PostUpdate 在实体更新到数据库之后执行的操作@PreRemove 在实体从数据库删除之前执行的操作@PostRemove 在实体从数据库删除之后执行的操作CompanyListener类完整代码如下:
@Component public class CompanyListener { private final String LOG_PREFIX = "CompanyListener 实体持久化监听>>>>>> HCompany实体执行"; private final String LOG_POSTFIX = "<<<<<<"; private Logger logger = LoggerFactory.getLogger(this.getClass()); /** * @param company */ @PrePersist public void PrePersist(final HCompany company) { this.logger.info("{} [{}] {}", this.LOG_PREFIX, "新增操作之前", LOG_POSTFIX); } /** * @param company */ @PostPersist public void PostPersist(final HCompany company) { this.logger.info("{} [{}] {}", this.LOG_PREFIX, "新增操作之后", LOG_POSTFIX); } /** * @param company */ @PreUpdate public void PreUpdate(final HCompany company) { this.logger.info("{} [{}] {}", this.LOG_PREFIX, "更新操作之前", LOG_POSTFIX); } /** * @param company */ @PostUpdate public void PostUpdate(final HCompany company) { this.logger.info("{} [{}] {}", this.LOG_PREFIX, "更新操作之后", LOG_POSTFIX); } /** * @param company */ @PreRemove public void PreRemove(final HCompany company) { this.logger.info("{} [{}] {}", this.LOG_PREFIX, "删除操作之前", LOG_POSTFIX); } /** * @param company */ @PostRemove public void PostRemove(final HCompany company) { this.logger.info("{} [{}] {}", this.LOG_PREFIX, "删除操作之后", LOG_POSTFIX); } }
在需要监听的实体类上添加EntityListeners注解,这里我们添加到HCompany类上,完整代码如下:
@Entity @Table(name = "h_company") @Where(clause = "id > 0") @EntityListeners({CompanyListener.class}) //实体类关联监听类CompanyListener public class HCompany { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; private String name; private String shortName; private String address; private String tel; private String remark; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getShortName() { return shortName; } public void setShortName(String shortName) { this.shortName = shortName; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public String getTel() { return tel; } public void setTel(String tel) { this.tel = tel; } public String getRemark() { return remark; } public void setRemark(String remark) { this.remark = remark; } }
在控制器DemoController类中添加对HCompany类的增、改请求操作,如下:
@PostMapping("/demo/addCompany") public HResponse addCompany(String name) { HCompany company = new HCompany(); company.setName(name); company.setShortName(name); company.setAddress(name + " address"); company.setTel("18988888888"); this.companyRepository.save(company); return HResponse.success(); } @PostMapping("/demo/updateCompany") public HResponse updateCompany(int id) { HCompany company = this.companyRepository.findById(id).orElseThrow(() -> new HException("数据不存在或已被删除!")); company.setRemark("update at " + new Date().toString()); this.companyRepository.save(company); return HResponse.success(); }
使用Postman工具发送请求,对实体类进行增、改操作,请求过程及响应日志如下图:




Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。