मैं हाइबरनेट को 3 से 4 में अपग्रेड करने और कई मुद्दों पर चलने की कोशिश कर रहा हूं। यहाँ एक विन्यास है जो हमारे पास v3 के लिए था।

  @Bean
  public LocalSessionFactoryBean sessionFactory(DataSource datasource) {
    LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
    sessionFactory.setDataSource(datasource);
    sessionFactory.setPackagesToScan("com.company.hs.service");
    sessionFactory.setHibernateProperties(hibernateProperties());
    return sessionFactory;
  }

  @Bean
  public HibernateTransactionManager transactionManager(SessionFactory sessionFactory) {
    HibernateTransactionManager transactionManager = new HibernateTransactionManager();
    transactionManager.setSessionFactory(sessionFactory);
    return transactionManager;
  }


  private Properties hibernateProperties() {
    Properties properties = new Properties();
    properties.put("hibernate.dialect", "com.company.hs.service.hibernate.MySQL5InnoDBIndexDialect");
    properties.put("hibernate.show_sql", Boolean.TRUE.toString());
    properties.put("hibernate.generate_statistics", Boolean.FALSE.toString());

    properties.put("transaction.factory_class", "org.hibernate.transaction.JTATransactionFactory");
    properties.put("transaction.manager_lookup_class", "org.hibernate.transaction.JBossTransactionManagerLookup");

    properties.put("hibernate.cache.use_query_cache", Boolean.TRUE.toString());
    properties.put("hibernate.cache.use_second_level_cache", Boolean.TRUE.toString());

    return properties;
   }

डिपेंडेंसी वर्जन और क्लास पैकेज को अपग्रेड करने के बाद, मैं एप्लिकेशन को कंपाइल और स्टार्ट करने में सक्षम था।

लेकिन फिर, डीबी के खिलाफ किसी भी लेखन ऑपरेशन को निष्पादित करने का प्रयास करने के बाद मुझे निम्न त्रुटि मिल रही है:

org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read-only mode (FlushMode.MANUAL): Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' marker from transaction definition.

बहुत सारी जानकारी पर शोध करने के बाद, ऐसा लगता है कि इसके बारे में जाने के लिए कई विकल्प हैं।

विकल्प 1: मैं वैश्विक स्तर पर FlushMode को हाइबरनेट 4.3.5 के लिए कैसे सेट कर सकता हूं। स्प्रिंग 4.0.6 के साथ फाइनल?

हालांकि यह मदद करता प्रतीत होता है, ऐप व्यवहार में बदलाव होने पर कई किनारे के मामले हैं (यानी HIbernateTemplate की विधि persist @GeneratedValue(strategy = GenerationType.IDENTITY) का उपयोग करते समय इकाई आईडी को अपडेट नहीं करती है, इसलिए इसके बजाय हमें save का उपयोग करना होगा। तरीका)। और सामान्य तौर पर, अन्य दुष्प्रभावों के बारे में चिंतित हैं क्योंकि ऐसा लगता है कि लेनदेन प्रबंधन यहां ठीक से नहीं लगा है।

विकल्प 2: जैसा कि https://crunchtech.io/ में सुझाया गया था ब्लॉग/माइग्रेटिंग-से-हाइबरनेट-3-से-4-साथ/ JTATransactionFactory का उपयोग करने के बजाय हम CMTTransactionFactory पर स्विच कर सकते हैं। ऐसा लगता है कि हम कुछ आगे बढ़ना चाहते हैं क्योंकि हम चाहते हैं कि स्प्रिंग कंटेनर लेनदेन का प्रबंधन करे। संगत स्प्रिंग जावाडॉक्स - https://docs.spring.io/spring-framework/docs/3.2.0.M1_to_3.2.0.M2/changes/docdiffs_org.springframework.orm.hibernate4.html

SQL क्वेरी निष्पादित करने का प्रयास करते समय यह विफल रहता है org.hibernate.TransactionException: Could not register synchronization for container transaction.

संदर्भ के लिए, केवल यह टुकड़ा मूल विन्यास से बदल गया है:

    properties.put("hibernate.transaction.factory_class", "org.hibernate.transaction.CMTTransactionFactory");
    properties.put("hibernate.transaction.manager_lookup_class", "org.hibernate.transaction.JBossTransactionManagerLookup");
    properties.put("hibernate.transaction.jta.platform", "org.hibernate.service.jta.platform.internal.JBossAppServerJtaPlatform");

विवादास्पद रूप से, स्प्रिंग का बग ट्रैकर पूरी तरह से विपरीत दृष्टिकोण का सुझाव देता है - https://github.com/ स्प्रिंग-प्रोजेक्ट्स/स्प्रिंग-फ्रेमवर्क/मुद्दे/15230

विकल्प 3 AOP पहलू का उपयोग करेगा जिसे DB में डेटा फ्लश करने के लिए @Transactional के आसपास निष्पादित किया जाएगा।

विकल्प 4 जेपीए का प्रयोग करें

3 और 4 की IMHO संभावना बहुत कम है।

इंटरनेट में कई उदाहरण बताते हैं कि हाइबरनेट का 3 -> 4 से माइग्रेशन टॉमकैट के लिए एक आकर्षण के रूप में काम करना चाहिए और जेबॉस/ग्लासफ़िश सर्वर में चलते समय अधिकांश समस्याएं आती हैं। दुर्भाग्य से, हम अपने आवेदन को WildFly के अंदर चलाते हैं।

इस बिंदु पर, मैं इस पर किसी भी इनपुट की सराहना करता हूं। सामान्य उपयोग प्रतिमान क्या है, इस प्रश्न से शुरू करते हुए, शायद यहां उल्लिखित विकल्प पूरी तरह से बंद हैं और हमें विभिन्न तंत्र का उपयोग करने की आवश्यकता है। या हम कॉन्फ़िगरेशन के कुछ महत्वपूर्ण भाग को याद कर रहे हैं।

संबंधित निर्भरता संस्करण

Spring - 4.0.5.RELEASE
Hibernate - 4.2.12.Final
WildFly - 18.0.1
1
alex_bondar 28 सितंबर 2020, 20:46

1 उत्तर

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

मैंने इसे स्प्रिंग 4 हाइबरनेट 5 के साथ काम करने का प्रबंधन किया जो वाइल्डफ्लाई के भीतर चल रहा था OpenSessionInViewFilter को अनुकूलित कर रहा था या कंटेनर-विशिष्ट प्रोपरीज (जैसे hibernate.transaction.factory_class या hibernate.transaction.manager_lookup_class) निर्दिष्ट कर रहा था। सफलता की कुंजी थी @Transactional एनोटेशन का उचित उपयोग और थोड़ी-सी ट्विकिंग क्वेरी।

इससे भी अधिक, मेरे परीक्षण ऐप में जेटीए लेनदेन गुणों को सक्षम करना (जैसे निर्धारित यहां) रनटाइम अपवादों पर गलत रोलबैक जैसे साइड इफेक्ट का कारण बना। ये वे गुण हैं जिनका उपयोग मैं इसे सक्षम करने के लिए कर रहा था:

properties.put("hibernate.transaction.jta.platform", "JBossAS");
properties.put("hibernate.transaction.coordinator_class", "jta");

वही कोड w/o ये निर्दिष्ट रोलबैक सभी मध्यवर्ती डीबी प्रविष्टियों को अपेक्षित के रूप में निर्दिष्ट किया जा रहा है। अभी तक नहीं पता था कि ऐसा क्यों है, लेकिन हमारे लिए पहली बार में जेटीए लेनदेन का उपयोग करने का कोई अच्छा कारण नहीं है।

0
alex_bondar 8 अक्टूबर 2020, 07:19