spring boot 中如何設定hibernate Interceptor
首先需用你用spring boot 搭建一個web專案,持久層用的spring data jpa(實現類是hibernate)
因為在之前用mybatis plus的時候有個功能,能在insert的時候,自動填充實體類中的建立人、建立時間屬性,同理update的時候也能填充更新人、更新時間的屬性。其實這這是一個方面而已,我們也能實現記錄的審計,誰新增了記錄,誰刪除了記錄等。。就等著你去做了
在做的突發奇想,能不能在hibernate中也實現這樣的功能呢?如果要實現這樣的功能,肯定實在insert之前填充建立人、建立時間,想就應該用攔截器來實現這樣的功能。
第一能想到是的是用aop來實現這樣的功能,首先自定義註解,在新增、更新、刪除的方法上加上對應的自定義註解,在攔擊的的方法中去做屬性的填充。
第二個既然struts1、struts2、springmvc 有攔截器,在hibernate中是否也有這樣的攔截器呢,於是在hibernate的文件中還真找到了攔截器的功能,我擦 我都開始佩服我自己了, 哈哈哈。。。。。。既然有攔截的功能,只要實現整合介面,重寫方法就就行了,然後配置上攔截器就ok了。具體的實現先按下不說,在期間我到了spring data jpa 已經有了這個功能,實現起來也很簡單。
第三用spring data jpa的方式來實現上邊說的填充功能
1: 在spring boot的啟動方法上新增上註解 (@EnableJpaAuditing)
2: 在實體類上添加註解(@EntityListeners(AuditingEntityListener.class))
3:在實體類的屬性上添加註解
@CreatedDate 建立時間
@LastModifiedDate 更新時間
spring data jpa能自動區分出來insert 和 update 能自動填上時間,狠省心啊
@CreatedBy()
@LastModifiedBy()
重點來了,每個人登入的賬號不一樣,怎麼設定當前的建立人、更新人呢
具體怎麼獲取當前登入人的id,需要看你用的什麼框架(shiro、spring security)
肯定是能獲取的,具體我就不說了
=================華麗的分割線============================
再來說說用hibernate的攔截器怎麼來實現上說的功能
自定義個類繼承 EmptyInterceptor 類,給來中有多個方法,具體的請參考官方文件,我們在這裡只說怎麼用
以更新為例說明:在方法體onFlushDirty中去重寫,屬性對應的 屬性值、屬性名、屬性的型別 分別對應在
Object[] currentState、 String[] propertyNames,、Type[] types
遍歷到要修改的屬性名字並獲取當前的index 去去改 Object的index引數就能實現,填充或者更改了
方法體有個boolean型別的返回值,我得的true 和false 都能填充並儲存到資料庫,為什麼 這個我也不知道。
下面還有一個配置喲
interceptor的值等於 HibernateInterceptor錯在的package位置+類名
spring.jpa.properties.hibernate.ejb.interceptor=com.smile.config.hibernate.HibernateInterceptor
好了就這樣了, 下回再研究多租戶和hibernate的審計的功能,還有hibernate search
================================================
最後附上 官網文件http://docs.jboss.org/hibernate/orm/4.3/manual/en-US/html/ch14.html