基于JPA實(shí)體類(lèi)監(jiān)聽(tīng)器@EntityListeners注解的使用實(shí)例
JPA實(shí)體類(lèi)監(jiān)聽(tīng)器@EntityListeners注解的使用
被@Prepersist注解的方法 ,完成save之前的操作。
被@Preupdate注解的方法 ,完成update之前的操作。
被@PreRemove注解的方法 ,完成remove之前的操作。
被@Postpersist注解的方法 ,完成save之后的操作。
被@Postupdate注解的方法 ,完成update之后的操作。
被@PostRemovet注解的方法 ,完成remove之后的操作。

自定義實(shí)體類(lèi)監(jiān)聽(tīng)類(lèi):
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("開(kāi)始保存--"+entity.toString());
}
@PreUpdate
public void PreUpdate(Object entity){
System.out.println("開(kāi)始更新--"+entity.toString());
}
@PostPersist
public void PostPersist(Object entity){
System.out.println("結(jié)束保存--"+entity.toString());
}
@PostUpdate
public void PostUpdate(Object entity){
System.out.println("結(jié)束更新--"+entity.toString());
}
}
實(shí)體類(lèi)上增加注解:
@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()
}
寫(xiě)兩個(gè)測(cè)試保存、更新的方法:
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("更新。。。");
}
}
執(zhí)行結(jié)果:

未執(zhí)行監(jiān)聽(tīng)器內(nèi)容? 暫不清楚是什么原因
這是Application的配置:
@SpringBootApplication
@EnableSpringConfigured
@EnableJpaAuditing
@EnableAspectJAutoProxy(proxyTargetClass=true)
public class EvaluateApplication {
public static void main(String[] args) {
SpringApplication.run(EvaluateApplication.class, args);
}
}
@MappedSupperclass、@EntityListeners注解注意事項(xiàng)
1. @MappedSupperclass注解
(1) 該注解標(biāo)注在類(lèi)上,用來(lái)標(biāo)識(shí)父類(lèi);
(2) 該注解標(biāo)識(shí)的類(lèi)不能映射到數(shù)據(jù)庫(kù),被標(biāo)識(shí)的類(lèi)的屬性必須通過(guò)子類(lèi)來(lái)映射;
(3) 該注解標(biāo)識(shí)了類(lèi)之后,不能再有@Entity和@Table注解標(biāo)識(shí)該類(lèi)
(4) 標(biāo)識(shí)有該注解的類(lèi),通常屬性上用以下注解@Id @GeneratedVale(strategy=GenerationType.IDENTITY) 、
@CreateDate 、 @CreateBy、@LastModifiedBy、@LastModifiedDate等注解用在父類(lèi)上,子類(lèi)基礎(chǔ)該父類(lèi)即可,
并在子類(lèi)標(biāo)注@Table和@Entity
2.@EntityListeners(AuditingEntityListener.class)注解
(1) 該注解用于監(jiān)聽(tīng)實(shí)體類(lèi),在save、update之后的狀態(tài)
(2) 使用了@EntityListeners(AuditingEntityListener.class)之后,記得在Application
啟動(dòng)類(lèi)上加@EnableJpaAuditing,不然@CreateDate,@LastModifiedBy不生效
3.啟用@EnableJpaAuditing,配置AuditorAware實(shí)現(xiàn)類(lèi)
(1)只有使用了@EnableJpaAuditing注解,@CreateDate @LastModifiedBy等注解才會(huì)生效;
(2) 只有實(shí)現(xiàn)了AuditorAware接口,才會(huì)指定@CreateBy用戶(hù)名信息。
//AuditorAware 實(shí)現(xiàn)類(lèi),指定當(dāng)前操作用戶(hù)信息
@Configuration
public class UserAuditorConfig implements AuditorAware<String> {
@Override
public Optional<String> getCurrentAuditor() {
return Optional.of(SpringSecurityHolder.currentUserName());
}
}
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java后端服務(wù)間歇性響應(yīng)慢的問(wèn)題排查與解決
之前在公司內(nèi)其它團(tuán)隊(duì)找到幫忙排查的一個(gè)后端服務(wù)連接超時(shí)問(wèn)題,問(wèn)題的表現(xiàn)是服務(wù)部署到線(xiàn)上后出現(xiàn)間歇性請(qǐng)求響應(yīng)非常慢(大于10s),但是后端業(yè)務(wù)分析業(yè)務(wù)日志時(shí)卻沒(méi)有發(fā)現(xiàn)慢請(qǐng)求,所以本文給大家介紹了Java后端服務(wù)間歇性響應(yīng)慢的問(wèn)題排查與解決,需要的朋友可以參考下2025-03-03
基于SpringBoot實(shí)現(xiàn)驗(yàn)證碼功能的代碼及思路
SpringBoot技術(shù)是目前市面上從事JavaEE企業(yè)級(jí)開(kāi)發(fā)過(guò)程中使用量最大的技術(shù),下面這篇文章主要給大家介紹了如何基于SpringBoot實(shí)現(xiàn)驗(yàn)證碼功能的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-07-07
使用Springboot根據(jù)配置文件動(dòng)態(tài)注入接口實(shí)現(xiàn)類(lèi)
這篇文章主要介紹了使用Springboot根據(jù)配置文件動(dòng)態(tài)注入接口實(shí)現(xiàn)類(lèi),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08
java注解實(shí)現(xiàn)websocket服務(wù)的兩種方式
Java WebSocket是一種基于TCP協(xié)議的雙向全雙工消息傳輸技術(shù),它允許服務(wù)器和客戶(hù)端之間實(shí)時(shí)通信,具有低延遲和高效率的特點(diǎn),下面這篇文章主要給大家介紹了關(guān)于java注解實(shí)現(xiàn)websocket服務(wù)的兩種方式,需要的朋友可以參考下2024-08-08
Java中的轉(zhuǎn)換流InputStreamReader解讀
InputStreamReader是Java.io包中的一個(gè)類(lèi),用于將字節(jié)輸入流轉(zhuǎn)換為字符輸入流,它繼承自java.io.Reader類(lèi),提供了兩種構(gòu)造方法,可以使用默認(rèn)或指定字符集創(chuàng)建實(shí)例,常用方法包括讀取字符、判斷是否準(zhǔn)備好讀取數(shù)據(jù)和關(guān)閉流2024-09-09
Java計(jì)算兩個(gè)時(shí)間相差的秒數(shù)怎么算
這篇文章主要介紹了Java計(jì)算兩個(gè)時(shí)間相差的秒數(shù),通過(guò)實(shí)例代碼補(bǔ)充介紹了Java 獲取兩個(gè)時(shí)間的時(shí)間差(時(shí)、分、秒)問(wèn)題,感興趣的朋友跟隨小編一起看看吧2024-03-03
java + dom4j.jar提取xml文檔內(nèi)容
這篇文章主要為大家詳細(xì)介紹了java + dom4j.jar提取xml文檔內(nèi)容,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-08-08

