基于JPA实体类监听器@EntityListeners注解的使用实例

 更新时间:2021年08月02日 15:23:22   作者:c&0xff00  
这篇文章主要介绍了JPA实体类监听器@EntityListeners注解的使用实例,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

JPA实体类监听器@EntityListeners注解的使用

被@Prepersist注解的方法 ,完成save之前的操作。

被@Preupdate注解的方法 ,完成update之前的操作。

被@PreRemove注解的方法 ,完成remove之前的操作。

被@Postpersist注解的方法 ,完成save之后的操作。

被@Postupdate注解的方法 ,完成update之后的操作。

被@PostRemovet注解的方法 ,完成remove之后的操作。

自定义实体类监听类:

import org.springframework.stereotype.Component;
import javax.persistence.PostPersist;
import javax.persistence.PostUpdate;
import javax.persistence.PrePersist;
import javax.persistence.PreUpdate;
public class TestEntityListeners {
	@PrePersist
	public void PrePersist(Object entity){
		System.out.println("开始保存--"+entity.toString());
	}
	@PreUpdate
	public void PreUpdate(Object entity){
		System.out.println("开始更新--"+entity.toString());
	}
 
	@PostPersist
	public void PostPersist(Object entity){
		System.out.println("结束保存--"+entity.toString());
	}
 
       @PostUpdate
	public void PostUpdate(Object entity){
		System.out.println("结束更新--"+entity.toString());
	}
}

实体类上增加注解:

@EntityListeners(value = {TestEntityListeners.class})
@Entity
@Table(name = "product")
@EntityListeners(value = {TestEntityListeners.class})
public class Product {
	private int id;
	private String productId;
	private String productName;
    //getter setter toString()
}

写两个测试保存、更新的方法:

import com.goods.evaluate.entity.Product;
import com.goods.evaluate.service.TestService1;
import com.goods.evaluate.repository.ProductRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; 
import java.util.Optional; 
@Service
public class TestService implements TestService1 { 
	@Autowired
	private ProductRepository productRepository; 
	@Transactional
	public void testSave(){
		Optional<Product> product = productRepository.findById(10);
		productRepository.save(product.orElse(null));
		System.out.println("保存。。。");
	} 
	@Transactional
	public void testUpdate(){
		productRepository.updateProduct("test10");
		System.out.println("更新。。。");
	}
}

执行结果:

未执行监听器内容? 暂不清楚是什么原因

这是Application的配置:

@SpringBootApplication
@EnableSpringConfigured
@EnableJpaAuditing
@EnableAspectJAutoProxy(proxyTargetClass=true)
public class EvaluateApplication { 
	public static void main(String[] args) {
		SpringApplication.run(EvaluateApplication.class, args);
	} 
}

@MappedSupperclass、@EntityListeners注解注意事项

1. @MappedSupperclass注解

(1) 该注解标注在类上,用来标识父类;

(2) 该注解标识的类不能映射到数据库,被标识的类的属性必须通过子类来映射;

(3) 该注解标识了类之后,不能再有@Entity和@Table注解标识该类

(4) 标识有该注解的类,通常属性上用以下注解@Id @GeneratedVale(strategy=GenerationType.IDENTITY) 、

@CreateDate 、 @CreateBy、@LastModifiedBy、@LastModifiedDate等注解用在父类上,子类基础该父类即可,

并在子类标注@Table和@Entity

2.@EntityListeners(AuditingEntityListener.class)注解

(1) 该注解用于监听实体类,在save、update之后的状态

(2) 使用了@EntityListeners(AuditingEntityListener.class)之后,记得在Application

启动类上加@EnableJpaAuditing,不然@CreateDate,@LastModifiedBy不生效

3.启用@EnableJpaAuditing,配置AuditorAware实现类

(1)只有使用了@EnableJpaAuditing注解,@CreateDate @LastModifiedBy等注解才会生效;

(2) 只有实现了AuditorAware接口,才会指定@CreateBy用户名信息。

//AuditorAware 实现类,指定当前操作用户信息
@Configuration
public class UserAuditorConfig implements AuditorAware<String> {
    @Override
    public Optional<String> getCurrentAuditor() {
        return Optional.of(SpringSecurityHolder.currentUserName());
    }
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java后端服务间歇性响应慢的问题排查与解决

    Java后端服务间歇性响应慢的问题排查与解决

    之前在公司内其它团队找到帮忙排查的一个后端服务连接超时问题,问题的表现是服务部署到线上后出现间歇性请求响应非常慢(大于10s),但是后端业务分析业务日志时却没有发现慢请求,所以本文给大家介绍了Java后端服务间歇性响应慢的问题排查与解决,需要的朋友可以参考下
    2025-03-03
  • 基于SpringBoot实现验证码功能的代码及思路

    基于SpringBoot实现验证码功能的代码及思路

    SpringBoot技术是目前市面上从事JavaEE企业级开发过程中使用量最大的技术,下面这篇文章主要给大家介绍了如何基于SpringBoot实现验证码功能的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-07-07
  • 使用Springboot根据配置文件动态注入接口实现类

    使用Springboot根据配置文件动态注入接口实现类

    这篇文章主要介绍了使用Springboot根据配置文件动态注入接口实现类,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • java实现酒店管理系统

    java实现酒店管理系统

    这篇文章主要为大家详细介绍了java实现酒店管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-02-02
  • java注解实现websocket服务的两种方式

    java注解实现websocket服务的两种方式

    Java WebSocket是一种基于TCP协议的双向全双工消息传输技术,它允许服务器和客户端之间实时通信,具有低延迟和高效率的特点,下面这篇文章主要给大家介绍了关于java注解实现websocket服务的两种方式,需要的朋友可以参考下
    2024-08-08
  • JDK反序列化时修改类的全限定性名解析

    JDK反序列化时修改类的全限定性名解析

    这篇文章主要介绍了JDK反序列化时修改类的全限定性名解析,具有一定借鉴价值,需要的朋友可以参考下。
    2017-12-12
  • Java中的转换流InputStreamReader解读

    Java中的转换流InputStreamReader解读

    InputStreamReader是Java.io包中的一个类,用于将字节输入流转换为字符输入流,它继承自java.io.Reader类,提供了两种构造方法,可以使用默认或指定字符集创建实例,常用方法包括读取字符、判断是否准备好读取数据和关闭流
    2024-09-09
  • Java计算两个时间相差的秒数怎么算

    Java计算两个时间相差的秒数怎么算

    这篇文章主要介绍了Java计算两个时间相差的秒数,通过实例代码补充介绍了Java 获取两个时间的时间差(时、分、秒)问题,感兴趣的朋友跟随小编一起看看吧
    2024-03-03
  • 基于@JsonProperty的使用说明

    基于@JsonProperty的使用说明

    这篇文章主要介绍了基于@JsonProperty的使用说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10
  • java + dom4j.jar提取xml文档内容

    java + dom4j.jar提取xml文档内容

    这篇文章主要为大家详细介绍了java + dom4j.jar提取xml文档内容,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-08-08

最新评论