<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                # 12.2\. 事件系統(Event system) 如果需要響應持久層的某些特殊事件,你也可以使用Hibernate3的事件框架。 該事件系統可以用來替代攔截器,也可以作為攔截器的補充來使用。 基本上,`Session`接口的每個方法都有相對應的事件。比如 `LoadEvent`,`FlushEvent`,等等(查閱XML配置文件 的DTD,以及`org.hibernate.event`包來獲得所有已定義的事件的列表)。當某個方 法被調用時,Hibernate `Session`會生成一個相對應的事件并激活所 有配置好的事件監聽器。系統預設的監聽器實現的處理過程就是被監聽的方法要做的(被監聽的方法所做的其實僅僅是激活監聽器, “實際”的工作是由監聽器完成的)。不過,你可以自由地選擇實現 一個自己定制的監聽器(比如,實現并注冊用來處理處理`LoadEvent`的`LoadEventListener`接口), 來負責處理所有的調用`Session`的`load()`方法的請求。 監聽器應該被看作是單例(singleton)對象,也就是說,所有同類型的事件的處理共享同一個監聽器實例,因此監聽器 不應該保存任何狀態(也就是不應該使用成員變量)。 用戶定制的監聽器應該實現與所要處理的事件相對應的接口,或者從一個合適的基類繼承(甚至是從Hibernate自帶的默認事件監聽器類繼承, 為了方便你這樣做,這些類都被聲明成non-final的了)。用戶定制的監聽器可以通過編程使用`Configuration`對象 來注冊,也可以在Hibernate的XML格式的配置文件中進行聲明(不支持在Properties格式的配置文件聲明監聽器)。 下面是一個用戶定制的加載事件(load event)的監聽器: ``` public class MyLoadListener implements LoadEventListener { // this is the single method defined by the LoadEventListener interface public void onLoad(LoadEvent event, LoadEventListener.LoadType loadType) throws HibernateException { if ( !MySecurity.isAuthorized( event.getEntityClassName(), event.getEntityId() ) ) { throw MySecurityException("Unauthorized access"); } } } ``` 你還需要修改一處配置,來告訴Hibernate,除了默認的監聽器,還要附加選定的監聽器。 ``` <hibernate-configuration> <session-factory> ... <event type="load"> <listener class="com.eg.MyLoadListener"/> <listener class="org.hibernate.event.def.DefaultLoadEventListener"/> </event> </session-factory> </hibernate-configuration> ``` 看看用另一種方式,通過編程的方式來注冊它。 ``` Configuration cfg = new Configuration(); LoadEventListener[] stack = { new MyLoadListener(), new DefaultLoadEventListener() }; cfg.EventListeners().setLoadEventListeners(stack); ``` 通過在XML配置文件聲明而注冊的監聽器不能共享實例。如果在多個`&lt;listener/&gt;`節點中使用 了相同的類的名字,則每一個引用都將會產生一個獨立的實例。如果你需要在多個監聽器類型之間共享 監聽器的實例,則你必須使用編程的方式來進行注冊。 為什么我們實現了特定監聽器的接口,在注冊的時候還要明確指出我們要注冊哪個事件的監聽器呢? 這是因為一個類可能實現多個監聽器的接口。在注冊的時候明確指定要監聽的事件,可以讓啟用或者禁用對某個事件的監聽的配置工作簡單些。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看