Как переопределить Session.save () в Hibernate? - PullRequest
0 голосов
/ 20 июня 2019

Я хотел бы внедрить на все сессии.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);
       }
}

И затем всякий раз, когда я получаю сеанс, я должен получить свой пользовательский объект сеанса

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

Я не мог найти, как это сделать с помощью спящего режима.И две основные вещи, которые я пропускаю

  • org.hibernate.Session - это интерфейс, а org.hibernate.impl.SessionImpl - это фактическая реализация.Но в этом случае сеанс реализован
  • Как сообщить hibernate, что это наша пользовательская реализация сеанса, и это должно использоваться фабрикой сеансов

Пожалуйстапролить мне немного света на то, что мне не хватает.Спасибо за любую помощь.

PS: я могу сделать это с aspectj, но не хочу по многим причинам.

Ответы [ 2 ]

2 голосов
/ 20 июня 2019

Я лично не буду отменять сессию, но буду использовать аннотацию JPA @PreUpdate и @ PrePersist.

Таким образом, вы напрямую модифицируете необходимый объект, возможно, и абстрактный класс, содержащий «val», если вам это нужно для многих классов.

Таким образом, вам не придется использовать «instanceof» и делать код сущностей более читабельным.

0 голосов
/ 24 июня 2019

С помощью подсказки ответа @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);
    }
}

Уведомление hibernate о нашем перехватчике может быть сделано двумя способами

  • Session Scope - применяется только к созданному сеансу
Session session = sf.openSession( new MyHbnInterceptor() );
  • Область фабрики сеансов - применяется ко всем сеансам, созданным фабрикой сеансов
new Configuration().setInterceptor( new MyHbnInterceptor() );

Узнайте больше в этой ссылке .

Ура!

...