CUBA 7: नया क्या है?


तीन साल पहले, हमने सीयूबीए 6 जारी करने की घोषणा की। वह संस्करण क्रांतिकारी बन गया: एक बंद मालिकाना लाइसेंस के बजाय, हमने अपाचे 2.0 लाइसेंस के तहत, फ्रेमवर्क को स्वतंत्र रूप से वितरित करना शुरू कर दिया। उस समय, हम यह भी नहीं सोच सकते थे कि यह लंबे समय में ढांचे के विकास को कैसे प्रभावित करेगा। सीयूबीए समुदाय तेजी से बढ़ने लगा, और हम ढांचे का उपयोग करने के सभी संभव (और कभी-कभी असंभव) तरीकों के पार आए। अब हम CUBA 7 की शुरुआत कर रहे हैं। हम आशा करते हैं कि यह संस्करण समुदाय के सभी सदस्यों के लिए विकास को और भी आसान और सुखद बना देगा: शुरुआती लोगों से जो अभी-अभी CUBA और जावा से परिचित हैं, अनुभवी डेवलपर्स के लिए जिनके पास एक बड़ी कंपनी के स्तर पर एक से अधिक पूर्ण परियोजनाएं हैं।


विकास के उपकरण


CUBA की सफलता का एक महत्वपूर्ण हिस्सा, हम CUBA स्टूडियो का श्रेय देते हैं। इस विकास के वातावरण ने प्रत्येक जावा प्रोजेक्ट में किए जाने वाले विशिष्ट कार्यों के कार्यान्वयन को बहुत सरल कर दिया है, जिससे वे दृश्य डिजाइनरों में सरल कॉन्फ़िगरेशन बनाने के लिए कम हो गए हैं। संपूर्ण और सुविधा संपन्न CRUD एप्लिकेशन को विकसित करने के लिए आपको सभी Persistence API एनोटेशन विशेषताओं, ग्रेड सिंटैक्स या स्प्रिंग कॉन्फ़िगरेशन की बारीकियों को जानने की आवश्यकता नहीं है - CUBA स्टूडियो विशिष्ट कोड बनाने का ध्यान रखता है।



स्टूडियो एक अलग वेब एप्लिकेशन था, जिसके कारण कई महत्वपूर्ण सीमाएँ थीं:


  • सबसे पहले, स्टूडियो एक पूर्ण आईडीई नहीं था, इसलिए डेवलपर्स को व्यापार तर्क विकसित करने के लिए स्टूडियो और इंटेलीज आईडीईए या ग्रहण के बीच स्विच करना पड़ा और साथ ही साथ सुविधाजनक नेविगेशन, कोड पूरा होने और अन्य आवश्यक चीजों का उपयोग करना था, जो कुछ हद तक कष्टप्रद था।
  • दूसरे, यह सभी जादुई सादगी काम की एक बड़ी मात्रा पर बनाई गई थी जिसे हमने स्रोत कोड को पार्स करने और उत्पन्न करने के लिए एल्गोरिदम लिखने पर खर्च किया था। और भी अधिक उन्नत कार्यक्षमता को लागू करने का मतलब होगा एक पूर्ण IDE के विकास के लिए आगे बढ़ना - हमारे लिए एक महत्वाकांक्षी उपक्रम।

हमने इन सीमाओं को पार करने के लिए एक और विशाल पर भरोसा करने का फैसला किया और IntelliJ IDEA पर आधारित स्टूडियो का निर्माण किया। अब आप स्टूडियो को स्टैंडअलोन एप्लिकेशन (IntelliJ IDEA बंडल), और IDEA के प्लग-इन के रूप में स्थापित कर सकते हैं।



और इससे हमें नए अवसर मिलते हैं:


  • अन्य JVM भाषाओं के लिए समर्थन (और, सबसे ऊपर, कोटलिन)
  • सुपीरियर हॉट तैनात
  • सहज प्रोजेक्ट-वाइड नेविगेशन
  • होशियार संकेत और कोड जनरेटर

वर्तमान में, हम सक्रिय रूप से स्टूडियो का एक नया संस्करण विकसित कर रहे हैं - हम पुराने संस्करण से कार्यक्षमता स्थानांतरित करते हैं और इंटेलीज प्लेटफॉर्म की कार्यक्षमता का उपयोग करके नई चीजें जोड़ते हैं। निकट भविष्य में - IntelliJ घटकों के लिए CUBA- विशिष्ट संपादकों का अनुवाद और परियोजना कोड के माध्यम से नेविगेशन में सुधार।


प्रौद्योगिकी स्टैक अपडेट


परंपरा से, सीयूबीए के मूल में प्रौद्योगिकी स्टैक को नए संस्करणों में अपडेट किया गया है: जावा 8/11, वाडिन 8, स्प्रिंग 5।


डिफ़ॉल्ट रूप से, नई परियोजनाएं जावा 8 का उपयोग करती हैं, लेकिन आप निम्न कोड को बिल्ड.ग्रेड फ़ाइल में जोड़कर जावा के संस्करण को निर्दिष्ट कर सकते हैं:


subprojects { sourceCompatibility = JavaVersion.VERSION_11 targetCompatibility = JavaVersion.VERSION_11 } 

विशेष रूप से एक बड़ी समस्या वाडिन 8 का उन्नयन था, जिसमें डेटा बाइंडिंग एपीआई बहुत बदल गया है। सौभाग्य से, सीयूबीए वैदीन के आंतरिक घटकों से डेवलपर्स को अपने स्वयं के एपीआई में लपेटकर ढाल देता है। सीयूबीए टीम ने सीयूबीए एपीआई को बदले बिना आंतरिक घटकों को अपडेट करने का एक बड़ा काम किया। इसका मतलब यह है कि संगतता पूरी तरह से संरक्षित है, और आप परियोजना के सीयूबीए 7 में माइग्रेट करने के तुरंत बाद, वैडिन 8 की सभी नई सुविधाओं का लाभ उठा सकते हैं, बिना किसी रिफैक्टिंग के।


अद्यतन निर्भरताओं की एक पूरी सूची परिवर्तन सूची में उपलब्ध है।


नई स्क्रीन एपीआई


इस खंड को "पहली स्क्रीन एपीआई" कहा जा सकता है, क्योंकि CUBA के पास वेब क्लाइंट मॉड्यूल में आधिकारिक तौर पर घोषित स्क्रीन एपीआई कभी नहीं था। यह ऐतिहासिक रूप से हुआ, कुछ मान्यताओं के कारण जो प्रारंभिक चरण में उत्पन्न हुई:


  • एक घोषणात्मक रूप से उन्मुख दृष्टिकोण - जो सब कुछ वर्णित किया जा सकता है उसे स्क्रीन डिस्क्रिप्टर में घोषित किया जाना था, और नियंत्रक कोड में नहीं।
  • मानक स्क्रीन (ब्राउज़र और संपादक) ने एक निश्चित सामान्य कार्यक्षमता प्रदान की, और इसे बदलने की कोई आवश्यकता नहीं थी।


जब तक पहले हजार सदस्य हमारे समुदाय में शामिल हुए, तब तक हमने महसूस किया कि "मानक" CRUD स्क्रीन पर कितनी अलग-अलग आवश्यकताएं हैं। और ये सभी आवश्यकताएं प्रारंभिक कार्यक्षमता से परे थीं। हालांकि, लंबे समय तक हम एपीआई को बदले बिना एटिपिकल स्क्रीन व्यवहार को लागू करने के अनुरोधों को संतुष्ट कर सकते हैं - प्रारंभिक चरण में एक और वास्तुशिल्प सिद्धांत के लिए धन्यवाद: ओपन इनहेरिटेंस। वास्तव में, ओपन इनहेरिटेंस का अर्थ है कि आप अपनी आवश्यकताओं के अनुसार अपने व्यवहार को अनुकूलित करने के लिए मुख्य वर्ग की किसी भी सार्वजनिक या संरक्षित पद्धति को फिर से लिख सकते हैं। यह एक चमत्कारी रामबाण की तरह लग सकता है, लेकिन वास्तव में आप अल्पावधि में भी इस पर भरोसा नहीं कर सकते थे। क्या होगा यदि एक ओवरराइड विधि का नाम बदलकर, हटा दिया गया है, या फ्रेमवर्क के भविष्य के संस्करणों में कभी उपयोग नहीं किया गया है?


इसलिए बढ़ती सामुदायिक मांग के जवाब में, हमने एक नई स्क्रीन एपीआई शुरू करने का फैसला किया। यह एपीआई स्पष्ट (बिना किसी छिपे हुए जादू के) प्रदान करता है, लचीला और आसानी से उपयोग होने वाले विस्तार बिंदु जो लंबे समय तक नहीं बदलने की गारंटी है।


स्क्रीन की घोषणा


CUBA 7 में, स्क्रीन की घोषणा करना बेहद सरल है:


 @UiController("new-screen") // screen id public class NewScreen extends Screen { } 

ऊपर दिए गए उदाहरण से पता चलता है कि स्क्रीन पहचानकर्ता स्पष्ट रूप से सीधे नियंत्रक वर्ग घोषणा के ऊपर परिभाषित किया गया है। दूसरे शब्दों में, स्क्रीन आईडी और कंट्रोलर क्लास अब एक दूसरे से अनूठे तरीके से मेल खाते हैं। तो, हमारे पास कुछ अच्छी खबरें हैं: अब आप नियंत्रक प्रकार से सीधे स्क्रीन तक पहुंच सकते हैं:


 @Inject private ScreenBuilders screenBuilders; @Subscribe private void onBeforeClose(BeforeCloseEvent event) { screenBuilders.screen(this) .withScreenClass(SomeConfirmationScreen.class) .build() .show(); } 

स्क्रीन डिस्क्रिप्टर स्क्रीन का एक वैकल्पिक हिस्सा बन जाता है। एक यूआई को प्रोग्रामेटिक रूप से बनाया जा सकता है या एक एक्सएमएल स्क्रीन डिस्क्रिप्टर के रूप में घोषित किया जा सकता है, जिसे नियंत्रक वर्ग के ऊपर @UiDescriptor द्वारा परिभाषित किया गया है। यह नियंत्रक और मार्कअप को पढ़ने और समझने में बहुत आसान बनाता है - यह दृष्टिकोण एंड्रॉइड विकास में उपयोग किए जाने वाले के समान है।


पहले, वेब-स्क्रीन.एक्सएमएल फ़ाइल में स्क्रीन हैंडल को पंजीकृत करना और इसे एक पहचानकर्ता प्रदान करना भी आवश्यक था। CUBA 7 में, यह फ़ाइल संगतता उद्देश्यों के लिए सहेजी गई थी, लेकिन स्क्रीन बनाने के नए तरीके के लिए इस तरह के पंजीकरण की आवश्यकता नहीं है।


स्क्रीन जीवन चक्र


नया एपीआई सरल और स्व-व्याख्यात्मक स्क्रीन जीवनचक्र घटनाओं का परिचय देता है:


  • Init
  • AfterInit
  • BeforeShow
  • Aftershow
  • BeforeClose
  • AfterClose

आप CUBA 7 की सभी घटनाओं की सदस्यता इस प्रकार ले सकते हैं:


 @UiController("new-screen") public class NewScreen extends Screen { @Subscribe private void onInit(InitEvent event) { } @Subscribe private void onBeforeShow(BeforeShowEvent event) { } } 

पुराने दृष्टिकोण की तुलना में, नए एपीआई से पता चलता है कि हम हुक विधियों को ओवरलैप नहीं करते हैं, जो कि प्रारंभिक रूप से प्रारंभ होने पर कहा जाता है, लेकिन स्पष्ट रूप से एक विशिष्ट, विशिष्ट स्क्रीन जीवन चक्र घटना के प्रसंस्करण के लिए तर्क को परिभाषित करता है।


इवेंट हैंडलिंग और कार्यात्मक प्रतिनिधि


पिछले अनुभाग में, हमने सीखा कि जीवन चक्र की घटनाओं की सदस्यता कैसे लें, लेकिन अन्य घटकों के बारे में क्या? क्या स्क्रीन, इनीट () विधि को प्रारंभ करते समय सभी आवश्यक श्रोताओं को समान हीप में डालना आवश्यक है, क्योंकि यह संस्करण 6.x में था? नया API काफी सुसंगत है, इसलिए आप स्क्रीन के जीवन की घटनाओं की तरह ही अन्य घटनाओं के लिए भी सदस्यता ले सकते हैं।


दो यूआई तत्वों के साथ एक सरल उदाहरण पर विचार करें: एक बटन और एक निश्चित मुद्रा में धन की राशि प्रदर्शित करने के लिए एक क्षेत्र; XML डिस्क्रिप्टर इस तरह दिखेगा:


 <?xml version="1.0" encoding="UTF-8" standalone="no"?> <window xmlns="http://schemas.haulmont.com/cuba/screen/window.xsd" caption="msg://caption" messagesPack="com.company.demo.web"> <layout> <hbox spacing="true"> <currencyField id="currencyField" currency="$" currencyLabelPosition="LEFT"/> <button id="calcPriceBtn" caption="Calculate Price"/> </hbox> </layout> </window> 

जब आप बटन पर क्लिक करते हैं, तो हम बैकएंड से सेवा को कॉल करते हैं, जो एक नंबर देता है, हम इसे राशि फ़ील्ड में लिखते हैं। इस क्षेत्र को मूल्य मूल्य के आधार पर शैली को बदलना चाहिए।


 @UiController("demo_MyFirstScreen") @UiDescriptor("my-first-screen.xml") public class MyFirstScreen extends Screen { @Inject private PricingService pricingService; @Inject private CurrencyField<BigDecimal> currencyField; @Subscribe("calcPriceBtn") private void onCalcPriceBtnClick(Button.ClickEvent event) { currencyField.setValue(pricingService.calculatePrice()); } @Subscribe("currencyField") private void onPriceChange (HasValue.ValueChangeEvent<BigDecimal> event) { currencyField.setStyleName(getStyleNameByPrice(event.getValue())); } private String getStyleNameByPrice(BigDecimal price) { ... } } 

उपरोक्त उदाहरण में, हम दो इवेंट हैंडलर देखते हैं: एक को बटन दबाए जाने पर कहा जाता है, और दूसरा तब लॉन्च किया जाता है जब मुद्रा क्षेत्र अपना मूल्य बदलता है - सब कुछ सरल है।


अब कल्पना करें कि हमें मूल्य की जांच करने और यह सुनिश्चित करने की आवश्यकता है कि इसका मूल्य सकारात्मक है। यह "माथे" किया जा सकता है - स्क्रीन आरंभीकरण के दौरान एक सत्यापनकर्ता जोड़ें:


 @UiController("demo_MyFirstScreen") @UiDescriptor("my-first-screen.xml") public class MyFirstScreen extends Screen { @Inject private CurrencyField<BigDecimal> currencyField; @Subscribe private void onInit(InitEvent event) { currencyField.addValidator(value -> { if (value.compareTo(BigDecimal.ZERO) <= 0) throw new ValidationException("Price should be greater than zero"); }); } } 

वास्तविक अनुप्रयोगों में, कुछ समय बाद इनिशियलाइज़ेशन विधि इनिशियलाइज़र्स, वैलिडेटर्स, श्रोताओं आदि की गड़बड़ी होगी इस समस्या को हल करने के लिए, CUBA के पास एक उपयोगी @Install एनोटेशन है। आइए देखें कि यह हमारे मामले में कैसे मदद कर सकता है:


 @UiController("demo_MyFirstScreen") @UiDescriptor("my-first-screen.xml") public class MyFirstScreen extends Screen { @Inject private CurrencyField<BigDecimal> currencyField; @Install(to = "currencyField", subject = "validator") private void currencyFieldValidator(BigDecimal value) { if (value.compareTo(BigDecimal.ZERO) <= 0) throw new ValidationException("Price should be greater than zero"); } } 

वास्तव में, हम मुद्रा फ़ील्ड सत्यापन तर्क को स्क्रीन में CurrencyFieldValidator विधि में सौंपते हैं। यह पहली नज़र में थोड़ा जटिल लग सकता है, लेकिन डेवलपर्स आश्चर्यजनक रूप से कार्यक्षमता जोड़ने की इस पद्धति के लिए जल्दी से उपयोग करने लगे और तुरंत इसका उपयोग करना शुरू कर दिया।


स्क्रीन बिल्डरों, सूचनाएं, संवाद



CUBA 7 में एक सुविधाजनक एपीआई के साथ उपयोगी घटकों का एक सेट है:


  • ScreenBuilders धाराप्रवाह फैक्ट्रियों को देखने और संपादन संस्थाओं के साथ-साथ कस्टम स्क्रीन बनाने के लिए जोड़ती है। नीचे दिए गए उदाहरण से पता चलता है कि आप एक स्क्रीन को दूसरे से कैसे खोल सकते हैं। ध्यान दें कि निर्माण () विधि तुरंत डाली की आवश्यकता के बिना वांछित प्रकार की स्क्रीन लौटाती है:
     CurrencyConversions currencyConversions = screenBuilders.screen(this) .withScreenClass(CurrencyConversions.class) .withLaunchMode(OpenMode.DIALOG) .build(); currencyConversions.setBaseCurrency(Currency.EUR); currencyConversions.show(); 
  • स्क्रीन घटक, स्क्रीनबिल्डर्स एपीआई के विपरीत, स्क्रीन बनाने और प्रदर्शित करने के लिए अमूर्त स्तर का एक निचला स्तर प्रदान करता है। यह आपके CUBA एप्लिकेशन ( स्क्रीन # getOpenedScreens ) में सभी खुली स्क्रीन के बारे में जानकारी प्रदान करता है, अगर आपको अचानक एक चक्र में उन सभी के माध्यम से जाने की आवश्यकता है।
  • सूचनाएं और संवाद घटक एक सुविधाजनक और शाब्दिक स्व-दस्तावेजीकरण एपीआई प्रदान करते हैं। निम्नलिखित एक संवाद बॉक्स और अधिसूचना बनाने और प्रदर्शित करने का एक उदाहरण है:
     dialogs.createOptionDialog() .withCaption("My first dialog") .withMessage("Would you like to thank CUBA team?") .withActions( new DialogAction(DialogAction.Type.YES).withHandler(e -> notifications.create() .withCaption("Thank you!") .withDescription("We appreciate all community members") .withPosition(Notifications.Position.MIDDLE_CENTER) .withHideDelayMs(3000) .show()), new DialogAction(DialogAction.Type.CANCEL) ) .show(); 

डेटा बाइंडिंग


CUBA बैक ऑफिस के लिए बेहद तेज यूजर इंटरफेस डेवलपमेंट प्रदान करता है, न केवल एडवांस्ड विजुअल डेवलपमेंट टूल्स और एक पावरफुल कोड जेनरेशन सिस्टम के साथ, बल्कि बॉक्स के ठीक बाहर उपलब्ध कंपोनेंट्स के समृद्ध सेट के साथ भी। इन घटकों को बस यह जानने की जरूरत है कि वे किस डेटा के साथ काम कर रहे हैं, और बाकी अपने आप हो जाएंगे। उदाहरण के लिए, ड्रॉप-डाउन सूची, कैलेंडर, अंतर्निहित सीआरयूडी संचालन के साथ टेबल, और इसी तरह।


संस्करण 7 से पहले, डेटा बाइंडिंग तथाकथित डेटा स्रोत के माध्यम से किया गया था - ऑब्जेक्ट जो घटकों के लिए उनके प्रतिक्रियाशील बंधन के लिए एक या एक से अधिक संस्थाओं को लपेटते हैं। इस दृष्टिकोण ने बहुत अच्छा काम किया, लेकिन कार्यान्वयन के संदर्भ में, यह एक अखंड था। मोनोलिथिक वास्तुकला आमतौर पर कॉन्फ़िगर करने के लिए समस्याग्रस्त है, इसलिए CUBA 7 में इस विशाल कोबलस्टोन को तीन घटकों में विभाजित किया गया था:


  • डेटा लोडर डेटा कंटेनरों के लिए एक डेटा प्रदाता है। लोडर डेटा को संग्रहीत नहीं करता है, यह बस डेटा वेयरहाउस में सभी आवश्यक क्वेरी मापदंडों को पारित करता है और परिणामी डेटा को डेटा कंटेनर में रखता है।
  • डेटा कंटेनर लोड किए गए डेटा (एक या अधिक इकाइयां) को बचाता है और उन्हें डेटा घटकों को प्रदान करता है: इन संस्थाओं में सभी परिवर्तन संबंधित घटकों को स्थानांतरित किए जाते हैं, और इसके विपरीत, घटकों में सभी परिवर्तन डेटा कंटेनर में झूठ बोलने वाली संस्थाओं में संबंधित परिवर्तनों को जन्म देंगे।
  • डेटाकोटेक्स्ट (डेटा संदर्भ) एक ऐसा वर्ग है जो परिवर्तन को ट्रैक करता है और सभी परिवर्तित संस्थाओं को संग्रहीत करता है। मॉनिटर किए गए निकाय को जब भी उनकी विशेषताओं में परिवर्तन किया जाता है, तो वे गंदे के रूप में चिह्नित होते हैं, और जब उनकी प्रतिबद्धता () विधि कहा जाता है, तो DataContext मिडलवेयर पर गंदे उदाहरणों को बचाता है।

इस प्रकार, डेटा के साथ काम करने में लचीलापन है। एक कृत्रिम उदाहरण: लोडर आरडीबीएमएस से यूआई में डेटा का चयन कर सकता है, और संदर्भ आरईएसटी सेवा में परिवर्तन को बचा सकता है।


CUBA 6.x में, आपको इसके लिए अपना स्वयं का डेटा स्रोत लिखना होगा, जो RDBMS और REST दोनों के साथ काम कर सकता है। CUBA 7 में, आप एक मानक लोडर ले सकते हैं जो डेटाबेस के साथ काम कर सकता है और REST के साथ काम करने के लिए केवल इसका संदर्भ कार्यान्वयन लिख सकता है।


डेटा के साथ काम करने के लिए घटकों को स्क्रीन डिस्क्रिप्टर में घोषित किया जा सकता है या किसी विशेष कारखाने का उपयोग करके प्रोग्रामेटिक रूप से बनाया जा सकता है - डेटाकॉमर्स।


अन्य


उफ्फ ... नए ऑन-स्क्रीन एपीआई के सबसे महत्वपूर्ण भागों का वर्णन किया गया है, इसलिए वेब क्लाइंट स्तर पर अन्य महत्वपूर्ण कार्यों को संक्षेप में सूचीबद्ध करें:


  • URL इतिहास और नेविगेशन । यह फ़ंक्शन एक बहुत ही सामान्य एसपीए समस्या को हल करता है - वेब ब्राउज़र में बैक बटन का व्यवहार हमेशा सही नहीं होता है। अब यह एप्लिकेशन स्क्रीन को रूट असाइन करने का एक आसान तरीका प्रदान करता है और एपीआई को URL में स्क्रीन की वर्तमान स्थिति प्रदर्शित करने की अनुमति देता है।
  • फील्डग्रुप के बजाय फॉर्मफील्डग्रुप एक इकाई के क्षेत्रों को प्रदर्शित करने और बदलने के लिए एक घटक है। यह रनटाइम में फ़ील्ड के लिए UI प्रदर्शित करता है। दूसरे शब्दों में, यदि इकाई में दिनांक फ़ील्ड है, तो वह DateField के रूप में प्रदर्शित होगी। हालाँकि, यदि आप प्रोग्राम के साथ इस क्षेत्र में काम करना चाहते हैं, तो आपको इसे स्क्रीन कंट्रोलर में दर्ज करना होगा और मैन्युअल रूप से इसे सही प्रकार ( हमारे उदाहरण में डेटफिल्ड ) में डालना होगा । यदि बाद में हम फ़ील्ड के प्रकार को दूसरे में बदलते हैं, तो हमारा एप्लिकेशन रनटाइम पर क्रैश हो जाएगा। प्रपत्र फ़ील्ड प्रकार को स्पष्ट रूप से घोषित करके इस समस्या को हल करता है। घटक के बारे में अधिक जानकारी यहां पाई जा सकती है
  • तृतीय-पक्ष जावास्क्रिप्ट घटकों का एकीकरण बहुत सरल है, एक CUBA अनुप्रयोग में कस्टम जावास्क्रिप्ट घटकों को एम्बेड करने पर प्रलेखन पढ़ें।
  • HTML / CSS विशेषताओं को अब आसानी से xml स्क्रीन डिस्क्रिप्टर से सीधे परिभाषित किया जा सकता है या प्रोग्रामेटिक रूप से सेट किया जा सकता है। अधिक जानकारी यहां पाई जा सकती है

बैकएंड मॉड्यूल की नई विशेषताएं


नए ऑन-स्क्रीन API पर पिछला भाग मेरी अपेक्षा से अधिक निकला, इसलिए इस खंड में मैं संक्षिप्त हूँ।


एंटिटी चेंजेड इवेंट


एंटिटी चेंजेड इवेंट एक स्प्रिंग एप्लिकेशन में एक घटना है जो उस समय फायर करती है जब कोई इकाई डेटा स्टोर में प्रवेश करती है, शारीरिक रूप से रखी जाती है, और प्रतिबद्ध से एक कदम दूर होती है। इस घटना को संसाधित करते समय, आप अतिरिक्त चेक कॉन्फ़िगर कर सकते हैं (उदाहरण के लिए, ऑर्डर की पुष्टि करने से पहले गोदाम में सामान की उपलब्धता की जांच करें) और डेटा को बदल दें (उदाहरण के लिए, योगों को फिर से लिखें) वे अन्य लेनदेन के लिए दृश्यमान हैं (बेशक, यदि आपके पास एक स्तर है पढ़ा हुआ अलगाव)। यह घटना अपवाद को फेंककर लेनदेन को समाप्त करने का अंतिम अवसर भी हो सकता है, जो कुछ मुश्किल मामलों में उपयोगी हो सकता है।


कमिट के बाद एंटिटी चेंजेड इवेंट को संभालने का एक तरीका भी है।


आप दस्तावेज़ के इस अध्याय में एक उदाहरण देख सकते हैं।


लेन-देन डेटा प्रबंधक


एप्लिकेशन विकसित करते समय, हम आमतौर पर अलग-अलग संस्थाओं के साथ काम करते हैं - वे जो किसी भी लेनदेन के संदर्भ में नहीं हैं। हालांकि, अलग-अलग संस्थाओं के साथ काम करना हमेशा संभव नहीं होता है, खासकर जब आपको एसीआईडी ​​आवश्यकताओं का पूरी तरह से पालन करने की आवश्यकता होती है - यह मामला है जब आप एक लेनदेन डेटा प्रबंधक का उपयोग कर सकते हैं। वह एक नियमित प्रबंधक के समान है, लेकिन निम्नलिखित पहलुओं में भिन्न है:


  • वह एक मौजूदा लेनदेन (इस लेनदेन के संदर्भ में कहा जा रहा है) में शामिल हो सकता है या अपना खुद का लेनदेन बना सकता है।
  • इसमें एक कमिट मेथड नहीं है, लेकिन एक सेव मेथड है, जो तुरंत कमिट नहीं करता है, लेकिन करंट ट्रांजैक्शन होने का इंतजार करता है।

यहाँ इसके उपयोग का एक उदाहरण है


जेपीए कॉलबैक


अंत में, CUBA 7 JPA कॉलबैक का समर्थन करता है। इन कॉलबैक का उपयोग करने के लिए ज्ञात सामग्रियों को नहीं दोहराने के लिए, मैं यहां एक लिंक छोड़ता हूं। इस सामग्री में, कॉलबैक के विषय का पूरी तरह से खुलासा किया गया है।


अनुकूलता के बारे में कैसे?



किसी भी प्रमुख रिलीज के लिए एक निष्पक्ष सवाल, खासकर जब इतने सारे महत्वपूर्ण परिवर्तन होते हैं! हमने इन सभी नई सुविधाओं और एपीआई को पिछड़े संगतता के साथ विकसित किया है:


  • पुराने API को CUBA 7 में सपोर्ट किया गया है और इसे हुड के नीचे नए के माध्यम से लागू किया गया है :)
  • हमने पुराने एपीआई के माध्यम से डेटा बाइंडिंग के लिए एडेप्टर भी प्रदान किए हैं। ये एडेप्टर पुरानी स्कीम के अनुसार बनाई गई स्क्रीन के लिए पूरी तरह से काम करेंगे।

अच्छी खबर यह है कि संस्करण 6 से 7 तक प्रवास की प्रक्रिया काफी सरल होनी चाहिए।


निष्कर्ष


तकनीकी समीक्षा को छोड़कर, मैं यह नोट करना चाहता हूं कि अन्य महत्वपूर्ण नवाचार हैं, खासकर लाइसेंसिंग के क्षेत्र में:


  • स्टूडियो के लिए 10 इकाई सीमा अब हटा दी गई है
  • रिपोर्टिंग, बीपीएम, चार्ट और मैप्स और पूर्ण पाठ खोज के लिए ऐड-ऑन अब स्वतंत्र और खुला स्रोत हैं।
  • स्टूडियो का वाणिज्यिक संस्करण संस्थाओं, स्क्रीन, मेनू और अन्य प्लेटफ़ॉर्म तत्वों के दृश्य डिजाइनरों की मदद से सुविधा के विकास में जोड़ता है, और मुफ्त संस्करण कोड के साथ काम करने पर केंद्रित है।
  • कृपया ध्यान दें कि 6.x और पुराने संस्करणों के लिए, प्लेटफ़ॉर्म और स्टूडियो के लिए लाइसेंसिंग की स्थिति समान है!

अंत में, मैं एक बार फिर से समुदाय को उनके समर्थन और प्रतिक्रिया के लिए धन्यवाद देता हूं। मुझे आशा है कि आपको संस्करण 7 पसंद है! पूरी जानकारी पारंपरिक रूप से आधिकारिक चैंज पर उपलब्ध है।

Source: https://habr.com/ru/post/hi447538/


All Articles