hibernate實體監聽器

上學期學完spring的基本增刪改查後,還曾有點小小的得意,感受本身也算知道很多的編程知識了,但這段時間的項目經驗又一次次的教了本身作人,不斷出現的新知識讓本身應接不暇,知道的越多,未知的越多。spring

clipboard.png

也算進入了學習的另外一個階段:數據庫

知道本身不知道

感慨完了,該進入正題了,本週有一個需求,spring sercurity要求在保存密碼的時候密碼必須加密,學長開始寫的時候是在setter密碼的時候調用加密方法,不夠優雅,就讓我把這個方法提出來,換用監聽器,當監聽的user保存時就自動加密其密碼,因爲當時只知道攔截器,因而就去找了一篇攔截器的教程,發現寫出來感受至關不合適,就問學長,果真我理解錯了意思,是用一個叫實體監聽器(Entity Listeners)的東西。編程

Entity Listener

顧名思義,它能夠監聽實體的某些行爲,並進行一部分操做。學習

Hibernate支持的回調註解

@PrePersist

Executed before the entity manager persist operation is actually executed or cascaded. This call is synchronous with the persist operation.
在數據持久化到數據庫以前執行加密

@PreRemove

Executed before the entity manager remove operation is actually executed or cascaded. This call is synchronous with the remove operation.
執行數據刪除以前調用spa

@PostPersist

Executed after the entity manager persist operation is actually executed or cascaded. This call is invoked after the database INSERT is executed.
在執行數據插入以後調用hibernate

@PostRemove

Executed after the entity manager remove operation is actually executed or cascaded. This call is synchronous with the remove operation.
在執行數據刪除以後調用code

@PreUpdate

Executed before the database UPDATE operation.
在執行數據更新以前調用對象

@PostUpdate

Executed after the database UPDATE operation.
在執行數據更新以後調用繼承

@PostLoad

Executed after an entity has been loaded into the current persistence context or an entity has been refreshed.
在數據從數據庫加載而且賦值到當前對象後調用

用法

首先,先定義一個操做用的類,並在其中寫下你要用的方法,好比下面的方法就表明在用戶持久化和更新的時候執行(只需註解就好,不用繼承其餘類)。

clipboard.png
而後在實體上聲明,就完工了,至關簡單。

clipboard.png

對於上面的代碼,初學者可能會對這一段有疑惑

PasswordEncoder passwordEncoder = ContextConfig.getContext().getBean(PasswordEncoder.class);

我開始也不明白,仍是學長給我講解的,這是獲取PasswordEncoder的對象,學長給我講了講才大概明白了hibernate和spring是兩個系統,spring管理的對象,hibernate注入不進來。若是不明白能夠看看下面這個圖。

spring的ioc

clipboard.png
這篇文章寫得挺不錯,有興趣能夠看看

總結

實體監聽器雖然只是一個很簡單的功能,但卻很是強大與實用,這段時間以來同時瞭解到hibernate和spring並非一個東西,之前一直覺得hibernate是spring的一個小功能,同時對spring總算有了一丁點清晰的認識,整體狀態還算滿意,感謝學長們的幫助。

相關文章
相關標籤/搜索