अब, मैं अपने एप्लिकेशन को स्प्रिंग हाइबरनेट 3 से 5 तक अपग्रेड करना चाहता हूं

हाइबरनेट 3 के तहत, मैं एक पोस्ट-COMMIT-INSERT | अद्यतन | नीचे की तरह ईवेंट श्रोता हटाएं

<bean id="mySessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="dataSource" ref="myDataSource" />
    <property name="annotatedClasses">
        <list>
            ....
        </list>
    </property>
    <property name="hibernateProperties">
        <props>
            ....
        </props>
    </property>
    <property name="eventListeners">
        <map>
            <entry key="post-commit-insert">
                <bean class="xxxx.AuditLogPostInsertEventListener" />
            </entry>
            <entry key="post-commit-update">
                <bean class="xxxx.AuditLogPostUpdateEventListener" />
            </entry>
            <entry key="post-commit-delete">
                <bean class="xxxx.AuditLogPostDeleteEventListener" />
            </entry>
        </map>
    </property>
</bean>

अब, मैं हाइबरनेट 5 के तहत इवेंट श्रोता बनाने की कोशिश करता हूं, लेकिन सफलता नहीं

<bean id="mySessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
    <property name="dataSource" ref="myDataSource" />
    <property name="annotatedClasses">
        <list>
            ...
        </list>
    </property>
    <property name="hibernateProperties">
        <props>
            ...
        </props>
    </property>
    <property name="eventListeners">
        <map>
            <entry key="post-commit-insert">
                <bean class="xxxx.AuditLogPostInsertEventListener" />
            </entry>
            <entry key="post-commit-update">
                <bean class="xxxx.AuditLogPostUpdateEventListener" />
            </entry>
            <entry key="post-commit-delete">
                <bean class="xxxx.AuditLogPostDeleteEventListener" />
            </entry>
        </map>
    </property>
</bean>

निम्नलिखित संदेश दिखाया गया था

बीन वर्ग [org.springframework.orm.hibernate5.LocalSessionFactoryBean] की अमान्य संपत्ति 'eventListeners': बीन संपत्ति 'eventListeners' लिखने योग्य नहीं है या एक अमान्य सेटर विधि है। क्या सेटर का पैरामीटर प्रकार गेटर के रिटर्न प्रकार से मेल खाता है?

मैंने इस स्टैक ओवरफ्लो का पालन करने की कोशिश की लेकिन फिर भी सफलता नहीं मिली।

हाइबरनेट में प्रीइंसर्ट और प्रीअपडेट इवेंट श्रोता

मैंने नीचे की तरह कॉन्फिगरेशन बदल दिया लेकिन फिर भी सफलता नहीं मिली

<bean id="auditInterceptor" class="xxxx.EntityEventListenerRegistry" />

<bean id="mySessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
    <property name="dataSource" ref="myDataSource" />
    <property name="annotatedClasses">
        <list>
            ...
        </list>
    </property>
    <property name="hibernateProperties">
        <props>
            ...
        </props>
    </property>
    <property name="entityInterceptor" ref="xxxx.EntityEventListenerRegistry" />
</bean>
6
leonlai 15 अगस्त 2018, 10:58
Hk.gov.ehr.server.EntityEventListenerRegistry को org.hibernate.Interceptor लागू करना चाहिए। क्या ऐसा हुआ है?
 – 
bungrudi
15 अगस्त 2018, 12:35
हां! आप सही हैं। आपकी सहायताके लिए धन्यवाद! साथ ही, अगर मैं इस स्टैक ओवरफ्लो की तरह PostInsertEventListener को पंजीकृत करना चाहता हूं तो मैं क्या कर सकता हूं? stackoverflow.com/questions/20368551 /…
 – 
leonlai
15 अगस्त 2018, 18:18
एक और प्रश्न बनाएं और मैं मदद करूंगा;)
 – 
bungrudi
16 अगस्त 2018, 11:13

4 जवाब

सबसे बढ़िया उत्तर

मेरी टिप्पणी के अनुसार, इंटरसेप्टर को org.hibernate.Interceptor को लागू करने की आवश्यकता है।

1
bungrudi 16 अगस्त 2018, 11:11

हाइबरनेट निकाय श्रोताओं को सेट करने का सबसे पोर्टेबल तरीका org.hibernate.integrator.spi.Integrator है। इस तरह, आप इसे JpaTransactionManager और HibernateTransactionManager दोनों के लिए काम कर सकते हैं।

Integrator इंटरफ़ेस लागू करना

आपको Integrator को निम्नानुसार लागू करने की आवश्यकता है:

public class ReplicationEventListenerIntegrator 
        implements Integrator {
 
    public static final ReplicationEventListenerIntegrator INSTANCE = 
        new ReplicationEventListenerIntegrator();
 
    @Override
    public void integrate(
            Metadata metadata,
            SessionFactoryImplementor sessionFactory,
            SessionFactoryServiceRegistry serviceRegistry) {
 
        final EventListenerRegistry eventListenerRegistry =
                serviceRegistry.getService(EventListenerRegistry.class);
 
        eventListenerRegistry.appendListeners(
            EventType.POST_INSERT, 
            ReplicationInsertEventListener.INSTANCE
        );
         
        eventListenerRegistry.appendListeners(
            EventType.POST_UPDATE, 
            ReplicationUpdateEventListener.INSTANCE
        );
         
        eventListenerRegistry.appendListeners(
            EventType.PRE_DELETE, 
            ReplicationDeleteEventListener.INSTANCE
        );
    }
 
    @Override
    public void disintegrate(
            SessionFactoryImplementor sessionFactory,
            SessionFactoryServiceRegistry serviceRegistry) {
 
    }
}

eventListenerRegistry के माध्यम से, आप ईवेंट श्रोताओं को पंजीकृत कर सकते हैं।

hibernate.integrator_provider कॉन्फ़िगरेशन गुण सेट करना

एक बार कर लेने के बाद, आपको hibernate.integrator_provider कॉन्फ़िगरेशन गुण सेट करना होगा।

  1. यदि आप एक persistence.xml कॉन्फ़िगरेशन फ़ाइल का उपयोग कर रहे हैं, तो आप इस तरह की संपत्ति सेट कर सकते हैं:

     <property name="hibernate.integrator_provider"
               value="com.vladmihalcea.book.hpjp.hibernate.listener.ReplicationEventListenerIntegrator"
     />
    
  2. या, यदि आप स्प्रिंग बूट का उपयोग करते हैं, तो आप इस गुण को application.properties के माध्यम से इस प्रकार कॉन्फ़िगर कर सकते हैं:

     spring.jpa.properties.hibernate.integrator_provider=com.vladmihalcea.book.hpjp.hibernate.listener.ReplicationEventListenerIntegrator
    
7
Vlad Mihalcea 10 जिंदा 2021, 11:05
1
आपको धन्यवाद! और स्प्रिंग बूट 2.0.0 के लिए एक संकेत: आप कॉन्फ़िगरेशन गुण सेट करने के लिए HibernatePropertiesCustomizer का उपयोग कर सकते हैं - देखें stackoverflow.com/a /51522146/3271406
 – 
lu_ko
31 पद 2018, 19:41
@lu_ko के लिए यश मैंने उनके रेपो को फोर्क किया है और एक उदाहरण के रूप में उपरोक्त प्रतिक्रिया को जोड़ा है कि कैसे स्प्रिंगबूट v2 में घटनाओं को पंजीकृत किया जाए github.com/ivarprudnikov/…
 – 
Ivar
9 जिंदा 2020, 21:50

जैसा कि मैंने किया था, आप जावा क्लास का उपयोग करके हाइबरनेट इवेंट लिस्टनर भी पंजीकृत कर सकते हैं।

कृपया इसे जांचें। यह आपकी मदद कर सकता है।

1) इंटीग्रेटर के साथ इवेंट लिस्टनर पंजीकृत करें।

    @Override
   public void integrate(Metadata metadata, SessionFactoryImplementor 
         sessionFactory, SessionFactoryServiceRegistry serviceRegistry) 
   {

      EventListenerRegistry eventListenerRegistry = 
            serviceRegistry.getService(EventListenerRegistry.class);

     /* eventListenerRegistry.getEventListenerGroup(EventType.SAVE)
                     .appendListener(new SaveUpdateEventListenerImp());*/

      eventListenerRegistry.getEventListenerGroup(EventType.SAVE_UPDATE)
      .appendListener(new SaveUpdateEventListenerImp());

      eventListenerRegistry.getEventListenerGroup(EventType.LOAD)
                     .appendListener(new LoadEventListenerImp());

      eventListenerRegistry.getEventListenerGroup(EventType.REFRESH)
                     .appendListener(new RefreshEventListenerImp());
   }

2) हम यहां से LoadEventListener चेक कर सकते हैं। बस LoadEventListener लागू करता है। जब आप डीबी से बुक इकाई लोड करते हैं तो LoadEventListener कॉल करेगा।

  public class LoadEventListenerImp implements LoadEventListener {

   private static final long serialVersionUID = 1L;
   private static Logger logger = LogManager.getLogger(LoadEventListenerImp.class);

   @Override
   public void onLoad(LoadEvent e, LoadType type) throws HibernateException {
      logger.info("onLoad is called.");
      Object obj = e.getResult();
      if (obj instanceof Book) {
         Book book = (Book) obj;
         logger.info("Book on load event {} " , book);
      }
   }
1
Angad Bansode 16 अगस्त 2018, 15:03

अंत में, मैंने यह कोशिश की और ठीक काम किया।

@Component
public class EntityEventListenerRegistry {

    @Autowired
    private SessionFactory sessionFactory;

    @Autowired
    private AuditLogPostInsertEventListener auditLogPostInsertEventListener;

    @Autowired
    private AuditLogPostUpdateEventListener auditLogPostUpdateEventListener;

    @Autowired
    private AuditLogPostDeleteEventListener auditLogPostDeleteEventListener;

    @PostConstruct
    public void registerListeners() {
        EventListenerRegistry registry = ((SessionFactoryImpl) sessionFactory).getServiceRegistry().getService(EventListenerRegistry.class);
        registry.getEventListenerGroup(EventType.POST_COMMIT_INSERT).appendListener(auditLogPostInsertEventListener);
        registry.getEventListenerGroup(EventType.POST_COMMIT_UPDATE).appendListener(auditLogPostUpdateEventListener);
        registry.getEventListenerGroup(EventType.POST_COMMIT_DELETE).appendListener(auditLogPostDeleteEventListener);
    }
}
0
Matthew Read 23 सितंबर 2019, 19:27