簡體   English   中英

如何在Hibernate中覆蓋Session.save()?

[英]How to Override Session.save() in Hibernate?

我想在所有session.save()上注入以下內容。

public class MyHbnSession implements Session {

       @Override
       public Serializable save(Object obj) throws HibernateException {
           if(obj instanceof MyClass) {
               MyClass mc = (MyClass) obj;
               mc.setVal("Injected Prop");
           }
           return super.save(obj);
       }
}

然后每當我getSession我應該收到我的自定義會話對象

MyHbnSession session = HibernateUtil.getSessionFactory().openSession();

我找不到如何用休眠方式執行此操作。 我想念的兩件事

  • org.hibernate.Session是一個接口,而org.hibernate.impl.SessionImpl是實際的實現。 但是在這種情況下 ,會話已實現
  • 如何告訴休眠這是我們的自定義會話實現,會話工廠應使用它

請讓我了解我所缺少的。 謝謝你的幫助。

PS:我可以使用Aspectj做到這一點,但是由於許多原因,我不想這么做。

我個人不會覆蓋會話,而是使用JPA注釋@PreUpdate和@PrePersist。

這樣,您可以直接修改所需的對象,如果需要多個類,則可以直接修改包含“ val”的抽象類。

這樣,您將不必使用“ instanceof”並使實體的代碼更具可讀性。

借助@pdem答案提示和這篇文章,我能夠解決問題。 這是我所做的要點。

攔截器實現

import java.io.Serializable;

import org.hibernate.EmptyInterceptor;
import org.hibernate.type.Type;

public class MyHbnInterceptor extends EmptyInterceptor {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    @Override
    public boolean onSave(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) {
        if(entity instanceof MyClass) {
            // TODO: Do your operations here
        }
        return super.onSave(entity, id, state, propertyNames, types);
    }
}

可以通過兩種方式讓休眠狀態有關我們的攔截器

  • 會話范圍-僅適用於創建的會話
 Session session = sf.openSession( new MyHbnInterceptor() ); 
  • 會話工廠范圍-適用於會話工廠創建的所有會話
 new Configuration().setInterceptor( new MyHbnInterceptor() ); 

此鏈接中了解更多信息。

干杯!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM