欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
第?13?章? 攔截器與事件(Interceptors and events)

第 13 章 攔截器與事件(Interceptors and events)

應用程序能夠響應Hibernate內部產(chǎn)生的特定事件是非常有用的。這樣就允許實(shí)現某些通用的功能以及允許對Hibernate功能進(jìn)行擴展。

13.1. 攔截器(Interceptors)

Interceptor接口提供了從會(huì )話(huà)(session)回調(callback)應用程序(application)的機制,這種回調機制可以允許應用程序在持久化對象被保存、更新、刪除或是加載之前,檢查并(或)修改其屬性。一個(gè)可能的用途,就是用來(lái)跟蹤審核(auditing)信息。例如:下面的這個(gè)攔截器,會(huì )在一個(gè)實(shí)現了Auditable接口的對象被創(chuàng )建時(shí)自動(dòng)地設置createTimestamp屬性,并在實(shí)現了Auditable接口的對象被更新時(shí),同步更新lastUpdateTimestamp屬性。

package org.hibernate.test;

import java.io.Serializable;
import java.util.Date;
import java.util.Iterator;

import org.hibernate.Interceptor;
import org.hibernate.type.Type;

public class AuditInterceptor implements Interceptor, Serializable {

private int updates;
private int creates;

public void onDelete(Object entity,
Serializable id,
Object[] state,
String[] propertyNames,
Type[] types) {
// do nothing
}

public boolean onFlushDirty(Object entity,
Serializable id,
Object[] currentState,
Object[] previousState,
String[] propertyNames,
Type[] types) {

if ( entity instanceof Auditable ) {
updates++;
for ( int i=0; i < propertyNames.length; i++ ) {
if ( "lastUpdateTimestamp".equals( propertyNames[i] ) ) {
currentState[i] = new Date();
return true;
}
}
}
return false;
}

public boolean onLoad(Object entity,
Serializable id,
Object[] state,
String[] propertyNames,
Type[] types) {
return false;
}

public boolean onSave(Object entity,
Serializable id,
Object[] state,
String[] propertyNames,
Type[] types) {

if ( entity instanceof Auditable ) {
creates++;
for ( int i=0; i<propertyNames.length; i++ ) {
if ( "createTimestamp".equals( propertyNames[i] ) ) {
state[i] = new Date();
return true;
}
}
}
return false;
}

public void postFlush(Iterator entities) {
System.out.println("Creations: " + creates + ", Updates: " + updates);
}

public void preFlush(Iterator entities) {
updates=0;
creates=0;
}

...

}

創(chuàng )建會(huì )話(huà)(session)的時(shí)候可以指定攔截器。

Session session = sf.openSession( new AuditInterceptor() );

你也可以使用Configuration來(lái)設置一個(gè)全局范圍的攔截器。

new Configuration().setInterceptor( new AuditInterceptor() );

13.2. 事件系統(Event system)

如果需要響應持久層的某些特殊事件,你也可以使用Hibernate3的事件框架。該事件系統可以用來(lái)替代攔截器,也可以作為攔截器的補充來(lái)使用。

基本上,Session接口的每個(gè)方法都有相對應的事件。比如LoadEvent,FlushEvent,等等(查閱XML配置文件的DTD,以及org.hibernate.event包來(lái)獲得所有已定義的事件的列表)。當某個(gè)方法被調用時(shí),Hibernate Session會(huì )生成一個(gè)相對應的事件并激活所有配置好的事件監聽(tīng)器。系統預設的監聽(tīng)器實(shí)現的處理過(guò)程就是被監聽(tīng)的方法要做的(被監聽(tīng)的方法所做的其實(shí)僅僅是激活監聽(tīng)器,“實(shí)際”的工作是由監聽(tīng)器完成的)。不過(guò),你可以自由地選擇實(shí)現一個(gè)自己定制的監聽(tīng)器(比如,實(shí)現并注冊用來(lái)處理處理LoadEventLoadEventListener接口),來(lái)負責處理所有的調用Sessionload()方法的請求。

監聽(tīng)器應該被看作是單例(singleton)對象,也就是說(shuō),所有同類(lèi)型的事件的處理共享同一個(gè)監聽(tīng)器實(shí)例,因此監聽(tīng)器不應該保存任何狀態(tài)(也就是不應該使用成員變量)。

用戶(hù)定制的監聽(tīng)器應該實(shí)現與所要處理的事件相對應的接口,或者從一個(gè)合適的基類(lèi)繼承(甚至是從Hibernate自帶的默認事件監聽(tīng)器類(lèi)繼承,為了方便你這樣做,這些類(lèi)都被聲明成non-final的了)。用戶(hù)定制的監聽(tīng)器可以通過(guò)編程使用Configuration對象來(lái)注冊,也可以在Hibernate的XML格式的配置文件中進(jìn)行聲明(不支持在Properties格式的配置文件聲明監聽(tīng)器)。下面是一個(gè)用戶(hù)定制的加載事件(load event)的監聽(tīng)器:

public class MyLoadListener extends DefaultLoadEventListener {
// this is the single method defined by the LoadEventListener interface
public Object onLoad(LoadEvent event, LoadEventListener.LoadType loadType)
throws HibernateException {
if ( !MySecurity.isAuthorized( event.getEntityClassName(), event.getEntityId() ) ) {
throw MySecurityException("Unauthorized access");
}
return super.onLoad(event, loadType);
}
}

你還需要修改一處配置,來(lái)告訴Hibernate以使用選定的監聽(tīng)器來(lái)替代默認的監聽(tīng)器。

<hibernate-configuration>
<session-factory>
...
<listener type="load" class="MyLoadListener"/>
</session-factory>
</hibernate-configuration>

看看用另一種方式,通過(guò)編程的方式來(lái)注冊它。

Configuration cfg = new Configuration();
cfg.getSessionEventListenerConfig().setLoadEventListener( new MyLoadListener() );

通過(guò)在XML配置文件聲明而注冊的監聽(tīng)器不能共享實(shí)例。如果在多個(gè)<listener/>節點(diǎn)中使用了相同的類(lèi)的名字,則每一個(gè)引用都將會(huì )產(chǎn)生一個(gè)獨立的實(shí)例。如果你需要在多個(gè)監聽(tīng)器類(lèi)型之間共享監聽(tīng)器的實(shí)例,則你必須使用編程的方式來(lái)進(jìn)行注冊。

為什么我們實(shí)現了特定監聽(tīng)器的接口,在注冊的時(shí)候還要明確指出我們要注冊哪個(gè)事件的監聽(tīng)器呢?這是因為一個(gè)類(lèi)可能實(shí)現多個(gè)監聽(tīng)器的接口。在注冊的時(shí)候明確指定要監聽(tīng)的事件,可以讓啟用或者禁用對某個(gè)事件的監聽(tīng)的配置工作簡(jiǎn)單些。

13.3. Hibernate的聲明式安全機制

通常,Hibernate應用程序的聲明式安全機制由會(huì )話(huà)外觀(guān)層(session facade)所管理?,F在,Hibernate3允許某些特定的行為由JACC進(jìn)行許可管理,由JAAS進(jìn)行授權管理。本功能是一個(gè)建立在事件框架之上的可選的功能。

首先,你必須要配置適當的事件監聽(tīng)器(event listener),來(lái)激活使用JAAS管理授權的功能。

<listener type="pre-delete" class="org.hibernate.secure.JACCPreDeleteEventListener"/>
<listener type="pre-update" class="org.hibernate.secure.JACCPreUpdateEventListener"/>
<listener type="pre-insert" class="org.hibernate.secure.JACCPreInsertEventListener"/>
<listener type="pre-load" class="org.hibernate.secure.JACCPreLoadEventListener"/>

接下來(lái),仍然在hibernate.cfg.xml文件中,綁定角色的權限:

<grant role="admin" entity-name="User" actions="insert,update,read"/>
<grant role="su" entity-name="User" actions="*"/>

這些角色的名字就是你的JACC provider所定義的角色的名字。

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
Hibernate 的工具類(lèi)
Hibernate回調與攔截機制
Hibernate 攔截器
Hibernate 通用的添加實(shí)體方法
Struts2攔截器和監聽(tīng)器
servlet,過(guò)濾器,監聽(tīng)器,攔截器的區別
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久