{"id":8178,"date":"2025-05-05T09:41:19","date_gmt":"2025-05-05T07:41:19","guid":{"rendered":"https:\/\/pomoc.comarch.pl\/cee\/640\/?post_type=ht_kb&#038;p=8178"},"modified":"2025-05-05T09:41:19","modified_gmt":"2025-05-05T07:41:19","slug":"persistence-service","status":"publish","type":"ht_kb","link":"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/","title":{"rendered":"Persistence service"},"content":{"rendered":"<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_82_2 ez-toc-wrap-left counter-hierarchy ez-toc-counter ez-toc-custom ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Spis tre\u015bci<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Prze\u0142\u0105cznik Spisu Tre\u015bci\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Wprowadzenie\" >Wprowadzenie<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Grupa_docelowa\" >Grupa docelowa<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Wymagania_wstepne\" >Wymagania wst\u0119pne<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Skroty\" >Skr\u00f3ty<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Istotne_obiekty_deweloperskie\" >Istotne obiekty deweloperskie<\/a><ul class='ez-toc-list-level-4' ><li class='ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Obiekt_biznesowy\" >Obiekt biznesowy<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Klasy_Java\" >Klasy Java<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Rozszerzenie_klasy_glownej\" >Rozszerzenie klasy g\u0142\u00f3wnej<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Klucz\" >Klucz<\/a><ul class='ez-toc-list-level-6' ><li class='ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Wartosci_zerowe\" >Warto\u015bci zerowe<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Generowanie_kluczy_Persistence_service\" >Generowanie kluczy Persistence service<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-12\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Referencje_obiektow\" >Referencje obiekt\u00f3w<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-13\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Atrybuty_Part\" >Atrybuty Part<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-14\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Zaleznosc_od_czasu\" >Zale\u017cno\u015b\u0107 od czasu<\/a><ul class='ez-toc-list-level-6' ><li class='ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-15\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Okres_obowiazywania\" >Okres obowi\u0105zywania<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-16\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Rozszerzenie_unikalnych_kluczy\" >Rozszerzenie unikalnych kluczy<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-17\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Generowanie_kluczy_Persistence_service_dla_okreslonych_wersji\" >Generowanie kluczy Persistence service dla okre\u015blonych wersji<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-18\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Dostep_do_sasiednich_wersji\" >Dost\u0119p do s\u0105siednich wersji<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-19\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Atrybuty_NLS\" >Atrybuty NLS<\/a><\/li><\/ul><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-20\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Obiekt_biznesowy_NLS\" >Obiekt biznesowy NLS<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-21\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Zmiana_informacjiusuniecie_techniczne\" >Zmiana informacji\/usuni\u0119cie techniczne<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-22\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Trwale_i_przejsciowe_instancje_obiektu_biznesowego\" >Trwa\u0142e i przej\u015bciowe instancje obiektu biznesowego<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-23\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Metoda_getTransientCopy\" >Metoda getTransientCopy()<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-24\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Metoda_newTransientInstance\" >Metoda newTransientInstance()<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-25\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Metoda_copyTo\" >Metoda copyTo()<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-26\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Metoda_set_persistent\" >Metoda set_persistent()<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-27\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Specjalne_metody_klasy_obiektow_biznesowych\" >Specjalne metody klasy obiekt\u00f3w biznesowych<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-28\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Part\" >Part<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-29\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Widok_OQL\" >Widok OQL<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-30\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Struktura_Persistence_service\" >Struktura Persistence service<\/a><ul class='ez-toc-list-level-4' ><li class='ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-31\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Wspoldzielona_pamiec_podreczna\" >Wsp\u00f3\u0142dzielona pami\u0119\u0107 podr\u0119czna<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-32\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Pamiec_podreczna_transakcji\" >Pami\u0119\u0107 podr\u0119czna transakcji<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-33\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Manager_transakcji\" >Manager transakcji<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-34\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Transakcje\" >Transakcje<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-35\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Zarzadzanie_transakcjami\" >Zarz\u0105dzanie transakcjami<\/a><ul class='ez-toc-list-level-6' ><li class='ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-36\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Alias_bazy_danych\" >Alias bazy danych<\/a><\/li><\/ul><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-37\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Tworzenie_transakcji_Top_Level\" >Tworzenie transakcji Top Level<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-38\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Tworzenie_transakcji_tylko_do_odczytu\" >Tworzenie transakcji tylko do odczytu<\/a><ul class='ez-toc-list-level-6' ><li class='ez-toc-heading-level-6'><ul class='ez-toc-list-level-6' ><li class='ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-39\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Tworzenie_podtransakcji\" >Tworzenie podtransakcji<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-40\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Potwierdzenie_transakcji\" >Potwierdzenie transakcji<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-41\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Anulowanie_transakcji\" >Anulowanie transakcji<\/a><\/li><\/ul><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-42\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Przyklad_laczenia_transakcji_nadrzednych_i_podrzednych\" >Przyk\u0142ad \u0142\u0105czenia transakcji nadrz\u0119dnych i podrz\u0119dnych<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-43\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Zaleznosc_transakcyjna_obiektow_biznesowych_instancje\" >Zale\u017cno\u015b\u0107 transakcyjna obiekt\u00f3w biznesowych instancje<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-44\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Widocznosc_zmian_w_transakcjach_zagniezdzonych\" >Widoczno\u015b\u0107 zmian w transakcjach zagnie\u017cd\u017conych<\/a><ul class='ez-toc-list-level-6' ><li class='ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-45\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Biezaca_transakcja_z_podtransakcjami\" >Bie\u017c\u0105ca transakcja z podtransakcjami<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-46\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Transakcja_nadrzedna_transakcji_modyfikujacej\" >Transakcja nadrz\u0119dna transakcji modyfikuj\u0105cej<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-47\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Zmiana_zawartosci_bazy_danych\" >Zmiana zawarto\u015bci bazy danych<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-48\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Obsluga_bledow_dla_transakcji\" >Obs\u0142uga b\u0142\u0119d\u00f3w dla transakcji<\/a><ul class='ez-toc-list-level-6' ><li class='ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-49\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Transakcja_odczytu_z_begin%E2%80%A6\" >Transakcja odczytu z begin&#8230;<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-50\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Transakcja_odczytu_z_create%E2%80%A6\" >Transakcja odczytu z create&#8230;<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-51\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Transakcja_zapisu_z_begin%E2%80%A6\" >Transakcja zapisu z begin&#8230;<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-52\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Transakcja_zapisu_z_create%E2%80%A6\" >Transakcja zapisu z create&#8230;<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-53\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Blokowa_transakcja_zapisu_z_create%E2%80%A6\" >Blokowa transakcja zapisu z create&#8230;<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-54\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Inne_metody\" >Inne metody<\/a><ul class='ez-toc-list-level-6' ><li class='ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-55\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Metoda_GetComparator\" >Metoda GetComparator()<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-56\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Metoda_buildDatabaseLock\" >Metoda buildDatabaseLock()<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-57\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Wsparcie_dla_masowego_przetwarzania_danych\" >Wsparcie dla masowego przetwarzania danych<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-58\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Manager_obiektow\" >Manager obiekt\u00f3w<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-59\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Jezyk_tresci_Content_language\" >J\u0119zyk tre\u015bci (Content language)<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-60\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Metoda_GetObject\" >Metoda GetObject()<\/a><ul class='ez-toc-list-level-6' ><li class='ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-61\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Tryb_dzialania\" >Tryb dzia\u0142ania<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-62\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Zaleznosc_od_czasu-2\" >Zale\u017cno\u015b\u0107 od czasu<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-63\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Obsluga_NLS\" >Obs\u0142uga NLS<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-64\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Metoda_GetObjectArray\" >Metoda GetObjectArray()<\/a><ul class='ez-toc-list-level-6' ><li class='ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-65\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Tryb_dzialania-2\" >Tryb dzia\u0142ania<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-66\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Zaleznosc_od_czasu-3\" >Zale\u017cno\u015b\u0107 od czasu<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-67\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Obsluga_NLS-2\" >Obs\u0142uga NLS<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-68\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Metoda_GetObjectList\" >Metoda GetObjectList()<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-69\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Metoda_putObject\" >Metoda putObject ()<\/a><ul class='ez-toc-list-level-6' ><li class='ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-70\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Tryb_dzialania-3\" >Tryb dzia\u0142ania<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-71\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Obiekt_stanu\" >Obiekt stanu<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-72\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Zaleznosc_od_czasu-4\" >Zale\u017cno\u015b\u0107 od czasu<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-73\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Obsluga_NLS-3\" >Obs\u0142uga NLS<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-74\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Metoda_deleteObject\" >Metoda deleteObject()<\/a><ul class='ez-toc-list-level-6' ><li class='ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-75\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Tryb_dzialania-4\" >Tryb dzia\u0142ania<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-76\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Zaleznosc_od_czasu-5\" >Zale\u017cno\u015b\u0107 od czasu<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-77\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Obsluga_NLS-4\" >Obs\u0142uga NLS<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-78\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Metoda_getObjectIterator\" >Metoda getObjectIterator()<\/a><ul class='ez-toc-list-level-6' ><li class='ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-79\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Tryb_dzialania-5\" >Tryb dzia\u0142ania<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-80\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Nota_wyjasniajaca\" >Nota wyja\u015bniaj\u0105ca<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-81\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Zaleznosc_od_czasu-6\" >Zale\u017cno\u015b\u0107 od czasu<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-82\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Obsluga_NLS-5\" >Obs\u0142uga NLS<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-83\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Metoda_getResultSet\" >Metoda getResultSet()<\/a><ul class='ez-toc-list-level-6' ><li class='ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-84\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Tryb_dzialania-6\" >Tryb dzia\u0142ania<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-85\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Nota_wyjasniajaca-2\" >Nota wyja\u015bniaj\u0105ca<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-86\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Zaleznosc_od_czasu-7\" >Zale\u017cno\u015b\u0107 od czasu<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-87\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Obsluga_NLS-6\" >Obs\u0142uga NLS<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-88\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Metoda_getUpdateStatement\" >Metoda getUpdateStatement ()<\/a><ul class='ez-toc-list-level-6' ><li class='ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-89\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Obsluga_NLS-7\" >Obs\u0142uga NLS<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-90\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Zaleznosc_od_czasu-8\" >Zale\u017cno\u015b\u0107 od czasu<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-91\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Zalety_i_wady_metod_dostepu\" >Zalety i wady metod dost\u0119pu<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-92\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Tryby_dostepu\" >Tryby dost\u0119pu<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-93\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Jak_dziala_dostep_do_obiektow_biznesowych\" >Jak dzia\u0142a dost\u0119p do obiekt\u00f3w biznesowych<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-94\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Dostep_do_odczytu\" >Dost\u0119p do odczytu<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-95\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Dostep_do_zapisu\" >Dost\u0119p do zapisu<\/a><\/li><\/ul><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-96\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Obiekty_stanu\" >Obiekty stanu<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-97\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Obiekty_stanu_w_transakcjach\" >Obiekty stanu w transakcjach<\/a><ul class='ez-toc-list-level-6' ><li class='ez-toc-heading-level-6'><ul class='ez-toc-list-level-6' ><li class='ez-toc-heading-level-6'><ul class='ez-toc-list-level-6' ><li class='ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-98\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Otwieranie_instancji_obiektu_biznesowego_getObject\" >Otwieranie instancji obiektu biznesowego (getObject())<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-99\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Ustawianie_wartosci_atrybutow_set_%E2%80%A6_i_get_%E2%80%A6\" >Ustawianie warto\u015bci atrybut\u00f3w (set &#8230;() i get &#8230;())<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-100\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Zarejestruj_sie_do_zapisu_putObject\" >Zarejestruj si\u0119 do zapisu (putObject())<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-101\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Zaleznosc_od_czasu-9\" >Zale\u017cno\u015b\u0107 od czasu<\/a><ul class='ez-toc-list-level-6' ><li class='ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-102\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Tryb_Insert-Only\" >Tryb Insert-Only<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-103\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Tryb_Update\" >Tryb Update<\/a><\/li><\/ul><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-104\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Przetwarzanie_przez_aplikacje\" >Przetwarzanie przez aplikacj\u0119<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-105\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Schematy_numeracji\" >Schematy numeracji<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-106\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Rysowanie_liczb_bez_przerw\" >Rysowanie liczb bez przerw<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-107\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Wyszukiwanie_OQL_getOqlSearchStatement\" >Wyszukiwanie OQL (getOqlSearchStatement())<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-108\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Wykonywanie_wyszukiwania\" >Wykonywanie wyszukiwania<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-109\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Limit_czasu_wyszukiwania\" >Limit czasu wyszukiwania<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-110\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Ustawianie_parametrow\" >Ustawianie parametr\u00f3w<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-111\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Dowolne_parametry\" >Dowolne parametry<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-112\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Korzystanie_z_dodatkowego_wzorca_wyszukiwania\" >Korzystanie z dodatkowego wzorca wyszukiwania<\/a><\/li><\/ul><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-113\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Restart\" >Restart<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-114\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Dolaczanie_unikalnego_klucza\" >Do\u0142\u0105czanie unikalnego klucza<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-115\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Fragmenty\" >Fragmenty<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-116\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Ograniczenia\" >Ograniczenia<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-117\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Typ_danych_SBlob\" >Typ danych SBlob<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-118\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Usluga_blokady\" >Us\u0142uga blokady<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-119\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Konteksty_blokady\" >Konteksty blokady<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-120\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Rodzaje_blokad\" >Rodzaje blokad<\/a><ul class='ez-toc-list-level-6' ><li class='ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-121\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Blokady_logiczne\" >Blokady logiczne<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-122\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Blokady_instancji\" >Blokady instancji<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-123\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Blokady_tablicy\" >Blokady tablicy<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-124\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Blokady_jednostek_biznesowych\" >Blokady jednostek biznesowych<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-125\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Synchronizacja_wspoldzielonych_pamieci_podrecznych_Shared_Caches\" >Synchronizacja wsp\u00f3\u0142dzielonych pami\u0119ci podr\u0119cznych (Shared Caches)<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-126\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Blokady_logiczne-2\" >Blokady logiczne<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-127\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Przelaczanie_awaryjne_bazy_danych\" >Prze\u0142\u0105czanie awaryjne bazy danych<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-128\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Dziennik_zmian\" >Dziennik zmian<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-129\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Lista_transferu\" >Lista transferu<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-130\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/persistence-service\/#Update_Listener\" >Update Listener<\/a><\/li><\/ul><\/li><\/ul><\/nav><\/div>\n<h3 id=\"wprowadzenie\" ><span class=\"ez-toc-section\" id=\"Wprowadzenie\"><\/span>Wprowadzenie<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>W artykule opisano zakres funkcjonalny i funkcjonalno\u015b\u0107 <em>Persistence<\/em> service w systemie.<\/p>\n<p><em>Persistence service<\/em> jest interfejsem do otwierania i zapisywania danych. Jest cz\u0119\u015bci\u0105 silnika systemu i zapewnia podstawowe funkcje.<em> Persistence service<\/em> mo\u017ce uzyskiwa\u0107 dost\u0119p do r\u00f3\u017cnych system\u00f3w zarz\u0105dzania bazami danych (DBMS). Gwarantowany jest jednolity dost\u0119p do baz danych w r\u00f3\u017cnych systemach DBMS. Czasami r\u00f3\u017cne zachowanie DBMS jest ukryte przed aplikacj\u0105 i programami systemowymi przez <em>Persistence service<\/em>. Funkcjonalno\u015b\u0107 programu aplikacji jest zatem niezale\u017cna od u\u017cywanego systemu DBMS.<\/p>\n<figure id=\"attachment_29553\" aria-describedby=\"caption-attachment-29553\" style=\"width: 1024px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/04\/ChatGPT-Image-30-kwi-2025-10_27_15.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-29553\" src=\"https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/04\/ChatGPT-Image-30-kwi-2025-10_27_15.png\" alt=\"\" width=\"1024\" height=\"1024\" srcset=\"https:\/\/pomoc.comarch.pl\/cee\/640\/wp-content\/uploads\/2025\/04\/ChatGPT-Image-30-kwi-2025-10_27_15.png 1024w, https:\/\/pomoc.comarch.pl\/cee\/640\/wp-content\/uploads\/2025\/04\/ChatGPT-Image-30-kwi-2025-10_27_15-300x300.png 300w, https:\/\/pomoc.comarch.pl\/cee\/640\/wp-content\/uploads\/2025\/04\/ChatGPT-Image-30-kwi-2025-10_27_15-150x150.png 150w, https:\/\/pomoc.comarch.pl\/cee\/640\/wp-content\/uploads\/2025\/04\/ChatGPT-Image-30-kwi-2025-10_27_15-768x768.png 768w, https:\/\/pomoc.comarch.pl\/cee\/640\/wp-content\/uploads\/2025\/04\/ChatGPT-Image-30-kwi-2025-10_27_15-50x50.png 50w, https:\/\/pomoc.comarch.pl\/cee\/640\/wp-content\/uploads\/2025\/04\/ChatGPT-Image-30-kwi-2025-10_27_15-60x60.png 60w, https:\/\/pomoc.comarch.pl\/cee\/640\/wp-content\/uploads\/2025\/04\/ChatGPT-Image-30-kwi-2025-10_27_15-920x920.png 920w, https:\/\/pomoc.comarch.pl\/cee\/640\/wp-content\/uploads\/2025\/04\/ChatGPT-Image-30-kwi-2025-10_27_15-600x600.png 600w, https:\/\/pomoc.comarch.pl\/cee\/640\/wp-content\/uploads\/2025\/04\/ChatGPT-Image-30-kwi-2025-10_27_15-320x320.png 320w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption id=\"caption-attachment-29553\" class=\"wp-caption-text\"><em>Warstwy dost\u0119pu do bazy danych<\/em><\/figcaption><\/figure>\n<p>Program aplikacji (w tym programy systemowe) zawsze uzyskuje dost\u0119p do bazy danych za po\u015brednictwem <em>Persistence service<\/em>. Sk\u0142ada si\u0119 ona z kilku komponent\u00f3w i ma struktur\u0119 warstwow\u0105. Program zawsze u\u017cywa manager transakcji lub manager obiekt\u00f3w do odczytu lub zapisywania danych. Korzystaj\u0105 one z us\u0142ugi blokady, aby zsynchronizowa\u0107 dost\u0119p do obiekt\u00f3w biznesowych. Manager uzyskuje dost\u0119p do pami\u0119ci podr\u0119cznej transakcji (Transaction Cache) i wsp\u00f3\u0142dzielonej pami\u0119ci podr\u0119cznej (Shared Cache). Aby otworzy\u0107 lub zapisa\u0107 obiekt biznesowy, <em>Persistence service<\/em> korzysta z klasy mappera wygenerowanej dla ka\u017cdego obiektu biznesowego, kt\u00f3ra konwertuje dane mi\u0119dzy modelem obiektowym a relacyjnym modelem bazy danych. Warstwa dost\u0119pu do bazy danych (sterownik JDBC) zapewnia interfejsy do bezpo\u015bredniej komunikacji z baz\u0105 danych. Wykonuje dost\u0119p do bazy danych i hermetyzuje funkcje specyficzne dla bazy danych. Baza danych przechowuje dane instancji obiekt\u00f3w biznesowych w tabelach i wykonuje na nich zapytania SQL.<\/p>\n<h3 id=\"grupa-docelowa\" ><span class=\"ez-toc-section\" id=\"Grupa_docelowa\"><\/span>Grupa docelowa<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<ul>\n<li>Zaawansowani deweloperzy<\/li>\n<\/ul>\n<h3 id=\"wymagania-wstepne\" ><span class=\"ez-toc-section\" id=\"Wymagania_wstepne\"><\/span>Wymagania wst\u0119pne<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Podstawy <em>Persistence service<\/em> s\u0105 niezb\u0119dne do zrozumienia tego dokumentu. <span style=\"color: #000000;\">Dokumentacja <em>Podr\u0119cznik programowania<\/em> stanowi wprowadzenie do podstaw.<\/span><\/p>\n<h3 id=\"skroty\" ><span class=\"ez-toc-section\" id=\"Skroty\"><\/span>Skr\u00f3ty<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<table style=\"height: 690px; width: 100%; border-color: #000000; background-color: #ffffff; border-style: outset;\" data-pm-slice=\"3 3 []\">\n<tbody>\n<tr style=\"height: 23px;\">\n<td style=\"height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset;\" scope=\"rowgroup\"><strong>Skr\u00f3t<\/strong><\/td>\n<td style=\"height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset;\" scope=\"rowgroup\"><strong>Pe\u0142na nazwa \/ Opis<\/strong><\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset;\" scope=\"rowgroup\"><em>API<\/em><\/td>\n<td style=\"height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset;\" scope=\"rowgroup\">Interfejs programowania aplikacji<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset;\" scope=\"rowgroup\"><em>BO<\/em><\/td>\n<td style=\"height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset;\" scope=\"rowgroup\">Obiekt biznesowy<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset;\" scope=\"rowgroup\"><em>BOD<\/em><\/td>\n<td style=\"height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset;\" scope=\"rowgroup\">Definicja obiektu biznesowego<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset;\" scope=\"rowgroup\"><em>DB<\/em><\/td>\n<td style=\"height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset;\" scope=\"rowgroup\">Baza danych<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset;\" scope=\"rowgroup\"><em>DHTML<\/em><\/td>\n<td style=\"height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset;\" scope=\"rowgroup\">Dynamiczny HTML<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset;\" scope=\"rowgroup\"><em>GUI<\/em><\/td>\n<td style=\"height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset;\" scope=\"rowgroup\">Graficzny interfejs u\u017cytkownika<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset;\" scope=\"rowgroup\"><em>GUID<\/em><\/td>\n<td style=\"height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset;\" scope=\"rowgroup\">Globalny unikalny identyfikator<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset;\" scope=\"rowgroup\"><em>HTML<\/em><\/td>\n<td style=\"height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset;\" scope=\"rowgroup\">J\u0119zyk znacznik\u00f3w hipertekstowych<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset;\" scope=\"rowgroup\"><em>JDK<\/em><\/td>\n<td style=\"height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset;\" scope=\"rowgroup\">Java Development Kit<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset;\" scope=\"rowgroup\"><em>JVM<\/em><\/td>\n<td style=\"height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset;\" scope=\"rowgroup\">Wirtualna maszyna Java<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset;\" scope=\"rowgroup\"><em>IDE<\/em><\/td>\n<td style=\"height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset;\" scope=\"rowgroup\">Zintegrowane \u015brodowisko deweloperskie<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset;\" scope=\"rowgroup\"><em>MM<\/em><\/td>\n<td style=\"height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset;\" scope=\"rowgroup\">Manager wiadomo\u015bci<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset;\" scope=\"rowgroup\"><em>NLS<\/em><\/td>\n<td style=\"height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset;\" scope=\"rowgroup\">Krajowe wsparcie j\u0119zykowe<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset;\" scope=\"rowgroup\"><em>LDT<\/em><\/td>\n<td style=\"height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset;\" scope=\"rowgroup\">Logiczny typ danych<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset;\" scope=\"rowgroup\"><em>OLTP<\/em><\/td>\n<td style=\"height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset;\" scope=\"rowgroup\">Przetwarzanie transakcji online<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset;\" scope=\"rowgroup\"><em>OLAP<\/em><\/td>\n<td style=\"height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset;\" scope=\"rowgroup\">Przetwarzanie analityczne online<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset;\" scope=\"rowgroup\"><em>OM<\/em><\/td>\n<td style=\"height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset;\" scope=\"rowgroup\">Object Manager<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset;\" scope=\"rowgroup\"><em>OQL<\/em><\/td>\n<td style=\"height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset;\" scope=\"rowgroup\">Obiektowy j\u0119zyk zapyta\u0144<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset;\" scope=\"rowgroup\"><em>SAS<\/em><\/td>\n<td style=\"height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset;\" scope=\"rowgroup\">Serwer aplikacji systemu ERP<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset;\" scope=\"rowgroup\"><em>SDK<\/em><\/td>\n<td style=\"height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset;\" scope=\"rowgroup\">Zestaw do tworzenia system\u00f3w ERP<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset;\" scope=\"rowgroup\"><em>SOM<\/em><\/td>\n<td style=\"height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset;\" scope=\"rowgroup\">Manager raport\u00f3w systemu ERP<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset;\" scope=\"rowgroup\"><em>SQL<\/em><\/td>\n<td style=\"height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset;\" scope=\"rowgroup\">Strukturalny j\u0119zyk zapyta\u0144<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset;\" scope=\"rowgroup\"><em>SVM<\/em><\/td>\n<td style=\"height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset;\" scope=\"rowgroup\">Maszyna wirtualna systemu ERP, synonim SAS<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset;\" scope=\"rowgroup\"><em>TM<\/em><\/td>\n<td style=\"height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset;\" scope=\"rowgroup\">Manager transakcji<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset;\" scope=\"rowgroup\"><em>UI<\/em><\/td>\n<td style=\"height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset;\" scope=\"rowgroup\">Interfejs u\u017cytkownika<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset;\" scope=\"rowgroup\"><em>URI<\/em><\/td>\n<td style=\"height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset;\" scope=\"rowgroup\">Uniform Resource Identifier<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset;\" scope=\"rowgroup\"><em>URL<\/em><\/td>\n<td style=\"height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset;\" scope=\"rowgroup\">Uniform Resource Locator<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset;\" scope=\"rowgroup\"><em>VE<\/em><\/td>\n<td style=\"height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset;\" scope=\"rowgroup\">Element wizualny<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset;\" scope=\"rowgroup\"><em>VEC<\/em><\/td>\n<td style=\"height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset;\" scope=\"rowgroup\">Visual Element Container<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3 id=\"istotne-obiekty-deweloperskie\" ><span class=\"ez-toc-section\" id=\"Istotne_obiekty_deweloperskie\"><\/span>Istotne obiekty deweloperskie<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>W kolejnych rozdzia\u0142ach opisano obiekty deweloperskie, z kt\u00f3rymi wsp\u00f3\u0142pracuje <em>Persistence service<\/em>.<\/p>\n<h4 id=\"obiekt-biznesowy\" ><span class=\"ez-toc-section\" id=\"Obiekt_biznesowy\"><\/span>Obiekt biznesowy<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Obiekt biznesowy jest kontenerem danych bez wyspecjalizowanej logiki. Dla obiektu biznesowego generowana jest tabela g\u0142\u00f3wna i tabele pomocnicze ze strukturami dost\u0119pu z definicji indeks\u00f3w przechowywanych w bazie danych. Obiekt biznesowy jest zmienn\u0105 techniczn\u0105, kt\u00f3r\u0105<em> Persistence service<\/em> mo\u017ce odczytywa\u0107, zapisywa\u0107 i usuwa\u0107. Konwersja odbywa si\u0119 mi\u0119dzy obiektowym modelem danych u\u017cywanym w aplikacji a relacyjnym modelem danych bazy danych. Obiekty biznesowe to jedyny spos\u00f3b na trwa\u0142e przechowywanie danych.<\/p>\n<p><span style=\"color: #000000;\">Ka\u017cdy obiekt biznesowy jest opisany w aplikacji <em>Obiekty deweloperskie<\/em>.<\/span> Ten opis obiektu obejmuje definicje atrybut\u00f3w, kluczy i relacji. Typ obiektu deweloperskiego <em>Business Object<\/em> jest u\u017cywany do opisu obiektu w aplikacji <em>Obiekty deweloperskie<\/em>.<\/p>\n<p>Poni\u017csza ilustracja przedstawia przyk\u0142ad opisu obiektu biznesowego <em>Item<\/em>:<\/p>\n<figure id=\"attachment_29340\" aria-describedby=\"caption-attachment-29340\" style=\"width: 1024px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/04\/ChatGPT-Image-25-kwi-2025-13_55_04.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-29340\" src=\"https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/04\/ChatGPT-Image-25-kwi-2025-13_55_04.png\" alt=\"\" width=\"1024\" height=\"1024\" srcset=\"https:\/\/pomoc.comarch.pl\/cee\/640\/wp-content\/uploads\/2025\/04\/ChatGPT-Image-25-kwi-2025-13_55_04.png 1024w, https:\/\/pomoc.comarch.pl\/cee\/640\/wp-content\/uploads\/2025\/04\/ChatGPT-Image-25-kwi-2025-13_55_04-300x300.png 300w, https:\/\/pomoc.comarch.pl\/cee\/640\/wp-content\/uploads\/2025\/04\/ChatGPT-Image-25-kwi-2025-13_55_04-150x150.png 150w, https:\/\/pomoc.comarch.pl\/cee\/640\/wp-content\/uploads\/2025\/04\/ChatGPT-Image-25-kwi-2025-13_55_04-768x768.png 768w, https:\/\/pomoc.comarch.pl\/cee\/640\/wp-content\/uploads\/2025\/04\/ChatGPT-Image-25-kwi-2025-13_55_04-50x50.png 50w, https:\/\/pomoc.comarch.pl\/cee\/640\/wp-content\/uploads\/2025\/04\/ChatGPT-Image-25-kwi-2025-13_55_04-60x60.png 60w, https:\/\/pomoc.comarch.pl\/cee\/640\/wp-content\/uploads\/2025\/04\/ChatGPT-Image-25-kwi-2025-13_55_04-920x920.png 920w, https:\/\/pomoc.comarch.pl\/cee\/640\/wp-content\/uploads\/2025\/04\/ChatGPT-Image-25-kwi-2025-13_55_04-600x600.png 600w, https:\/\/pomoc.comarch.pl\/cee\/640\/wp-content\/uploads\/2025\/04\/ChatGPT-Image-25-kwi-2025-13_55_04-320x320.png 320w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption id=\"caption-attachment-29340\" class=\"wp-caption-text\"><em>Przyk\u0142ad opisu obiektu biznesowego Item<\/em><\/figcaption><\/figure>\n<h3 id=\"klasy-java\" ><span class=\"ez-toc-section\" id=\"Klasy_Java\"><\/span>Klasy Java<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Po wywo\u0142aniu narz\u0119dzia <a href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/tworzenie-obiektu-biznesowego-crtbo\/\"><em>crtbo<\/em><\/a> z opisu obiektu generowane s\u0105 trzy klasy Java:<\/p>\n<ul>\n<li>klasa g\u0142\u00f3wna (main class)<\/li>\n<li>klasa stanu (state class)<\/li>\n<li>klasa mappera (mapper class)<\/li>\n<\/ul>\n<p>Klasy Java s\u0105 przechowywane w pakiecie Java odpowiadaj\u0105cym przestrzeni nazw pod nazw\u0105 obiektu biznesowego (ewentualnie z przyrostkiem <em>_State<\/em> lub <em>_Mapper<\/em>). Wygenerowane klasy Java hermetyzuj\u0105 mi\u0119dzy innymi dost\u0119p do bazy danych i zapewniaj\u0105 programowi aplikacyjnemu dost\u0119p do danych instancji obiektu biznesowego.<\/p>\n<p>Klasa g\u0142\u00f3wna, kt\u00f3ra ma tak\u0105 sam\u0105 nazw\u0119 jak obiekt biznesowy, zapewnia dost\u0119p do w\u0142a\u015bciwo\u015bci instancji obiektu biznesowego. Klasa g\u0142\u00f3wna zawiera metody<em> get&#8230;(), set&#8230;()<\/em> i <em>is&#8230;()<\/em> (dla <em>Boolean<\/em>) dla dost\u0119pu do atrybut\u00f3w obiektu biznesowego. Odpowiednie metody <em>build&#8230;Key()<\/em> s\u0105 generowane dla unikalnych indeks\u00f3w, kt\u00f3re s\u0105 u\u017cywane do odczytu instancji przy u\u017cyciu unikalnych warto\u015bci klucza z <em>Persistence service<\/em>. Metody <em>retrieve&#8230;()<\/em>, kt\u00f3re mo\u017cna wykorzysta\u0107 do okre\u015blenia przypisanych obiekt\u00f3w biznesowych, s\u0105 generowane dla okre\u015blonych relacji. Metody publiczne s\u0105 okre\u015blane wy\u0142\u0105cznie przez opis obiektu. Klasa obiektu biznesowego nie mo\u017ce zosta\u0107 zmieniona. W szczeg\u00f3lno\u015bci oznacza to, \u017ce do klasy g\u0142\u00f3wnej nie mo\u017cna dodawa\u0107 \u017cadnych funkcji logicznych. Musz\u0105 one zosta\u0107 zaimplementowane w oddzielnych klasach logicznych (w przestrzeni nazw z przyrostkiem<em>e.log<\/em>).<\/p>\n<p>Nast\u0119puj\u0105ce metody dost\u0119pu do atrybut\u00f3w s\u0105 generowane dla obiektu biznesowego <em>Item<\/em> (przyk\u0142ad) w powi\u0105zanej klasie g\u0142\u00f3wnej:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">public byte[] getGuid() ;\npublic void setGuid(byte[]newValue);\n\npublic String getNumber() ;\npublic void setNumber(String newValue);\n\npublic String getDescription() ;\npublic void setDescription(String newValue);\n\npublic CisDecimal[] getSize() ;\npublic setSize(CisDecimal[] newValue);\n\npublic DomesticAmount getValue() ;\npublic DomesticAmountMutable getMutableValue() ;\npublic void setValue (DomesticAmountMutable newValue);<\/pre>\n<p>Nast\u0119puj\u0105ce metody s\u0105 generowane w celu utworzenia kluczy <em>Persistence service<\/em> ze zdefiniowanych kluczy obiekt\u00f3w biznesowych:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">public byte[] buildPrimaryKey(byte[] guid);\npublic byte[] buildByNumberKey(String number);<\/pre>\n<p>Dla relacji generowane s\u0105 nast\u0119puj\u0105ce metody:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">public InventoryItem retrieveInventoryItem();\npublic OriginalItem retrieveOriginalItem();\npublic CisObjectIterator&lt;AlternativeItem&gt; retrieveAlternativeItems();<\/pre>\n<h5 id=\"rozszerzenie-klasy-glownej\" ><span class=\"ez-toc-section\" id=\"Rozszerzenie_klasy_glownej\"><\/span>Rozszerzenie klasy g\u0142\u00f3wnej<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Klasa g\u0142\u00f3wna mo\u017ce zosta\u0107 rozszerzona przez pochodn\u0105 w celu nadpisania niekt\u00f3rych metod. Ta klasa implementacji podlega ograniczeniom. Tylko funkcjonalno\u015bci opisane w tym rozdziale mog\u0105 by\u0107 zaimplementowane w tej klasie.<\/p>\n<p>Klasa implementacji podlega nast\u0119puj\u0105cej konwencji nazewnictwa: przestrze\u0144 nazw jest pobierana z klasy nadrz\u0119dnej, nazwa klasy jest rozszerzana o przyrostek <em>Impl<\/em>. Relacja dziedziczenia musi by\u0107 zapisana w metadanych obiektu biznesowego. Nazw\u0119 nowej klasy wprowadza si\u0119 w aplikacji <em>Obiekty deweloperskie<\/em>, typ <em>Business object -&gt;<\/em> zak\u0142adka <em>Edytor -&gt; <\/em>podzak\u0142adka <em>Ustawienia -&gt; <\/em>sekcja <em>Inne<\/em> <em>ustawienia -&gt; <\/em>pole <em>Klasa Java<\/em>.<\/p>\n<p>Nowo wygenerowane \u017ar\u00f3d\u0142a wykorzystuj\u0105 nast\u0119pnie wewn\u0119trznie klas\u0119 pochodn\u0105. Nowa klasa (np. <em>BookImpl<\/em>) nie mo\u017ce by\u0107 u\u017cywana bezpo\u015brednio w aplikacji. W tym celu zawsze u\u017cywana jest klasa g\u0142\u00f3wna (np. <em>Book).<\/em><\/p>\n<p><strong>metoda get_instanceString():<\/strong><\/p>\n<p>W klasie implementacji domy\u015bln\u0105 implementacj\u0119 mo\u017cna zast\u0105pi\u0107 implementacj\u0105 niestandardow\u0105.<\/p>\n<p><em>Persistence service<\/em> nie mo\u017ce by\u0107 u\u017cywana z wyj\u0105tkiem metody <em>resolveForeignKey()<\/em> klasy <em>com.cisag.pgm.datatype.CisObjectUtility.<\/em> Mo\u017cna jej u\u017cy\u0107 do otwarcia instancji obiektu biznesowego dla klucza obcego. Metoda zwraca przej\u015bciow\u0105 kopi\u0119 instancji obiektu biznesowego dla przekazanego klucza technicznego i typu bazy danych w j\u0119zyku bazy danych odwo\u0142uj\u0105cej si\u0119 instancji obiektu biznesowego. Metoda zwraca <em>null<\/em> dla nieistniej\u0105cej instancji. Sygnatura to:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">public static CisObject resolveForeignKey(\nCisObject Source,\nString targetDatabaseAlias,\nbyte[] targetPrimaryKey);<\/pre>\n<p>Implementacja klasy <em>XYZImpl<\/em> wywodz\u0105cej si\u0119 z klasy XYZ jest pokazana poni\u017cej jako przyk\u0142ad, w kt\u00f3rym opisowy <em>InstanceString<\/em>\u00a0jest tworzony z klucza biznesowego przywo\u0142ywanego obiektu biznesowego i w\u0142asnego klucza biznesowego u\u017cytkownika.<\/p>\n<section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\"><\/p>\n<p>W przypadku zam\u00f3wienia klucz biznesowy sk\u0142ada si\u0119 z typu <em>(GUID<\/em> typu (klucz obcy)) i numeru zam\u00f3wienia. Wy\u015bwietlany <em>InstanceString<\/em> powinien sk\u0142ada\u0107 si\u0119 z identyfikacji typu zam\u00f3wienia i numeru zam\u00f3wienia.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">public class XYZImpl {\n\n...\n\npublic String get_instanceString() {\n\nString result = getNumber();\n\nbyte[] typeGuid = getTypeGuid();\n\nif (!Guid.isInvalidGuid(typeGuid)) {\n\n\/\/ Pomi\u0144 nieistniej\u0105ce obiekty\n\nXYZType t = (XYZType) CisObjectUtility.\n\nresolveForeignKey(this, CisTransactionManager.OLTP,\n\nXYZType.buildPrimaryKey(typeGuid));\n\nif (t != null) {\n\nresult = t.getCode() + \" \" + getNumber();\n\n}\n\n}\n\nreturn result;\n\n}\n\n...\n\n}<\/pre>\n<p><\/div><\/section>\n<p><strong>get_permission():<br \/>\n<\/strong>Ta metoda s\u0142u\u017cy do implementacji sprawdzania uprawnie\u0144 zwi\u0105zanych z tre\u015bci\u0105.<\/p>\n<h5 id=\"klucz\" ><span class=\"ez-toc-section\" id=\"Klucz\"><\/span>Klucz<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Opis obiektu biznesowego zawiera r\u00f3wnie\u017c opis indeks\u00f3w obiektu biznesowego. Indeks zasadniczo sk\u0142ada si\u0119 z nazwy, typu i sekwencji atrybut\u00f3w obiektu biznesowego. Niekt\u00f3re z tych indeks\u00f3w s\u0105 unikalne w zale\u017cno\u015bci od typu i s\u0105 u\u017cywane do identyfikacji instancji obiektu biznesowego. Te unikalne indeksy s\u0105 r\u00f3wnie\u017c okre\u015blane poni\u017cej jako klucze. Ka\u017cdy obiekt biznesowy posiada klucz g\u0142\u00f3wny (typ <em>Primary Index<\/em>), opcjonalnie klucz biznesowy (typ <em>Secondary (Business Key)<\/em>) i opcjonalnie dowoln\u0105 liczb\u0119 kluczy dodatkowych (typ<em> Secondary (unique)<\/em>).<\/p>\n<p>Klucz podstawowy obiektu biznesowego jest zawsze kluczem technicznym, kt\u00f3ry jest tak kompaktowy, jak to mo\u017cliwe i nie zmienia si\u0119 podczas istnienia instancji. Klucz podstawowy powinien zawiera\u0107 co najmniej jeden atrybut typu <em>GUID.<\/em><\/p>\n<p>Korzystanie z identyfikator\u00f3w <em>GUID<\/em> oferuje nast\u0119puj\u0105ce korzy\u015bci:<\/p>\n<ul>\n<li>Identyfikatory <em>GUID<\/em> mog\u0105 by\u0107 efektywnie obliczane lokalnie, tj. nie ma potrzeby korzystania z us\u0142ugi przypisywania numer\u00f3w itp.<\/li>\n<li>Identyfikatory <em>GUID<\/em> zapewniaj\u0105 wysok\u0105 selektywno\u015b\u0107 w drzewach B* (indeksach DB)<\/li>\n<li>Identyfikatory <em>GUID<\/em> dobrze nadaj\u0105 si\u0119 do procedur skr\u00f3tu<\/li>\n<li>Identyfikatory <em>GUID<\/em> s\u0105 globalnie unikalne, co u\u0142atwia na przyk\u0142ad wdra\u017canie scenariuszy replikacji<\/li>\n<li>Identyfikatory <em>GUID<\/em> s\u0105 stosunkowo niewielki (16 bajt\u00f3w)<\/li>\n<\/ul>\n<p>Sta\u0142a warto\u015b\u0107 elementu zestawu warto\u015bci jest identyfikatorem technicznym i mo\u017ce by\u0107 u\u017cywana w kluczu podstawowym obiektu biznesowego. Klucz podstawowy instancji obiektu biznesowego nie mo\u017ce ju\u017c zosta\u0107 zmieniony po pierwszym zapisaniu go w bazie danych. D\u0142ugie klucze podstawowe (np. zawieraj\u0105ce wi\u0119cej ni\u017c 2 identyfikatory <em>GUID)<\/em> oznaczaj\u0105 wi\u0119cej przetwarzania dla <em>Persistence service<\/em>. W zwi\u0105zku z tym zaleca si\u0119, aby klucz podstawowy by\u0142 jak najkr\u00f3tszy.<\/p>\n<p>Identyfikator <em>GUID<\/em> w kluczu podstawowym powinien by\u0107 u\u017cywany tylko dla jednej instancji. W szczeg\u00f3lnych przypadkach dopuszczalny jest identyfikator kilku instancji obiekt\u00f3w biznesowych przy u\u017cyciu tej samej warto\u015bci <em>GUID.<\/em> Powinno to jednak mie\u0107 miejsce tylko wtedy, gdy dane obiekty biznesowe odnosz\u0105 si\u0119 do tej samej zmiennej biznesowej (np. <em>Item, SalesItem, InventoryItem<\/em>, &#8230;).<\/p>\n<p>Niekt\u00f3re obiekty maj\u0105 identyfikacj\u0119 funkcjonaln\u0105, tak\u0105 jak numer artyku\u0142u lub kombinacja typu zam\u00f3wienia i numeru zam\u00f3wienia. Ta identyfikacja biznesowa jest mapowana w kluczu biznesowym i powinna reprezentowa\u0107 czytelne dla cz\u0142owieka odniesienie do instancji obiektu biznesowego. Klucz biznesowy powinien zawiera\u0107 atrybuty o najprostszym mo\u017cliwym typie, takie jak ci\u0105g znak\u00f3w dla liczb. Klucz biznesowy mo\u017ce r\u00f3wnie\u017c zawiera\u0107 techniczne klucze obce, takie jak identyfikator <em>GUID<\/em> typu zam\u00f3wienia. Definicja klucza biznesowego jest r\u00f3wnie\u017c wykorzystywana w sterowniku ODBC w celu zapewnienia u\u017cytkownikowi lepszych opcji dost\u0119pu poprzez dodatkowe atrybuty wirtualne.<\/p>\n<p>Dalsze techniczne lub specjalistyczne identyfikatory mog\u0105 by\u0107 rejestrowane jako klucze dodatkowe. Klucze dodatkowe mog\u0105 zawiera\u0107 atrybuty z dowolnymi prymitywnymi typami danych.<\/p>\n<p>Relacje mi\u0119dzy obiektami biznesowymi s\u0105 definiowane wy\u0142\u0105cznie za pomoc\u0105 klucza g\u0142\u00f3wnego. Ma to nast\u0119puj\u0105ce przyczyny:<\/p>\n<ul>\n<li>Klucz podstawowy jest kr\u00f3tki<\/li>\n<li>Klucz g\u0142\u00f3wny ma wysok\u0105 selektywno\u015b\u0107<\/li>\n<li>Klucz podstawowy obiektu biznesowego nie mo\u017ce ju\u017c zosta\u0107 zmieniony w p\u00f3\u017aniejszym terminie<\/li>\n<\/ul>\n<h6 id=\"wartosci-zerowe\" ><span class=\"ez-toc-section\" id=\"Wartosci_zerowe\"><\/span>Warto\u015bci zerowe<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p>Warto\u015bci zerowe dla atrybut\u00f3w klucza s\u0105 niedozwolone. Deweloper musi upewni\u0107 si\u0119, \u017ce atrybuty s\u0105 wype\u0142nione odpowiednimi warto\u015bciami. Przyk\u0142adowo, dla atrybutu typu <em>GUID<\/em> mo\u017ce to by\u0107 <em>ZEROGUID.<\/em><\/p>\n<h5 id=\"generowanie-kluczy-persistence-service\" ><span class=\"ez-toc-section\" id=\"Generowanie_kluczy_Persistence_service\"><\/span>Generowanie kluczy <em>Persistence service<\/em><span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p><em>Persistence service<\/em> identyfikuje instancj\u0119 obiektu biznesowego poprzez techniczn\u0105 reprezentacj\u0119 klucza instancji obiektu biznesowego. Ten klucz <em>Persistence service<\/em> jest tablic\u0105 bajt\u00f3w, w kt\u00f3rej przechowywane s\u0105 atrybuty klucza, powi\u0105zana baza danych i klasa obiektu biznesowego. Zawiera r\u00f3wnie\u017c informacje takie jak typ klucza i d\u0142ugo\u015bci atrybut\u00f3w.<\/p>\n<p>Klasa obiektu biznesowego ma metody generowania klucza us\u0142ugi trwa\u0142o\u015bci dla klucza. Metoda tworzenia reprezentacji technicznej jest generowana dla ka\u017cdego zdefiniowanego klucza obiektu biznesowego. Nazwa metody jest tworzona z przedrostka <em>build,<\/em> nazwy klucza obiektu biznesowego i przyrostka <em>Key.<\/em> Warto\u015bci atrybut\u00f3w klucza s\u0105 przekazywane do metody jako parametry, np. metoda dla klucza podstawowego nosi nazw\u0119 <em>buildPrimaryKey().<\/em> Klucze <em>Persistence service<\/em> nie s\u0105 unikatowe dla instancji obiektu biznesowego i mog\u0105 nast\u0119pnie ulec zmianie, gdy s\u0105 u\u017cywane w <em>Persistence service<\/em>. Z tego powodu nie wolno u\u017cywa\u0107 kluczy us\u0142ugi trwa\u0142o\u015bci jako kluczy na przyk\u0142ad w <em>CisHashMaps.<\/em><\/p>\n<h5 id=\"referencje-obiektow\" ><span class=\"ez-toc-section\" id=\"Referencje_obiektow\"><\/span>Referencje obiekt\u00f3w<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\"> Referencje obiekt\u00f3w mog\u0105 by\u0107 u\u017cywane wy\u0142\u0105cznie przez Comarch ERP Enterprise. W przysz\u0142o\u015bci referencje obiekt\u00f3w nie b\u0119d\u0105 ju\u017c obs\u0142ugiwane.<\/div><\/section>\n<p>Je\u015bli referencje obiekt\u00f3w s\u0105 nadal u\u017cywane, nale\u017cy je jak najszybciej usun\u0105\u0107. Alternatywnie mo\u017cna u\u017cy\u0107 tablicy bajt\u00f3w o wystarczaj\u0105cej d\u0142ugo\u015bci (np. 256 bajt\u00f3w), w kt\u00f3rej przechowywany jest klucz podstawowy obiektu, do kt\u00f3rego si\u0119 odwo\u0142ano, zbudowany za pomoc\u0105 <em>buildPrimaryKey.<\/em><\/p>\n<p>Referencja obiektu to tablica bajt\u00f3w o ograniczonej d\u0142ugo\u015bci, kt\u00f3ra identyfikuje dok\u0142adnie jedn\u0105 instancj\u0119 obiektu biznesowego. Mo\u017ce by\u0107 u\u017cywany do odwo\u0142ywania si\u0119 do innej nieznanej instancji obiektu biznesowego z instancji obiektu biznesowego. Referencja obiektu jest niezale\u017cna od d\u0142ugo\u015bci klucza g\u0142\u00f3wnego obiektu biznesowego, do kt\u00f3rego si\u0119 odwo\u0142uje. Reprezentuje po\u015brednictwo, kt\u00f3re przypisuje klucz o okre\u015blonej maksymalnej d\u0142ugo\u015bci do klucza podstawowego instancji obiektu biznesowego. Je\u015bli klucz podstawowy jest kr\u00f3tszy ni\u017c maksymalna d\u0142ugo\u015b\u0107, odniesienie do obiektu jest obliczane na tej podstawie w czasie wykonywania. Je\u015bli klucz g\u0142\u00f3wny jest d\u0142u\u017cszy, przypisanie mi\u0119dzy kluczami jest zapisywane w obiekcie biznesowym <em>com.cisag.sys.kernel.obj.ObjectReference,<\/em> poniewa\u017c w tym przypadku klucz nie mo\u017ce zosta\u0107 obliczony. Ze wzgl\u0119du na ograniczon\u0105 d\u0142ugo\u015b\u0107 odniesienia do obiektu, mo\u017cliwe jest zapisanie go w binarnym typie danych bez u\u017cycia BLOB. Referencja obiektu mo\u017ce by\u0107 u\u017cywana w taki sam spos\u00f3b jak klucz <em>Persistence service<\/em> w celu uzyskania dost\u0119pu do instancji obiektu biznesowego (np. poprzez <em>getObject()<\/em>).<\/p>\n<p>Referencj\u0119 obiektu instancji obiektu biznesowego, kt\u00f3ry nie jest przej\u015bciowy, mo\u017cna uzyska\u0107 za pomoc\u0105 metody <em>get_objectReference()<\/em> klasy obiektu biznesowego. W tym celu nale\u017cy najpierw otworzy\u0107 transakcj\u0119. W zale\u017cno\u015bci od d\u0142ugo\u015bci klucza g\u0142\u00f3wnego, przypisanie klucza jest zapisywane, je\u015bli nie utworzono jeszcze odniesienia do obiektu dla instancji. Odbywa si\u0119 to w spos\u00f3b przejrzysty dla dewelopera. Transakcja musi by\u0107 zawsze potwierdzona przez <em>commit,<\/em> aby wygenerowa\u0107 prawid\u0142owe odniesienie do obiektu. W przeciwnym razie zwr\u00f3cone odniesienie do obiektu jest nieprawid\u0142owe. \u017badne odniesienie do obiektu nie mo\u017ce by\u0107 zapytane o przej\u015bciow\u0105 instancj\u0119 obiektu biznesowego.<\/p>\n<p>Podczas odpytywania odniesienia do obiektu dla instancji obiektu biznesowego zale\u017cnego od czasu, zawsze wskazuje to na bie\u017c\u0105c\u0105 wersj\u0119.<\/p>\n<p>Odniesienia do obiekt\u00f3w powinny by\u0107 u\u017cywane tylko w wyj\u0105tkowych przypadkach z nast\u0119puj\u0105cych powod\u00f3w:<\/p>\n<ul>\n<li>W j\u0119zyku OQL nie mo\u017cna zdefiniowa\u0107 sprz\u0119\u017cenia z obiektem, do kt\u00f3rego istnieje odwo\u0142anie, poprzez odwo\u0142anie do obiektu.<\/li>\n<li>Sterownik ODBC i inne narz\u0119dzia pracuj\u0105ce z baz\u0105 danych ERP nie potrafi\u0105 rozpoznawa\u0107 referencji do obiekt\u00f3w.<\/li>\n<li>Zapytanie o referencj\u0119 do obiektu wymaga transakcji, kt\u00f3ra musi zosta\u0107 zako\u0144czona poleceniem <em>commit.<\/em> Nieprawid\u0142owe u\u017cycie mo\u017ce w pewnych okoliczno\u015bciach prowadzi\u0107 do niewykrywalnych b\u0142\u0119d\u00f3w.<\/li>\n<\/ul>\n<h5 id=\"atrybuty-part\" ><span class=\"ez-toc-section\" id=\"Atrybuty_Part\"><\/span>Atrybuty <em>Part<\/em><span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>W klasie obiektu biznesowego generowanych jest kilka metod dost\u0119pu do atrybutu cz\u0119\u015bci:<\/p>\n<ul>\n<li>Metoda <em>get&lt;AttributName&gt;()<\/em> zwraca niezmienn\u0105 instancj\u0119 klasy<em> Imutable Part<\/em>, z kt\u00f3rej mo\u017cna uzyska\u0107 warto\u015bci atrybut\u00f3w cz\u0119\u015bci za pomoc\u0105 odpowiednich metod <em>..()<\/em><\/li>\n<li>Metoda <em>getMutable&lt;nazwa atrybutu&gt;()<\/em> zwraca mutowaln\u0105 instancj\u0119 mutowalnej klasy <em>Part,<\/em> na kt\u00f3rej warto\u015bci atrybut\u00f3w mo\u017cna wyszukiwa\u0107 za pomoc\u0105 odpowiednich metod<em> ..()<\/em> lub ustawia\u0107 za pomoc\u0105 metod <em>set&#8230;().<\/em> Nie zmienia to obiektu stanu instancji obiektu biznesowego, a jedynie instancj\u0119 cz\u0119\u015bci. Zmieniona instancja cz\u0119\u015bci musi zosta\u0107 ponownie jawnie przeniesiona do instancji obiektu biznesowego.<\/li>\n<li>Metoda <em>set()<\/em> dla atrybutu cz\u0119\u015bci zapisuje zmienn\u0105 instancj\u0119 <em>Part<\/em> w obiekcie stanu instancji obiektu biznesowego. Oznacza to, \u017ce wszelkie zmiany wprowadzone w instancji cz\u0119\u015bci s\u0105 przenoszone do instancji obiektu biznesowego.<\/li>\n<\/ul>\n<p>W OQL prymitywne atrybuty cz\u0119\u015bci, ale nie kompletna cz\u0119\u015b\u0107, mog\u0105 by\u0107 odpytywane z atrybut\u00f3w cz\u0119\u015bci. Nazwa atrybutu cz\u0119\u015bci mo\u017ce by\u0107 u\u017cywana z OQL jako warto\u015b\u0107 logiczna do zapytania, czy atrybut cz\u0119\u015bci w instancji obiektu biznesowego ma warto\u015b\u0107 <em>null.<\/em> Je\u015bli atrybut cz\u0119\u015bci nie ma warto\u015bci <em>null,<\/em> warto\u015b\u0107 logiczna to <em>TRUE.<\/em> Prymitywne atrybuty cz\u0119\u015bci maj\u0105 prawid\u0142owe warto\u015bci tylko wtedy, gdy atrybut cz\u0119\u015bci w instancji obiektu biznesowego nie jest <em>null.<\/em><\/p>\n<h5 id=\"zaleznosc-od-czasu\" ><span class=\"ez-toc-section\" id=\"Zaleznosc_od_czasu\"><\/span>Zale\u017cno\u015b\u0107 od czasu<a id=\"PS3\"><\/a><span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Zale\u017cno\u015b\u0107 czasowa dla obiektu biznesowego jest konfigurowana w aplikacji<em> Obiekty deweloperskie<\/em> w zak\u0142adce <em>Ustawienia.<\/em> Nast\u0119puj\u0105ce typy s\u0105 obs\u0142ugiwane w ten sam spos\u00f3b przez <em>Persistence service<\/em>:<\/p>\n<ul>\n<li><em>Bez<\/em><\/li>\n<li><em>Dodawaj zawsze nowy rekord danych<\/em><\/li>\n<li><em>Pisz zawsze w aktualnym rekordzie danych<\/em><\/li>\n<li><em>Sterowany przez aplikacj\u0119<\/em><\/li>\n<li><em>Data ze stref\u0105 czasow\u0105 przez aplikacj\u0119<\/em><\/li>\n<li><em>Czas ze stref\u0105 czasow\u0105 przez aplikacj\u0119<\/em><\/li>\n<\/ul>\n<p>Je\u015bli jeden z tych typ\u00f3w zale\u017cno\u015bci od czasu zosta\u0142 ustawiony dla obiektu biznesowego, w\u00f3wczas obiekt biznesowy jest zale\u017cny od czasu dla <em>Persistence service<\/em>. To, czy konkretna instancja obiektu biznesowego jest zale\u017cna od czasu, mo\u017cna sprawdzi\u0107 za pomoc\u0105 metody <em>is_timeDependent()<\/em> klasy obiektu biznesowego.<\/p>\n<p>Obiekt biznesowy i wszystkie obiekty zale\u017cne musz\u0105 mie\u0107 ten sam typ zale\u017cno\u015bci od czasu. Zabronione jest, aby obiekt zale\u017cny mia\u0142 inny typ zale\u017cno\u015bci czasowej ni\u017c obiekt biznesowy.<\/p>\n<h6 id=\"okres-obowiazywania\" ><span class=\"ez-toc-section\" id=\"Okres_obowiazywania\"><\/span>Okres obowi\u0105zywania<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p>Obiekty biznesowe zale\u017cne od czasu maj\u0105 przedzia\u0142 obowi\u0105zywania. Jest on zapisywany w specjalnych atrybutach <em>validFrom <\/em>i <em>validUntil <\/em>obiektu biznesowego zale\u017cnego od daty. Data zapisana w atrybucie <em>validFrom wskazuje <\/em>pocz\u0105tek okresu obowi\u0105zywania, a data zapisana w atrybucie <em>validUntil <\/em>wskazuje koniec okresu obowi\u0105zywania. Czas <em>validFrom <\/em>nale\u017cy do okresu obowi\u0105zywania, ale czas okre\u015blony przez <em>validUntil <\/em>ju\u017c nie.<\/p>\n<p>Okres obowi\u0105zywania wszystkich instancji obiekt\u00f3w zale\u017cnych i instancji obiektu biznesowego musi by\u0107 identyczny. Zabronione jest, aby instancja zale\u017cna mia\u0142a inny okres obowi\u0105zywania ni\u017c instancja jednostki biznesowej.<\/p>\n<h6 id=\"rozszerzenie-unikalnych-kluczy\" ><span class=\"ez-toc-section\" id=\"Rozszerzenie_unikalnych_kluczy\"><\/span>Rozszerzenie unikalnych kluczy<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p>Wszystkie zdefiniowane unikalne klucze s\u0105 niejawnie rozszerzane o atrybut <em>validFrom<\/em> dla obiektu biznesowego zale\u017cnego od czasu. Oznacza to, \u017ce unikalno\u015b\u0107 warto\u015bci klucza nie jest ju\u017c gwarantowana przez <em>Persistence service<\/em> lub baz\u0119 danych. Kilka instancji mo\u017ce teraz istnie\u0107 dla okre\u015blonej warto\u015bci klucza, kt\u00f3re s\u0105 wa\u017cne od r\u00f3\u017cnych punkt\u00f3w w czasie. W zwi\u0105zku z tym m\u00f3wi si\u0119 r\u00f3wnie\u017c o wersjach instancji obiektu biznesowego. Ich przedzia\u0142y obowi\u0105zywania nie mog\u0105 si\u0119 pokrywa\u0107 i nie mog\u0105 wyst\u0119powa\u0107 luki. Wersja jest wa\u017cna dla dok\u0142adnie jednego punktu w czasie, je\u015bli mie\u015bci si\u0119 on w jej przedziale obowi\u0105zywania. Aktualnie obowi\u0105zuj\u0105c\u0105 wersj\u0105 instancji obiektu biznesowego zale\u017cnego od czasu jest wersja, w kt\u00f3rej przedziale obowi\u0105zywania znajduje si\u0119 bie\u017c\u0105cy punkt w czasie.<\/p>\n<p>Zmiany warto\u015bci klucza nie s\u0105 dozwolone w przypadku instancji obiekt\u00f3w biznesowych zale\u017cnych od czasu, poniewa\u017c us\u0142uga trwa\u0142o\u015bci nie uwzgl\u0119dnia automatycznie wszystkich powi\u0105zanych wersji.<\/p>\n<h6 id=\"generowanie-kluczy-persistence-service-dla-okreslonych-wersji\" ><span class=\"ez-toc-section\" id=\"Generowanie_kluczy_Persistence_service_dla_okreslonych_wersji\"><\/span>Generowanie kluczy <em>Persistence service<\/em> dla okre\u015blonych wersji<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p>Metoda <em>buildTimeDependentKey()<\/em> klasy obiektu biznesowego s\u0142u\u017cy do generowania klucza <em>Persistence service<\/em> w celu otwarcia okre\u015blonej wersji. Warto\u015b\u0107 klucza g\u0142\u00f3wnego i znacznik czasu z atrybutu <em>validFrom s\u0105 <\/em>przekazywane do tej metody jako parametry. Klucz <em>Persistence service<\/em> zale\u017cny od czasu instancji obiektu biznesowego mo\u017cna sprawdzi\u0107 za pomoc\u0105 metody <em>get_timeDependentKey().<\/em><\/p>\n<p>Bie\u017c\u0105ca wersja jest otwierana za pomoc\u0105 konwencjonalnie wygenerowanych kluczy <em>Persistence service<\/em>.<\/p>\n<h6 id=\"dostep-do-sasiednich-wersji\" ><span class=\"ez-toc-section\" id=\"Dostep_do_sasiednich_wersji\"><\/span>Dost\u0119p do s\u0105siednich wersji<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p>W przypadku wersji zale\u017cnej od czasu, bezpo\u015brednia nast\u0119pna wersja mo\u017ce by\u0107 odpytywana przy u\u017cyciu metody <em>retrieve_nextVersion()<\/em> lub bezpo\u015brednia poprzednia wersja przy u\u017cyciu metody <em>retrieve_previousVersion().<\/em><\/p>\n<h5 id=\"atrybuty-nls\" ><span class=\"ez-toc-section\" id=\"Atrybuty_NLS\"><\/span>Atrybuty <em>NLS<\/em><span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>NLS to skr\u00f3t od <em>National Language Support. Atrybut NLS jest <\/em>atrybutem wieloj\u0119zycznym opartym na typie pierwotnym <em>String,<\/em> dla kt\u00f3rego ustawiono funkcj\u0119 <em>Mo\u017cliwych wiele j\u0119zyk\u00f3w<\/em>. Je\u015bli atrybut ma przypisany lokalny logiczny typ danych, warto\u015b\u0107 mo\u017ce by\u0107 dost\u0119pna w kilku t\u0142umaczeniach. T\u0142umaczenia atrybutu s\u0105 zapisywane w oddzielnym obiekcie biznesowym <em>NLS.<\/em> Baza danych ma zawsze przypisany j\u0119zyk g\u0142\u00f3wny i ewentualnie kilka j\u0119zyk\u00f3w dodatkowych. Warto\u015b\u0107 w g\u0142\u00f3wnym j\u0119zyku atrybutu jest zapisywana w tabeli powi\u0105zanego obiektu biznesowego i dlatego mo\u017ce by\u0107 szybko odpytywana. Warto\u015bci j\u0119zyk\u00f3w drugorz\u0119dnych (t\u0142umacze\u0144) atrybutu s\u0105 przechowywane w oddzielnej tabeli obiektu <em>NLS.<\/em> Z punktu widzenia tw\u00f3rcy aplikacji dost\u0119p do atrybutu <em>NLS<\/em> jest w du\u017cej mierze przejrzysty.<\/p>\n<section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">Otwarcie obiektu biznesowego z atrybutami <em>NLS<\/em> w j\u0119zyku g\u0142\u00f3wnym zajmuje znacznie mniej czasu ni\u017c otwarcie tego samego obiektu w j\u0119zyku dodatkowym.<\/div><\/section>\n<p>Typ danych ustawiony dla obiektu biznesowego w bazie danych OLTP wp\u0142ywa na to, kt\u00f3re j\u0119zyki dodatkowe s\u0105 u\u017cywane. Obiekty biznesowe z typem danych <em>Konfiguracyjne dane podstawowe<\/em> mog\u0105 r\u00f3wnie\u017c mie\u0107 j\u0119zyki pomocnicze bazy danych repozytorium w atrybutach <em>NLS<\/em> opr\u00f3cz j\u0119zyk\u00f3w pomocniczych bazy danych OLTP.<\/p>\n<h3 id=\"obiekt-biznesowy-nls\" ><span class=\"ez-toc-section\" id=\"Obiekt_biznesowy_NLS\"><\/span>Obiekt biznesowy <em>NLS<\/em><span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Obiekty biznesowe <em>NLS<\/em> maj\u0105 typ <em>Dependent.<\/em> S\u0105 one zarz\u0105dzane automatycznie przez system. Obiekt biznesowy <em>NLS<\/em> odpowiada atrybutowi wieloj\u0119zycznemu. Nazwa sk\u0142ada si\u0119 z nazwy obiektu biznesowego zawieraj\u0105cego atrybut wieloj\u0119zyczny i nazwy kolumny tabeli bazy danych atrybutu wieloj\u0119zycznego. Podczas generowania powi\u0105zanego obiektu biznesowego obiekt biznesowy <em>NLS<\/em> jest automatycznie tworzony w przestrzeni nazw <em>NLS,<\/em> kt\u00f3ra r\u00f3\u017cni si\u0119 od oryginalnej przestrzeni nazw tym, \u017ce ci\u0105g znak\u00f3w <em>nls<\/em> jest wstawiany po prefiksie rozwoju, np. <em>com.cisag.nls.<\/em> Usuni\u0119cie atrybutu wieloj\u0119zyczno\u015bci lub obiektu biznesowego powoduje r\u00f3wnie\u017c usuni\u0119cie powi\u0105zanego obiektu biznesowego <em>NLS.<\/em><\/p>\n<p>Obiekt biznesowy <em>NLS<\/em> ma nast\u0119puj\u0105ce atrybuty:<\/p>\n<ul>\n<li><strong>Prefiks <em>X_<\/em> + nazwa atrybutu <em>Primary key<\/em> powi\u0105zanego obiektu biznesowego<\/strong> &#8212; obiekt biznesowy <em>NLS<\/em> zawiera wszystkie atrybuty klucza g\u0142\u00f3wnego powi\u0105zanego obiektu biznesowego. Aby zapewni\u0107 unikaln\u0105 nazw\u0119 atrybutu w obiekcie biznesowym <em>NLS,<\/em> nazwa atrybutu jest poprzedzona prefiksem <em>X_.<\/em> Klucz podstawowy jest wymagany tylko przez <em>Persistence service<\/em> dla zapyta\u0144 i widok\u00f3w OQL. Je\u015bli powi\u0105zany obiekt biznesowy ma typ jednostki biznesowej, relacja <em>_entity<\/em> zale\u017cno\u015bci <em>NLS<\/em> jest zdefiniowana na tych atrybutach.<\/li>\n<li><strong>validFrom<\/strong> &#8212; je\u015bli powi\u0105zany obiekt biznesowy jest zale\u017cny od czasu, obiekt biznesowy <em>NLS<\/em> zawiera r\u00f3wnie\u017c atrybut <em>validFrom<\/em><\/li>\n<li><strong>objectReference<\/strong> &#8212; ten atrybut zawiera odniesienie do obiektu powi\u0105zanego obiektu biznesowego. W przypadku dost\u0119pu do <em>Persistence service,<\/em> za po\u015brednictwem kluczy <em>Persistence service<\/em> (np. <em>getObject()<\/em>) j\u0105dro systemu operacyjnego ustanawia po\u0142\u0105czenie z obiektu biznesowego do obiektu biznesowego <em>NLS<\/em> za po\u015brednictwem referencji obiektu biznesowego.<\/li>\n<li><strong>language<\/strong> &#8212; ten atrybut zawiera j\u0119zyk, w kt\u00f3rym dost\u0119pne jest t\u0142umaczenie<\/li>\n<li><strong>value<\/strong> &#8212; ten atrybut zawiera t\u0142umaczenie<\/li>\n<li><strong>Prefiks <em>X_ <\/em>+ nazwa atrybutu <em>Primary key<\/em> powi\u0105zanego obiektu biznesowego jednostki<\/strong> &#8212; je\u015bli powi\u0105zany obiekt biznesowy ma typ <em>Dependent,<\/em> do\u0142\u0105czane s\u0105 r\u00f3wnie\u017c atrybuty <em>Primary key<\/em> powi\u0105zanej jednostki biznesowego. W tym przypadku relacja <em>_entity<\/em> do jednostki biznesowej jest zdefiniowana na podstawie tych atrybut\u00f3w.<\/li>\n<\/ul>\n<p>Ka\u017cdy obiekt <em>NLS<\/em> posiada klucz podstawowy i drugorz\u0119dny klucz unikalny. Klucz podstawowy jest tworzony z atrybut\u00f3w <em>objectReference, language<\/em> i <em>validFrom<\/em> (tylko z zale\u017cno\u015bci\u0105 od czasu).<\/p>\n<p>Klucz drugorz\u0119dny jest tworzony z atrybut\u00f3w klucza g\u0142\u00f3wnego <em>language<\/em> obiektu biznesowego oraz, w przypadku zale\u017cno\u015bci od czasu, z atrybutu <em>validFrom<\/em>.<\/p>\n<h5 id=\"zmiana-informacji-usuniecie-techniczne\" ><span class=\"ez-toc-section\" id=\"Zmiana_informacjiusuniecie_techniczne\"><\/span>Zmiana informacji\/usuni\u0119cie techniczne<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Je\u015bli opcja <em>Zapisuj u\u017cytkownika i czas<\/em> zosta\u0142a aktywowana dla obiektu biznesowego, z\u0142o\u017cony atrybut <em>UpdateInformation <\/em>jest dodawany do obiektu biznesowego, kt\u00f3ry odnotowuje czas i u\u017cytkownika, kt\u00f3ry utworzy\u0142, ostatnio zmieni\u0142 lub profesjonalnie usun\u0105\u0142 instancj\u0119. Specjalistyczny znacznik usuwania nie jest oceniany przez <em>Persistence service<\/em>; jest zarezerwowany dla aplikacji.<\/p>\n<p>Metoda <em>is_updateInfoRequired()<\/em> klasy obiektu biznesowego mo\u017ce by\u0107 u\u017cyta do zapytania, czy informacje o aktualizacji powinny by\u0107 przechowywane dla obiektu biznesowego. Poni\u017csze metody s\u0105 generowane tylko dla obiekt\u00f3w biznesowych z aktywnym logowaniem:<\/p>\n<ul>\n<li>Metoda <em>getUpdateInfo()<\/em> zwraca niemodyfikowaln\u0105 instancj\u0119 cz\u0119\u015bci <em>UpdateInformation,<\/em> z kt\u00f3rej dane mog\u0105 by\u0107 odpytywane za pomoc\u0105 odpowiednich metod <em>..()<\/em><\/li>\n<li>Metoda <em>getUpdateInfoMutable()<\/em> zwraca modyfikowaln\u0105 instancj\u0119 cz\u0119\u015bci <em>UpdateInformation,<\/em> z kt\u00f3rej dane mog\u0105 by\u0107 odpytywane za pomoc\u0105 odpowiednich metod <em>..()<\/em> lub zmieniane za pomoc\u0105 metod <em>set&#8230;()<\/em><\/li>\n<li>Modyfikowalna instancja cz\u0119\u015bci mo\u017ce zosta\u0107 przekazana do metody <em>setUpdateInfo()<\/em> w celu zapisania w instancji obiektu biznesowego<\/li>\n<\/ul>\n<p>Metoda <em>set_deleted()<\/em> s\u0142u\u017cy do zmiany funkcjonalnego znacznika usuwania. Znacznik usuwania mo\u017cna sprawdzi\u0107 za pomoc\u0105 metody <em>is_deleted().<\/em> Te dwie metody s\u0105 r\u00f3wnie\u017c zaimplementowane dla klas obiekt\u00f3w biznesowych, kt\u00f3rych obiekty biznesowe nie maj\u0105 informacji o aktualizacji. W tym przypadku mog\u0105 one by\u0107 u\u017cywane tylko dla instancji przej\u015bciowych.<\/p>\n<h4 id=\"trwale-i-przejsciowe-instancje-obiektu-biznesowego\" ><span class=\"ez-toc-section\" id=\"Trwale_i_przejsciowe_instancje_obiektu_biznesowego\"><\/span>Trwa\u0142e i przej\u015bciowe instancje obiektu biznesowego<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Instancja obiektu biznesowego ma dwa stany w odniesieniu do bazy danych i przynale\u017cno\u015bci do transakcji. Stany te mo\u017cna sprawdzi\u0107 za pomoc\u0105 metod <em>is_persistent(), is_newObject()<\/em> i <em>is_transient().<\/em><\/p>\n<p>Metoda <em>is_persistent()<\/em> s\u0142u\u017cy do okre\u015blenia, czy instancja obiektu biznesowego jest przechowywana w bazie danych. Je\u015bli wy\u015bwietlone zostanie <em>true,<\/em> instancja istnieje w bazie danych; je\u015bli jednak wy\u015bwietlone zostanie <em>false,<\/em> w\u00f3wczas ona nie istnieje.<\/p>\n<p>Metoda is <em>transient()<\/em> mo\u017ce by\u0107 u\u017cyta do okre\u015blenia, czy instancja obiektu biznesowego ma kontekst transakcji, tj. czy instancja jest przechowywana w pami\u0119ci podr\u0119cznej transakcji bie\u017c\u0105cej transakcji, czy nie. Je\u015bli wy\u015bwietlona zostanie <em>false,<\/em> w\u00f3wczas instancja obiektu biznesowego ma kontekst transakcji i jest wa\u017cna tylko w bie\u017c\u0105cej transakcji. Je\u015bli wy\u015bwietlone zostanie <em>true,<\/em> w\u00f3wczas instancja nie jest powi\u0105zana z transakcj\u0105.<\/p>\n<p>W przypadku nowych obiekt\u00f3w, kt\u00f3re zosta\u0142y zarejestrowane do zapisu za pomoc\u0105 funkcji <em>putObject()<\/em>, ale nie zosta\u0142y jeszcze zapisane w bazie danych (transakcja <em>Top Level<\/em> nie zosta\u0142a jeszcze zatwierdzona), metoda <em>is_persistent()<\/em> wy\u015bwietla warto\u015b\u0107 <em>false<\/em>. To, czy obiekt zosta\u0142 ju\u017c zarejestrowany do zapisania, mo\u017cna okre\u015bli\u0107 za pomoc\u0105 metody <em>is_newObject().<\/em> Metoda ta wy\u015bwietla <em>false,<\/em> je\u015bli obiekt nie jest trwa\u0142y ani nie zosta\u0142 zarejestrowany za pomoc\u0105 <em>putObject().<\/em><\/p>\n<p>Podczas pracy z obiektami biznesowymi nale\u017cy przestrzega\u0107 tych znacznik\u00f3w, aby tworzy\u0107 aplikacje zgodne z Comarch ERP Enterprise. Nietrwa\u0142a instancja obiektu biznesowego, kt\u00f3ra zosta\u0142a otwarta za po\u015brednictwem <em>Persistence service<\/em>, jest zawsze powi\u0105zana z bie\u017c\u0105c\u0105 transakcj\u0105 i jest niewa\u017cna po zako\u0144czeniu transakcji. Je\u015bli instancja obiektu biznesowego zostanie otwarta w podtransakcji, instancja ta mo\u017ce by\u0107 u\u017cywana tylko tak d\u0142ugo, jak d\u0142ugo otwarta jest podtransakcja. Dalsze korzystanie z instancji poza transakcj\u0105 mo\u017ce prowadzi\u0107 do b\u0142\u0119d\u00f3w programu i dlatego jest niedozwolone.<\/p>\n<section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">Metody <em>putObject()<\/em> i <em>deleteObject()<\/em> w <em>Managerze Obiekt\u00f3w<\/em> zawsze oczekuj\u0105 nieprzeno\u015bnych instancji obiekt\u00f3w biznesowych jako parametr\u00f3w, kt\u00f3re zosta\u0142y otwarte lub utworzone przy u\u017cyciu metod <em>getObject(), getObjectIterator()<\/em> i <em>getObjectArray()<\/em>, okre\u015blaj\u0105c odpowiednie znaczniki dost\u0119pu.<\/div><\/section>\n<p>Stany instancji obiektu biznesowego s\u0105 zatem okre\u015blane w nast\u0119puj\u0105cy spos\u00f3b:<\/p>\n<ul>\n<li>Instancja, kt\u00f3ra zosta\u0142a odczytana przy u\u017cyciu metody <em>getObject()<\/em> w trybie dost\u0119pu <em>READ, READ_UPDATE<\/em> lub <em>READ_WRITE<\/em> (instancja istnieje w bazie danych) jest trwa\u0142a i nieprzechodnia. Instancja, kt\u00f3ra zosta\u0142a odczytana przy u\u017cyciu metody <em>getObject()<\/em> w trybie dost\u0119pu <em>READ_WRITE<\/em> (instancja nie istnieje w bazie danych) nie jest trwa\u0142a i nie jest przej\u015bciowa. Je\u015bli instancja nie zosta\u0142a jeszcze zarejestrowana w pami\u0119ci podr\u0119cznej transakcji, znacznik <em>is_newObject()<\/em> ma warto\u015b\u0107 <em>true.<\/em><\/li>\n<li>Kopi\u0119 przej\u015bciow\u0105 mo\u017cna utworzy\u0107 za pomoc\u0105 metody <em>getTransientCopy().<\/em> Znacznik trwa\u0142o\u015bci jest przenoszona do nowo utworzonej kopii przej\u015bciowej.<\/li>\n<li>Instancja utworzona przy u\u017cyciu metody <em>newTransientInstance()<\/em> nie jest trwa\u0142a ani przej\u015bciowa<\/li>\n<li>Warto\u015bci atrybut\u00f3w mog\u0105 by\u0107 kopiowane mi\u0119dzy instancjami przej\u015bciowymi i nieprzechodnimi za pomoc\u0105 metody <em>copyTo()<\/em><\/li>\n<li>Metoda <em>getObject()<\/em> jest reprezentatywna dla metod <em>getObjectArray()<\/em> i <em>getObjectIterator(),<\/em> kt\u00f3re wewn\u0119trznie odwo\u0142uj\u0105 si\u0119 do metody <em>getObject()<\/em><\/li>\n<\/ul>\n<h5 id=\"metoda-gettransientcopy\" ><span class=\"ez-toc-section\" id=\"Metoda_getTransientCopy\"><\/span>Metoda <em>getTransientCopy()<\/em><span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Je\u015bli instancja obiektu biznesowego zosta\u0142a otwarta przez baz\u0119 danych za pomoc\u0105 <em>Manager obiekt\u00f3w<\/em>, nie jest ona przej\u015bciowa i jest powi\u0105zana z transakcj\u0105 \u0142adowania. Aby u\u017cy\u0107 instancji mi\u0119dzy transakcjami, nale\u017cy utworzy\u0107 now\u0105 przej\u015bciow\u0105 kopi\u0119 za pomoc\u0105 metody<em> getTransientCopy()<\/em> klasy obiektu biznesowego. Opr\u00f3cz warto\u015bci atrybut\u00f3w kopiowana jest r\u00f3wnie\u017c znacznik <em>persistent,<\/em> a znacznik <em>transient<\/em> ustawiany jest na <em>true.<\/em> Utworzona przej\u015bciowa instancja obiektu biznesowego nie nale\u017cy do \u017cadnej transakcji i mo\u017ce by\u0107 u\u017cywana mi\u0119dzy transakcjami. Ta metoda jest bardzo przydatna, je\u015bli u\u017cytkownik chcia\u0142by zapami\u0119ta\u0107 zawarto\u015b\u0107 instancji obiektu biznesowego po zako\u0144czeniu transakcji, np. do wy\u015bwietlania <em>GUI.<\/em><\/p>\n<h5 id=\"metoda-newtransientinstance\" ><span class=\"ez-toc-section\" id=\"Metoda_newTransientInstance\"><\/span>Metoda <em>newTransientInstance()<\/em><span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Metoda <em>newTransientInstance()<\/em> klasy obiektu biznesowego tworzy pust\u0105, przej\u015bciow\u0105, nietrwa\u0142\u0105 instancj\u0119 obiektu biznesowego <em>(is_persistent()<\/em> wy\u015bwietla <em>false, is_transient()<\/em> wy\u015bwietls <em>true).<\/em><\/p>\n<h5 id=\"metoda-copyto\" ><span class=\"ez-toc-section\" id=\"Metoda_copyTo\"><\/span>Metoda <em>copyTo()<\/em><span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Metoda <em>copyTo()<\/em> klasy obiektu biznesowego mo\u017ce by\u0107 u\u017cywana do kopiowania warto\u015bci atrybut\u00f3w instancji do innej instancji tego samego obiektu biznesowego. \u0179r\u00f3d\u0142em lub celem mog\u0105 by\u0107 trwa\u0142e lub przej\u015bciowe instancje. W ka\u017cdym przypadku <em>copyTo()<\/em> zawsze przenosi warto\u015bci atrybut\u00f3w i klucz biznesowy \u017ar\u00f3d\u0142a do celu. Specjalne traktowanie jest stosowane w nast\u0119puj\u0105cych przypadkach:<\/p>\n<ul>\n<li>Je\u015bli obiekt docelowy jest instancj\u0105 przej\u015bciow\u0105, znacznik trwa\u0142o\u015bci i klucz podstawowy s\u0105 r\u00f3wnie\u017c kopiowane ze \u017ar\u00f3d\u0142a<\/li>\n<li>Je\u015bli obiekt docelowy jest instancj\u0105 nietrwa\u0142\u0105, kopiowany jest klucz g\u0142\u00f3wny \u017ar\u00f3d\u0142a<\/li>\n<li>Je\u015bli obiekt docelowy jest przej\u015bciowy, a informacje o aktualizacji s\u0105 wymagane dla klasy obiektu biznesowego, ca\u0142a informacja o aktualizacji jest kopiowana ze \u017ar\u00f3d\u0142a. Funkcjonalna znacznika usuwania \u017ar\u00f3d\u0142a (znacznik usuwania) jest zawsze kopiowana do celu.<\/li>\n<li>Je\u015bli cel jest przej\u015bciowy i zale\u017cny od czasu, kopiowane s\u0105 atrybuty <em>validFrom<\/em> i <em>validUntil<\/em> \u017ar\u00f3d\u0142a<\/li>\n<\/ul>\n<section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">\u017baden atrybut ani znacznik, kt\u00f3re mog\u0142yby zmieni\u0107 kontekst transakcji obiektu biznesowego, nie s\u0105 kopiowane do nietrwa\u0142ego, trwa\u0142ego obiektu docelowego. Wszystko jest kopiowane do przej\u015bciowego obiektu docelowego.<\/div><\/section>\n<h5 id=\"metoda-set_persistent\" ><span class=\"ez-toc-section\" id=\"Metoda_set_persistent\"><\/span>Metoda <em>set_persistent()<\/em><span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Znacznik <em>persistent<\/em> mo\u017ce zosta\u0107 zmieniona dla obiekt\u00f3w przej\u015bciowych za pomoc\u0105 metody <em>set_persistent();<\/em> dla obiekt\u00f3w nieprzechodnich metoda ta prowadzi do b\u0142\u0119du wykonania.<\/p>\n<h5 id=\"specjalne-metody-klasy-obiektow-biznesowych\" ><span class=\"ez-toc-section\" id=\"Specjalne_metody_klasy_obiektow_biznesowych\"><\/span>Specjalne metody klasy obiekt\u00f3w biznesowych<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Wygenerowana klasa obiekt\u00f3w biznesowych posiada specjalne metody dost\u0119pu do danych:<\/p>\n<table style=\"height: 324px; width: 100%; border-color: #000000; background-color: #ffffff; border-style: outset;\">\n<thead>\n<tr style=\"height: 23px;\">\n<td style=\"height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\" width=\"204\"><strong>Nazwa metody<\/strong><\/td>\n<td style=\"height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\" width=\"337\"><strong>Funkcja<\/strong><\/td>\n<\/tr>\n<\/thead>\n<tbody>\n<tr style=\"height: 46px;\">\n<td style=\"height: 46px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\" width=\"204\"><em>retrieve_instances()<\/em><\/td>\n<td style=\"height: 46px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\" width=\"337\">Ta metoda zapewnia iterator obiekt\u00f3w, kt\u00f3ry mo\u017ce by\u0107 u\u017cywany do iteracji po wszystkich instancjach obiektu biznesowego.<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\" width=\"204\"><em>get_type()<\/em><\/td>\n<td style=\"height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\" width=\"337\">Ta metoda zwraca sta\u0142\u0105 typu obiektu biznesowego.<\/td>\n<\/tr>\n<tr style=\"height: 46px;\">\n<td style=\"height: 46px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\" width=\"204\"><em>get_contentLanguage()<\/em><\/td>\n<td style=\"height: 46px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\" width=\"337\">Ta metoda zwraca j\u0119zyk tre\u015bci, w kt\u00f3rym zosta\u0142a otwarta instancja obiektu biznesowego.<\/td>\n<\/tr>\n<tr style=\"height: 93px;\">\n<td style=\"height: 93px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\" width=\"204\"><em>retrieve_entity()<\/em><\/td>\n<td style=\"height: 93px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\" width=\"337\">Ta metoda jest implementowana dla klasy obiektu biznesowego obiektu biznesowego typu <em>Dependent.<\/em> Zwraca ona instancj\u0119 obiektu biznesowego jednostki biznesowej, do kt\u00f3rej nale\u017cy instancja zale\u017cna.<\/td>\n<\/tr>\n<tr style=\"height: 93px;\">\n<td style=\"height: 93px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\" width=\"204\"><em>retrieve_dependents()<\/em><\/td>\n<td style=\"height: 93px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\" width=\"337\">Metoda ta jest zaimplementowana w klasie obiektu biznesowego typu <em>Jednostka biznesowa<\/em>. Zwraca ona iterator obiektu, kt\u00f3ry mo\u017ce by\u0107 u\u017cyty do iteracji po wszystkich instancjach powi\u0105zanych zale\u017cno\u015bci.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h4 id=\"part\" ><span class=\"ez-toc-section\" id=\"Part\"><\/span>Part<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p><em>Part<\/em>\u00a0s\u0105 u\u017cywane do realizacji z\u0142o\u017conych atrybut\u00f3w obiekt\u00f3w biznesowych. Definiuj\u0105 one struktur\u0119 danych, kt\u00f3ra podsumowuje grup\u0119 atrybut\u00f3w pod znacz\u0105c\u0105 nazw\u0105. Z\u0142o\u017cone atrybuty nie maj\u0105 w\u0142asnego klucza, ale s\u0105 cz\u0119\u015bci\u0105 obiektu biznesowego, st\u0105d nazwa <em>Part.<\/em><\/p>\n<p><em>Part<\/em> umo\u017cliwiaj\u0105 ponowne wykorzystanie struktur danych, kt\u00f3re zosta\u0142y raz zamodelowane dla r\u00f3\u017cnych obiekt\u00f3w biznesowych. Cz\u0119\u015b\u0107 nie ma w\u0142asnej tabeli w bazie danych. Atrybuty cz\u0119\u015bci s\u0105 zapisywane w tabeli obiektu biznesowego. Relacje z innymi obiektami biznesowymi mog\u0105 by\u0107 r\u00f3wnie\u017c okre\u015blone w definicji cz\u0119\u015bci, chocia\u017c cz\u0119\u015b\u0107 nigdy nie mo\u017ce by\u0107 celem relacji. Generowanych jest kilka klas Java, kt\u00f3re s\u0105 u\u017cywane do uzyskiwania dost\u0119pu do instancji cz\u0119\u015bci w aplikacji:<\/p>\n<ul>\n<li>Atrybuty cz\u0119\u015bci mog\u0105 by\u0107 dost\u0119pne tylko do odczytu poprzez klas\u0119 <em>Imutable.<\/em> Posiada ona tylko odpowiednie metody <em>..()<\/em> do odczytu warto\u015bci atrybut\u00f3w. Odpowiednia metoda <em>retrieve&#8230;()<\/em> jest generowana dla relacji.<\/li>\n<li>Klasa <em>mutable<\/em> mo\u017ce by\u0107 u\u017cywana do odczytu i zapisu atrybut\u00f3w cz\u0119\u015bci, a tak\u017ce posiada niezb\u0119dne metody <em>..()<\/em><\/li>\n<li>Klasa mappera jest generowana, je\u015bli relacje s\u0105 przypisane do cz\u0119\u015bci, kt\u00f3ra jest u\u017cywana wewn\u0119trznie przez <em>Persistence service<\/em> w celu uzyskania dost\u0119pu do obiektu biznesowego relacji<\/li>\n<\/ul>\n<h4 id=\"widok-oql\" ><span class=\"ez-toc-section\" id=\"Widok_OQL\"><\/span>Widok OQL<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Obiekt biznesowy z dodatkowymi danymi z innych obiekt\u00f3w biznesowych, do kt\u00f3rych istniej\u0105 odniesienia, jest cz\u0119sto u\u017cywany wielokrotnie w aplikacjach. Zamiast otwiera\u0107 obiekt biznesowy, otwiera\u0107 powi\u0105zane obiekty biznesowe za po\u015brednictwem relacji i wybiera\u0107 interesuj\u0105ce atrybuty lub zawsze u\u017cywa\u0107 tego samego polecenia OQL, \u0142atwiej jest utworzy\u0107 widok \u017c\u0105danych informacji. Widok ten mo\u017ce by\u0107 u\u017cywany w aplikacji jak normalny obiekt biznesowy, z zastrze\u017ceniem, \u017ce dane mog\u0105 by\u0107 tylko odczytywane. Zmiany mo\u017cna wprowadza\u0107 w centralnej lokalizacji. Widok danych jest okre\u015blony w postaci instrukcji OQL <em>SELECT.<\/em> Nie ma ogranicze\u0144 co do stosowania z\u0142\u0105cze\u0144 i klauzul <em>WHERE,<\/em> wi\u0119c mo\u017cliwe s\u0105 z\u0142o\u017cone zapytania.<\/p>\n<p>System (narz\u0119dzie <em>crtbo)<\/em> generuje trzy klasy Java z definicji widoku OQL: klas\u0119 g\u0142\u00f3wn\u0105, klas\u0119 stanu i klas\u0119 mappera. Klasy Java s\u0105 zapisywane w pakiecie Java odpowiadaj\u0105cym przestrzeni nazw pod nazw\u0105 widoku OQL (ewentualnie z przyrostkiem <em>_State<\/em> lub <em>_Mapper).<\/em> Deweloper u\u017cywa klasy g\u0142\u00f3wnej w aplikacji, aby uzyska\u0107 dost\u0119p do instancji widoku OQL, podczas gdy klasy stanu i mappera s\u0105 wymagane przez us\u0142ug\u0119 trwa\u0142o\u015bci w celu realizacji dost\u0119pu do bazy danych. Klasa g\u0142\u00f3wna zawiera metody <em>get&#8230;()<\/em> lub <em>is&#8230;()<\/em> (dla <em>Boolean)<\/em> do uzyskiwania dost\u0119pu do atrybut\u00f3w widoku oraz metod\u0119 <em>buildPrimaryKey()<\/em> do otwierania instancji za pomoc\u0105 klucza g\u0142\u00f3wnego. W aplikacji widok zachowuje si\u0119 podobnie do obiektu biznesowego, ale mo\u017cliwy jest tylko dost\u0119p do odczytu.<\/p>\n<p>Powi\u0105zany widok bazy danych jest tworzony w bazie danych, przy czym instrukcja OQL jest konwertowana przez system na instrukcj\u0119 SQL, kt\u00f3rej widok bazy danych u\u017cywa do utworzenia wirtualnej tabeli bazy danych.<\/p>\n<p>Systemy DBMS nie zawsze mog\u0105 w pe\u0142ni zoptymalizowa\u0107 instrukcje bazy danych zawieraj\u0105ce widoki. Szczeg\u00f3lnie w wyszukiwaniach, raportach i listach, korzystanie z widok\u00f3w OQL pogarsza czasy odpowiedzi bazy danych.<\/p>\n<p>W zwi\u0105zku z tym nie zaleca si\u0119 u\u017cywania widok\u00f3w OQL do tych cel\u00f3w; zamiast tego nale\u017cy u\u017cywa\u0107 OQL, wyszukiwa\u0144 OQL lub wirtualnych tabel i funkcji do raport\u00f3w.<\/p>\n<h3 id=\"struktura-persistence-service\" ><span class=\"ez-toc-section\" id=\"Struktura_Persistence_service\"><\/span>Struktura <em>Persistence service<\/em><span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p><em>Persistence service<\/em> sk\u0142ada si\u0119 z kilku komponent\u00f3w. Niekt\u00f3re z tych komponent\u00f3w, takie jak <em>Wsp\u00f3\u0142dzielona pami\u0119\u0107 podr\u0119czna (Shared Cache)<\/em> lub Pami\u0119\u0107 podr\u0119cznej transakcji <em>(Transaction Cache)<\/em>, mog\u0105 by\u0107 dost\u0119pne dla dewelopera tylko za po\u015brednictwem interfejs\u00f3w <em>Manager obiekt\u00f3w<\/em> lub <em>Managerze transakcji<\/em>. Zadania wszystkich g\u0142\u00f3wnych komponent\u00f3w <em>Persistence service<\/em> zosta\u0142y opisane poni\u017cej.<\/p>\n<h4 id=\"wspoldzielona-pamiec-podreczna\" ><span class=\"ez-toc-section\" id=\"Wspoldzielona_pamiec_podreczna\"><\/span>Wsp\u00f3\u0142dzielona pami\u0119\u0107 podr\u0119czna<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p><em>Wsp\u00f3\u0142dzielona pami\u0119\u0107 podr\u0119czna<\/em> s\u0142u\u017cy do tymczasowego przechowywania otwartych instancji obiekt\u00f3w biznesowych w pami\u0119ci g\u0142\u00f3wnej w celu zminimalizowania liczby dost\u0119p\u00f3w do bazy danych. Przyczynia si\u0119 zatem znacz\u0105co do wydajno\u015bci ca\u0142ego systemu. Dost\u0119p do instancji obiektu biznesowego we wsp\u00f3\u0142dzielonej pami\u0119ci podr\u0119cznej jest znacznie szybszy ni\u017c dost\u0119p do niego w bazie danych. Wsp\u00f3\u0142dzielona pami\u0119\u0107 podr\u0119czna dzia\u0142a zgodnie ze strategi\u0105 <em>LRU<\/em> (least recently used) i zawiera instancje obiekt\u00f3w biznesowych ostatnio u\u017cywane przez serwer aplikacji. Je\u015bli aplikacja chce odczyta\u0107 obiekt biznesowy z bazy danych, najpierw sprawdza, czy obiekt biznesowy jest dost\u0119pny we wsp\u00f3\u0142dzielonej pami\u0119ci podr\u0119cznej, w przeciwnym razie jest odczytywany z bazy danych.<\/p>\n<p>Wsp\u00f3\u0142dzielona pami\u0119\u0107 podr\u0119czna istnieje dok\u0142adnie raz w ka\u017cdym serwerze aplikacji, kt\u00f3ry wykonuje dost\u0119p do bazy danych (singleton). W systemie z wi\u0119cej ni\u017c jednym serwerem aplikacji wysi\u0142ek komunikacyjny mi\u0119dzy serwerami aplikacji by\u0142by bardzo wysoki, gdyby obiekty we wszystkich wsp\u00f3\u0142dzielonych pami\u0119ciach podr\u0119cznych mia\u0142y przez ca\u0142y czas taki sam stan jak w bazie danych. Wystarczy, \u017ce obiekty we wsp\u00f3\u0142dzielonej pami\u0119ci podr\u0119cznej b\u0119d\u0105 aktualizowane w okre\u015blonych odst\u0119pach czasu (30 sekund).<\/p>\n<p>Pami\u0119\u0107 g\u0142\u00f3wna serwera aplikacji jest ograniczona, wi\u0119c nie wszystkie obiekty mog\u0105 by\u0107 przechowywane we wsp\u00f3\u0142dzielonej pami\u0119ci podr\u0119cznej w tym samym czasie. Rozmiar wsp\u00f3\u0142dzielonej pami\u0119ci podr\u0119cznej jest ustawiany podczas konfiguracji serwera aplikacji. Wsp\u00f3\u0142dzielona pami\u0119\u0107 podr\u0119czna mo\u017ce by\u0107 podzielona na r\u00f3\u017cne partycje o ograniczonym rozmiarze. Obiekty biznesowe s\u0105 przechowywane w jednej z partycji w zale\u017cno\u015bci od typu danych i bazy danych.<\/p>\n<h4 id=\"pamiec-podreczna-transakcji\" ><span class=\"ez-toc-section\" id=\"Pamiec_podreczna_transakcji\"><\/span>Pami\u0119\u0107 podr\u0119czna transakcji<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Pami\u0119\u0107 podr\u0119czna transakcji s\u0142u\u017cy do tworzenia lokalnego kontekstu transakcji. Ka\u017cda transakcja Top Level ma w\u0142asn\u0105 pami\u0119\u0107 podr\u0119czn\u0105 transakcji. Dop\u00f3ki transakcja nie zostanie potwierdzona przez <em>commit,<\/em> instancje obiekt\u00f3w biznesowych, kt\u00f3re s\u0105 zarejestrowane do modyfikacji w ramach tej transakcji, s\u0105 przechowywane tylko w ich pami\u0119ci podr\u0119cznej transakcji. <em>Managerze obiekt\u00f3w<\/em> najpierw wyszukuje obiekty do otwarcia w odpowiedniej pami\u0119ci podr\u0119cznej transakcji. Zmiany w transakcji s\u0105 widoczne tylko dla dost\u0119pu w ramach tej transakcji. Zmiana staje si\u0119 widoczna dla wszystkich innych transakcji dopiero po przeniesieniu danych z pami\u0119ci podr\u0119cznej transakcji do wsp\u00f3\u0142dzielonej pami\u0119ci podr\u0119cznej i bazy danych. Dzieje si\u0119 tak, gdy zmieniaj\u0105ca si\u0119 transakcja jest finalizowana przez <em>commit.<\/em><\/p>\n<h4 id=\"manager-transakcji\" ><span class=\"ez-toc-section\" id=\"Manager_transakcji\"><\/span>Manager transakcji<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Manager transakcji zarz\u0105dza i kontroluje transakcje. Mo\u017ce rozpocz\u0105\u0107 now\u0105 transakcj\u0119 <em>Top Level<\/em> lub transakcj\u0119 podrz\u0119dn\u0105 oraz potwierdzi\u0107 (zatwierdzi\u0107) lub anulowa\u0107 (wycofa\u0107) transakcj\u0119.<\/p>\n<p>Obiekty stanu obiekt\u00f3w biznesowych i pami\u0119ci podr\u0119czne transakcji s\u0105 u\u017cywane do izolowania lokalnych kontekst\u00f3w transakcji.<\/p>\n<h5 id=\"transakcje\" ><span class=\"ez-toc-section\" id=\"Transakcje\"><\/span>Transakcje<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Transakcja jest nawiasem dla operacji zapisu funkcjonalnej bazy danych. Sk\u0142ada si\u0119 z jednego lub wi\u0119cej dzia\u0142a\u0144 na bazie danych, z kt\u00f3rych wszystkie lub \u017cadne nie s\u0105 wykonywane (atomowo\u015b\u0107). S\u0105 one jawnie otwierane, zamykane lub anulowane. Zmiany s\u0105 widoczne dla \u015bwiata zewn\u0119trznego dopiero po pomy\u015blnym zako\u0144czeniu transakcji. Anulowanie przywraca wszystkie poprzednie zmiany. Transakcja ERP odpowiada rozumieniu transakcji w systemach relacyjnych baz danych i dlatego spe\u0142nia w\u0142a\u015bciwo\u015bci ACID.<\/p>\n<p><em>Persistence service<\/em> obs\u0142uguje zamkni\u0119te, zagnie\u017cd\u017cone transakcje. Oznacza to, \u017ce transakcja mo\u017ce zasadniczo mie\u0107 dowoln\u0105 liczb\u0119 podtransakcji o dowolnej g\u0142\u0119boko\u015bci zagnie\u017cd\u017cenia. Transakcje zagnie\u017cd\u017cone lub podrz\u0119dne to transakcje, kt\u00f3re s\u0105 rozpoczynane i ko\u0144czone w ramach istniej\u0105cej transakcji, transakcji nadrz\u0119dnej. Podtransakcje s\u0105 tutaj nieistotne, tzn. anulowanie podtransakcji nie wymusza anulowania transakcji nadrz\u0119dnej. Zmiany w ramach podtransakcji b\u0119d\u0105 widoczne tylko w odpowiedniej transakcji nadrz\u0119dnej po pomy\u015blnym zatwierdzeniu i s\u0105 zapisywane w bazie danych, a zatem staj\u0105 si\u0119 trwa\u0142e, gdy transakcja <em>Top Level<\/em> zostanie zatwierdzona.<\/p>\n<p>Z regu\u0142y komponenty oprogramowania s\u0105 projektowane w celu zapewnienia okre\u015blonej, uko\u0144czonej us\u0142ugi. Cz\u0119sto musi si\u0119 to odbywa\u0107 w spos\u00f3b bezpieczny dla transakcji. Komponent mo\u017ce dostarczy\u0107 us\u0142ug\u0119 w ca\u0142o\u015bci lub nie. Komponent u\u017cyje transakcji do wykonania swoich operacji w ramach tej transakcji. Zagnie\u017cd\u017cone wywo\u0142ania komponent\u00f3w automatycznie skutkuj\u0105 zagnie\u017cd\u017conymi transakcjami.<\/p>\n<p>Transakcja <em>Top Level<\/em> i wszystkie jej podtransakcje mog\u0105 mie\u0107 dost\u0119p do odczytu i zapisu tylko do jednej bazy danych. Transakcje mi\u0119dzy bazami danych nie s\u0105 mo\u017cliwe.<\/p>\n<p>Manager transakcji zawsze ma dok\u0142adnie jedn\u0105 bie\u017c\u0105c\u0105 transakcj\u0119 w danym momencie. Chocia\u017c w sesji mo\u017cna otworzy\u0107 kilka transakcji <em>Top Level<\/em>, tylko ostatnia z nich jest bie\u017c\u0105c\u0105 transakcj\u0105 Top <em>Level<\/em>. Je\u015bli transakcja nie zosta\u0142a jawnie uruchomiona, transakcja fikcyjna jest niejawnie otwierana w domy\u015blnej bazie danych OLTP. W tym przypadku mo\u017cliwy jest tylko dost\u0119p do bazy danych tylko do odczytu; nie mo\u017ce mie\u0107 \u017cadnych podtransakcji i nie mo\u017ce zapisywa\u0107 do baz danych.<\/p>\n<p>Je\u015bli instancje obiekt\u00f3w biznesowych s\u0105 zmieniane w ramach transakcji, wymagane s\u0105 dla nich blokady. Blokady te s\u0105 powi\u0105zane z odpowiedni\u0105 transakcj\u0105 <em>Top Level<\/em> i s\u0105 zwalniane dopiero po zako\u0144czeniu transakcji<em> Top Level<\/em>. Oznacza to, \u017ce blokady \u017c\u0105dane w podtransakcjach s\u0105 r\u00f3wnie\u017c utrzymywane do momentu zako\u0144czenia transakcji <em>Top Level<\/em>, niezale\u017cnie od tego, czy podtransakcja zosta\u0142a potwierdzona, czy anulowana.<\/p>\n<h5 id=\"zarzadzanie-transakcjami\" ><span class=\"ez-toc-section\" id=\"Zarzadzanie_transakcjami\"><\/span>Zarz\u0105dzanie transakcjami<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Instancja <em>Managera transakcji<\/em> mo\u017ce by\u0107 wyszukiwana w aplikacji w \u015brodowisku bie\u017c\u0105cej sesji. <em>Manager transakcji<\/em> oferuje nast\u0119puj\u0105ce funkcje dla transakcji:<\/p>\n<ul>\n<li>Otwarcie nowej transakcji<em> Top Level<\/em> (<em>beginNew<\/em>)<\/li>\n<li>Otwarcie nowej transakcji tylko do odczytu (<em>beginReadOnly<\/em>)<\/li>\n<li>Otwieranie transakcji (<em>begin<\/em>)<\/li>\n<li>Potwierdzenie transakcji (<em>commit<\/em>)<\/li>\n<li>Anulowanie transakcji (<em>rollback<\/em>)<\/li>\n<li>Utworzenie nowego obiektu transakcji<em> Top Level<\/em> (<em>createNew<\/em>)<\/li>\n<li>Utworzenie nowego obiektu transakcji tylko do odczytu (<em>createReadOnly<\/em>)<\/li>\n<li>Utworzenie obiektu transakcji (<em>create<\/em>).<\/li>\n<\/ul>\n<p>Obiekt transakcji utworzony za pomoc\u0105 funkcji <em>create<\/em> reprezentuje transakcj\u0119. Obiekt transakcji posiada nast\u0119puj\u0105ce metody:<\/p>\n<ul>\n<li>Potwierdzenie transakcji (<em>commit<\/em>)<\/li>\n<li>Potwierdzenie transakcji i otwarcie nowej transakcji (<em>commitBlock<\/em>)<\/li>\n<li>Potwierdzenie transakcji, je\u015bli maksymalny rozmiar transakcji zosta\u0142 przekroczony i otw\u00f3rz now\u0105 transakcj\u0119 (<em>commitIfSizeLimitExceeded<\/em>)<\/li>\n<li>Sprawdzenie, czy transakcja jest nadal otwarta (<em>isOpen<\/em>)<\/li>\n<li>Zamkni\u0119cie transakcji (<em>close<\/em>)<\/li>\n<\/ul>\n<p>Transakcje mo\u017cna otwiera\u0107 za pomoc\u0105 polecenia <em>begin&#8230;<\/em> lub <em>create&#8230;.<\/em> Otwarcie transakcji za pomoc\u0105 <em>create&#8230;<\/em> tworzy obiekt transakcji, kt\u00f3ry implementuje interfejs <em>AutoCloseable.<\/em> Podczas tworzenia nowych aplikacji i funkcji nale\u017cy u\u017cywa\u0107 <em>create&#8230;<\/em> zamiast <em>begin&#8230;.<\/em> Wiele starszych aplikacji u\u017cywa <em>begin&#8230;.<\/em><\/p>\n<h6 id=\"alias-bazy-danych\" ><span class=\"ez-toc-section\" id=\"Alias_bazy_danych\"><\/span>Alias bazy danych<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p>Aliasy baz danych s\u0105 zdefiniowane jako sta\u0142e w <em>Managerze transakcji<\/em>. Mo\u017cna ich u\u017cy\u0107 do otwarcia transakcji dla odpowiedniej bazy danych.<\/p>\n<table style=\"height: 184px; width: 100%; border-color: #000000; background-color: #ffffff; border-style: outset;\">\n<tbody>\n<tr style=\"height: 23px;\">\n<td style=\"height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\" width=\"132\"><strong>Nazwa aliasu<\/strong><\/td>\n<td style=\"height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\" width=\"409\"><strong>Znaczenie<\/strong><\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\" width=\"132\"><em>OLTP<\/em><\/td>\n<td style=\"height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\" width=\"409\">Ten alias oznacza bie\u017c\u0105c\u0105 baz\u0119 danych OLTP sesji.<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\" width=\"132\"><em>OLAP<\/em><\/td>\n<td style=\"height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\" width=\"409\">Ten alias oznacza bie\u017c\u0105c\u0105 baz\u0119 danych OLAP sesji.<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\" width=\"132\"><em>CONFIGURATION<\/em><\/td>\n<td style=\"height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\" width=\"409\">Ten alias oznacza bie\u017c\u0105c\u0105 baz\u0119 danych konfiguracji sesji.<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\" width=\"132\"><em>REPOSITORY<\/em><\/td>\n<td style=\"height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\" width=\"409\">Ten alias oznacza baz\u0119 danych repozytorium.<\/td>\n<\/tr>\n<tr style=\"height: 69px;\">\n<td style=\"height: 69px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\" width=\"132\">Konkretna nazwa bazy danych<\/td>\n<td style=\"height: 69px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\" width=\"409\">Mo\u017cna r\u00f3wnie\u017c okre\u015bli\u0107 nazw\u0119 bazy danych pod\u0142\u0105czonej do SAS, ale jest to przydatne tylko w wyj\u0105tkowych przypadkach, poniewa\u017c w rezultacie kod programu nie mo\u017ce zosta\u0107 przeniesiony do innego systemu ERP.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h4 id=\"tworzenie-transakcji-top-level\" ><span class=\"ez-toc-section\" id=\"Tworzenie_transakcji_Top_Level\"><\/span>Tworzenie transakcji <em>Top Level<\/em><span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Metoda <em>beginNew()<\/em> lub <em>createNew()<\/em> s\u0142u\u017cy do tworzenia nowej transakcji<em> Top Level<\/em> dla okre\u015blonej bazy danych. Mo\u017cna przenie\u015b\u0107 alias bazy danych lub identyfikator <em>GUID<\/em> bazy danych. Je\u015bli \u017cadna baza danych nie zostanie przeniesiona, w\u00f3wczas u\u017cywana jest bie\u017c\u0105ca baza danych OLTP sesji.<\/p>\n<h4 id=\"tworzenie-transakcji-tylko-do-odczytu\" ><span class=\"ez-toc-section\" id=\"Tworzenie_transakcji_tylko_do_odczytu\"><\/span>Tworzenie transakcji tylko do odczytu<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Metoda <em>beginReadOnly()<\/em> lub <em>createReadOnly()<\/em> tworzy now\u0105 transakcj\u0119 tylko do odczytu dla okre\u015blonej bazy danych. Mo\u017cliwe jest przeniesienie aliasu bazy danych lub identyfikatora <em>GUID<\/em> bazy danych. Je\u015bli \u017cadna baza danych nie zostanie przekazana, u\u017cywana jest bie\u017c\u0105ca baza danych OLTP sesji. Otwarcie transakcji tylko do odczytu powoduje mniejsze obci\u0105\u017cenie systemu ni\u017c otwarcie normalnej transakcji <em>Top Level<\/em>. Korzystanie z transakcji tylko do odczytu mo\u017ce by\u0107 op\u0142acalne, zw\u0142aszcza je\u015bli du\u017ca liczba transakcji jest otwierana w kr\u00f3tkim czasie.<\/p>\n<p>Nast\u0119puj\u0105ce dzia\u0142ania s\u0105 zabronione w ramach transakcji tylko do odczytu:<\/p>\n<ul>\n<li>Modyfikowanie obiektu biznesowego<\/li>\n<li>\u017b\u0105danie blokad obiekt\u00f3w biznesowych<\/li>\n<li>Otwieranie podtransakcji<\/li>\n<li>Zako\u0144czenie transakcji za pomoc\u0105 funkcji <em>commit()<\/em><\/li>\n<\/ul>\n<h6 id=\"tworzenie-podtransakcji\" ><span class=\"ez-toc-section\" id=\"Tworzenie_podtransakcji\"><\/span>Tworzenie podtransakcji<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p>Wywo\u0142anie metody <em>begin()<\/em> lub <em>create()<\/em> bez parametr\u00f3w tworzy now\u0105 transakcj\u0119. Je\u015bli \u017cadna baza danych nie zostanie przes\u0142ana, w\u00f3wczas bie\u017c\u0105ca baza danych OLTP sesji jest u\u017cywana w taki sam spos\u00f3b, jak w przypadku <em>beginNew().<\/em><\/p>\n<p>Je\u015bli metoda <em>begin()<\/em> zostanie wywo\u0142ana na poziomie transakcji fikcyjnej lub w ramach transakcji <em>Top Level<\/em>, a u\u017cywana baza danych nie jest taka sama jak baza danych transakcji nadrz\u0119dnej, wyst\u0105pi b\u0142\u0105d wykonania. Je\u015bli bazy danych s\u0105 zgodne, otwierana jest nowa transakcja <em>Top Level<\/em>, je\u015bli transakcja nadrz\u0119dna jest transakcj\u0105 fikcyjn\u0105, w przeciwnym razie otwierana jest transakcja podrz\u0119dna.<\/p>\n<h6 id=\"potwierdzenie-transakcji\" ><span class=\"ez-toc-section\" id=\"Potwierdzenie_transakcji\"><\/span>Potwierdzenie transakcji<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p>Bie\u017c\u0105ca transakcja jest potwierdzana przy u\u017cyciu metody <em>commit()<\/em> na managerze transakcji lub obiekcie transakcji. Je\u015bli zaanga\u017cowana jest transakcja <em>Top Level<\/em>, zarejestrowane obiekty s\u0105 zapisywane w bazie danych lub usuwane. W przypadku transakcji podrz\u0119dnej zarejestrowane obiekty nie s\u0105 jeszcze zapisywane w bazie danych, ale s\u0105 dziedziczone przez transakcj\u0119 nadrz\u0119dn\u0105, tj. wstawiane do jej lokalnego kontekstu transakcji, a zatem s\u0105 widoczne dla tej transakcji. Dopiero gdy powi\u0105zana transakcja <em>Top Level<\/em> zostanie potwierdzona za pomoc\u0105 funkcji <em>commit(),<\/em> obiekty te staj\u0105 si\u0119 trwa\u0142e w bazie danych.<\/p>\n<p>Tylko wtedy, gdy transakcja <em>Top Level<\/em> jest zatwierdzona, numery s\u0105 losowane z automatycznym przypisaniem numeru lub aktualizowane s\u0105 informacje o aktualizacji zmienionych instancji obiekt\u00f3w biznesowych.<\/p>\n<p>Je\u015bli zale\u017cna instancja zostanie zmieniona, czas zmiany i bie\u017c\u0105cy u\u017cytkownik s\u0105 wprowadzane do informacji o aktualizacji instancji jednostki biznesowej. Je\u015bli sama zmieniona instancja ma informacje o aktualizacji, s\u0105 one r\u00f3wnie\u017c aktualizowane.<\/p>\n<h6 id=\"anulowanie-transakcji\" ><span class=\"ez-toc-section\" id=\"Anulowanie_transakcji\"><\/span>Anulowanie transakcji<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p>Bie\u017c\u0105ca transakcja jest anulowana za pomoc\u0105 metody <em>rollback().<\/em> Oznacza to, \u017ce wszystkie zmiany, kt\u00f3re zosta\u0142y przekazane do <em>Persistence service<\/em> podczas tej transakcji lub jednej z jej podtransakcji, s\u0105 odrzucane. Dotyczy to zar\u00f3wno anulowanej transakcji <em>Top Level<\/em>, jak i podtransakcji.<\/p>\n<p>Je\u015bli anulowana transakcja ma transakcj\u0119 nadrz\u0119dn\u0105, jej kontekst lokalny transakcji pozostaje niezmieniony, tj. w tym samym stanie, w kt\u00f3rym rozpocz\u0119to transakcj\u0119 podrz\u0119dn\u0105. Transakcja nadrz\u0119dna staje si\u0119 bie\u017c\u0105c\u0105 transakcj\u0105.<\/p>\n<p>Je\u015bli transakcja <em>Top Level<\/em> zostanie anulowana, w\u00f3wczas transakcja <em>dummy<\/em> staje si\u0119 transakcj\u0105 bie\u017c\u0105c\u0105.<\/p>\n<p>Metoda <em>close()<\/em> na obiekcie transakcji anuluje otwart\u0105 transakcj\u0119 w taki sam spos\u00f3b jak <em>rollback().<\/em> Je\u015bli transakcja zosta\u0142a ju\u017c potwierdzona przez <em>commit(),<\/em> w\u00f3wczas <em>close()<\/em> musi by\u0107 nadal wywo\u0142ywane. W tym przypadku jednak <em>close()<\/em> nie ma wp\u0142ywu na wynik transakcji.<\/p>\n<h4 id=\"przyklad-laczenia-transakcji-nadrzednych-i-podrzednych\" ><span class=\"ez-toc-section\" id=\"Przyklad_laczenia_transakcji_nadrzednych_i_podrzednych\"><\/span>Przyk\u0142ad \u0142\u0105czenia transakcji nadrz\u0119dnych i podrz\u0119dnych<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Poni\u017csza ilustracja przedstawia transakcj\u0119 <em>Top Level<\/em> z trzema podtransakcjami. Zmiany w <em>Podtransakcja 2<\/em> s\u0105 przenoszone do pami\u0119ci podr\u0119cznej transakcji <em>Podtrasakcja 1<\/em>, poniewa\u017c <em>Podtransakcja 2<\/em> jest zako\u0144czona przez <em>commit.<\/em> Jednak zmiany w <em>Podtransakcja 1<\/em> nie s\u0105 przenoszone do transakcji <em>Top Level<\/em>, poniewa\u017c <em>Podtransakcja 1<\/em> jest anulowana za pomoc\u0105 <em>rollback.<\/em> Oznacza to, \u017ce zmiany w <em>Podtransakcja 2<\/em> s\u0105 r\u00f3wnie\u017c odrzucane. Zmiany w <em>Podtransakcja 3<\/em> s\u0105 stosowane do transakcji <em>Top Level<\/em> za pomoc\u0105 zatwierdzenia. Oznacza to, \u017ce gdy transakcja <em>Top Level<\/em> zostanie zatwierdzona, zmiany zostan\u0105 utrwalone bezpo\u015brednio w transakcji <em>Top Level<\/em>, a zmiany w <em>Podtransakcja 3<\/em> zostan\u0105 utrwalone w bazie danych.<\/p>\n<figure id=\"attachment_29655\" aria-describedby=\"caption-attachment-29655\" style=\"width: 571px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/04\/Persistence-service-5.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-29655 size-full\" src=\"https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/04\/Persistence-service-5.png\" alt=\"\" width=\"571\" height=\"396\" srcset=\"https:\/\/pomoc.comarch.pl\/cee\/640\/wp-content\/uploads\/2025\/04\/Persistence-service-5.png 571w, https:\/\/pomoc.comarch.pl\/cee\/640\/wp-content\/uploads\/2025\/04\/Persistence-service-5-300x208.png 300w, https:\/\/pomoc.comarch.pl\/cee\/640\/wp-content\/uploads\/2025\/04\/Persistence-service-5-50x35.png 50w, https:\/\/pomoc.comarch.pl\/cee\/640\/wp-content\/uploads\/2025\/04\/Persistence-service-5-320x222.png 320w\" sizes=\"auto, (max-width: 571px) 100vw, 571px\" \/><\/a><figcaption id=\"caption-attachment-29655\" class=\"wp-caption-text\"><em>Przyk\u0142ad podtransakcji<\/em><\/figcaption><\/figure>\n<p style=\"text-align: center;\">\n<h5 id=\"zaleznosc-transakcyjna-obiektow-biznesowych-instancje\" ><span class=\"ez-toc-section\" id=\"Zaleznosc_transakcyjna_obiektow_biznesowych_instancje\"><\/span>Zale\u017cno\u015b\u0107 transakcyjna obiekt\u00f3w biznesowych instancje<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Instancje obiekt\u00f3w biznesowych utworzone przez <em>Managera obiekt\u00f3w<\/em> nale\u017c\u0105 dok\u0142adnie do tej transakcji lub podtransakcji, w kt\u00f3rej zosta\u0142y otwarte lub utworzone. Mog\u0105 by\u0107 u\u017cywane tylko w tej transakcji. Je\u015bli transakcja, w kt\u00f3rej zosta\u0142y otwarte, zostanie zamkni\u0119ta, instancja jest niewa\u017cna.<\/p>\n<p>Obiekty niezale\u017cne od transakcji mog\u0105 by\u0107 tworzone przy u\u017cyciu metody <em>getTransientCopy().<\/em> Metoda ta tworzy kopi\u0119 instancji obiektu biznesowego, kt\u00f3ra nie nale\u017cy do \u017cadnej transakcji i dlatego mo\u017ce by\u0107 u\u017cywana w r\u00f3\u017cnych transakcjach. Wszystkie obiekty biznesowe maj\u0105 t\u0119 metod\u0119.<\/p>\n<p>Metoda <em>newTransientInstance()<\/em> mo\u017ce by\u0107 u\u017cyta do utworzenia pustej, niezale\u017cnej od transakcji instancji obiektu biznesowego.<\/p>\n<h5 id=\"widocznosc-zmian-w-transakcjach-zagniezdzonych\" ><span class=\"ez-toc-section\" id=\"Widocznosc_zmian_w_transakcjach_zagniezdzonych\"><\/span>Widoczno\u015b\u0107 zmian w transakcjach zagnie\u017cd\u017conych<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Widoczno\u015b\u0107 zmian w instancjach obiekt\u00f3w biznesowych (tj. w\u0142a\u015bciwo\u015b\u0107 izolacji transakcji) jest kontrolowana na trzech poziomach.<\/p>\n<h6 id=\"biezaca-transakcja-z-podtransakcjami\" ><span class=\"ez-toc-section\" id=\"Biezaca_transakcja_z_podtransakcjami\"><\/span>Bie\u017c\u0105ca transakcja z podtransakcjami<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p>Na poziomie bie\u017c\u0105cej transakcji i jej podtransakcji zmiany atrybut\u00f3w s\u0105 znane tylko w odpowiedniej instancji obiektu biznesowego. Dopiero po <em>putObject()<\/em> staj\u0105 si\u0119 one widoczne dla bie\u017c\u0105cej transakcji i dla wszystkich kolejnych podtransakcji, tj. kolejne <em>getObject()<\/em> zwraca zmienion\u0105 instancj\u0119 obiektu biznesowego. Instancje zmienionego obiektu biznesowego, kt\u00f3re zosta\u0142y ju\u017c otwarte, nadal maj\u0105 star\u0105 warto\u015b\u0107, dop\u00f3ki nie zostan\u0105 ponownie odczytane za pomoc\u0105 <em>getObject().<\/em><\/p>\n<h6 id=\"transakcja-nadrzedna-transakcji-modyfikujacej\" ><span class=\"ez-toc-section\" id=\"Transakcja_nadrzedna_transakcji_modyfikujacej\"><\/span>Transakcja nadrz\u0119dna transakcji modyfikuj\u0105cej<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p>Zmiany atrybut\u00f3w s\u0105 widoczne tylko w transakcji nadrz\u0119dnej zmieniaj\u0105cej si\u0119 transakcji, je\u015bli instancja obiektu biznesowego zosta\u0142a zapisana w zmieniaj\u0105cej si\u0119 transakcji za pomoc\u0105 <em>putObject(),<\/em> transakcja ta zosta\u0142a pomy\u015blnie zako\u0144czona za pomoc\u0105 <em>commit(),<\/em> a instancja obiektu biznesowego zosta\u0142a ponownie odczytana za pomoc\u0105 <em>getObject().<\/em> Dotyczy to r\u00f3wnie\u017c g\u0142\u0119bszych poziom\u00f3w zagnie\u017cd\u017cenia.<\/p>\n<h6 id=\"zmiana-zawartosci-bazy-danych\" ><span class=\"ez-toc-section\" id=\"Zmiana_zawartosci_bazy_danych\"><\/span>Zmiana zawarto\u015bci bazy danych<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p>Zawarto\u015b\u0107 bazy danych odzwierciedla zmiany (<em>INSERT\/UPDATE\/DELETE<\/em>) dopiero po pomy\u015blnym zako\u0144czeniu transakcji <em>Top Level<\/em> za pomoc\u0105 <em>commit.<\/em> Dopiero w tym momencie wszystkie zmiany w transakcji <em>Top Level<\/em> i jej pomy\u015blnie zako\u0144czonych podtransakcjach s\u0105 zapisywane w bazie danych. S\u0105 one wtedy widoczne globalnie. Ponowny odczyt jest konieczny, poniewa\u017c instancje obiekt\u00f3w biznesowych odczytane przed zatwierdzeniem zmieniaj\u0105cej si\u0119 transakcji nadal zawieraj\u0105 stare warto\u015bci. Instrukcje OQL zawsze dzia\u0142aj\u0105 na rzeczywistych trwa\u0142ych danych, tj. zmiany wprowadzone w instancjach obiekt\u00f3w biznesowych w tej samej transakcji nie s\u0105 jeszcze widoczne dla zapyta\u0144 OQL.<\/p>\n<h5 id=\"obsluga-bledow-dla-transakcji\" ><span class=\"ez-toc-section\" id=\"Obsluga_bledow_dla_transakcji\"><\/span>Obs\u0142uga b\u0142\u0119d\u00f3w dla transakcji<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Nale\u017cy upewni\u0107 si\u0119, \u017ce otwarta transakcja jest zawsze anulowana przez wycofanie lub zako\u0144czona zatwierdzeniem. Obs\u0142uga b\u0142\u0119d\u00f3w zale\u017cy od tego, czy transakcja zosta\u0142a otwarta za pomoc\u0105 <em>begin&#8230;<\/em> czy <em>create&#8230;<\/em> .<\/p>\n<p>Je\u015bli transakcja zosta\u0142a otwarta za pomoc\u0105 <em>create&#8230;<\/em> , obs\u0142uga b\u0142\u0119d\u00f3w jest prosta, a deweloper nie mo\u017ce pope\u0142ni\u0107 \u017cadnych b\u0142\u0119d\u00f3w. Najlepiej otwiera\u0107 transakcje za pomoc\u0105 <em>create&#8230;<\/em> , w szczeg\u00f3lno\u015bci ze wzgl\u0119du na prostsz\u0105 obs\u0142ug\u0119 b\u0142\u0119d\u00f3w.<\/p>\n<p>Je\u015bli transakcja zosta\u0142a otwarta za pomoc\u0105 begin&#8230; , nale\u017cy przestrzega\u0107 poni\u017cszych wzorc\u00f3w programowania. Podczas korzystania z funkcji <em>begin&#8230;<\/em> konieczne jest obs\u0142ugiwanie wyj\u0105tk\u00f3w wyst\u0119puj\u0105cych w bloku transakcji. Ponadto nale\u017cy unika\u0107 ewentualnego wyst\u0105pienia wyj\u0105tk\u00f3w w okre\u015blonych punktach programu. W przypadku transakcji zagnie\u017cd\u017conych nale\u017cy zadba\u0107 o to, aby stos transakcji nie zosta\u0142 pomieszany, np. je\u015bli transakcja wy\u017cszego poziomu zostanie r\u00f3wnie\u017c zamkni\u0119ta z powodu nieostro\u017cno\u015bci.<\/p>\n<p>Aby zwi\u0119kszy\u0107 pewno\u015b\u0107, \u017ce <em>rollback<\/em> lub <em>commit<\/em> odnosi si\u0119 do w\u0142a\u015bciwej transakcji dla <em>begin&#8230;<\/em> , mo\u017cna u\u017cy\u0107 identyfikatora <em>GUID<\/em> transakcji. <em>beginNew()\/begin()<\/em> zwraca identyfikator <em>GUID<\/em> bie\u017c\u0105cej transakcji, kt\u00f3ry mo\u017cna przekaza\u0107 jako parametr dla <em>rollback()<\/em> i <em>commit().<\/em> Je\u015bli nie pasuje on do bie\u017c\u0105cej transakcji dla <em>commit(),<\/em> zostanie zg\u0142oszony wyj\u0105tek, a nieprawid\u0142owa transakcja nie zostanie utrwalona.<\/p>\n<p>W przypadku funkcji <em>rollback()<\/em> wy\u015bwietlane jest tylko ostrze\u017cenie, \u017ce identyfikatory <em>GUID<\/em> transakcji nie s\u0105 zgodne. Ka\u017cda transakcja <em>Top Level<\/em> ma sw\u00f3j w\u0142asny identyfikator GUID transakcji, podczas gdy transakcje ni\u017cszego poziomu dostarczaj\u0105 identyfikator <em>GUID<\/em> transakcji<em> Top Level.<\/em> U\u017cycie identyfikatora <em>GUID<\/em> transakcji chroni przed niezamierzonym zamkni\u0119ciem niew\u0142a\u015bciwej transakcji <em>Top Level<\/em>; takie b\u0142\u0119dy s\u0105 nadal mo\u017cliwe w przypadku transakcji podrz\u0119dnych. W p\u00f3\u017aniejszej wersji ten mechanizm ochrony mo\u017cna r\u00f3wnie\u017c rozszerzy\u0107 na podtransakcje, tak aby ka\u017cda podtransakcja mia\u0142a sw\u00f3j w\u0142asny identyfikator <em>GUID<\/em> transakcji. W zwi\u0105zku z tym identyfikator <em>GUID<\/em> transakcji powinien by\u0107 r\u00f3wnie\u017c u\u017cywany dla podtransakcji.<\/p>\n<h6 id=\"transakcja-odczytu-z-begin\" ><span class=\"ez-toc-section\" id=\"Transakcja_odczytu_z_begin%E2%80%A6\"><\/span>Transakcja odczytu z <em>begin&#8230;<\/em><span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p>Transakcja odczytu z <em>begin&#8230;<\/em> musi zawsze odpowiada\u0107 nast\u0119puj\u0105cemu szablonowi. \u017baden wyj\u0105tek nie mo\u017ce zosta\u0107 rzucony w miejscach oznaczonych <strong>\/*xx*\/.<\/strong> Oznacza to, \u017ce najlepiej by\u0142oby, gdyby w tych miejscach nie by\u0142o \u017cadnego kodu lub tylko instrukcje, kt\u00f3re nie mog\u0105 wywo\u0142a\u0107 wyj\u0105tku. Transakcja tylko do odczytu powinna by\u0107 zawsze resetowana za pomoc\u0105 <em>rollback(),<\/em> poniewa\u017c \u017cadne zmiany nie s\u0105 wprowadzane do bazy danych. Blok <em>try-finally<\/em> zapewnia, \u017ce <em>rollback()<\/em> jest zawsze wykonywany, niezale\u017cnie od tego, czy wyj\u0105tek wyst\u0105pi w bloku transakcji, czy nie.<\/p>\n<p>Szablon dla transakcji odczytu:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">byte[] transGuid= tm.begin...(..);\n\/*xx*\/\ntry {\n ...\n} finally {\n \/*xx*\/\n tm.rollback(transGuid);\n ...\n}<\/pre>\n<p>Wyj\u0105tek w zaznaczonych punktach spowodowa\u0142by, \u017ce transakcja nie zosta\u0142aby wycofana przez <em>rollback().<\/em> Transakcja by\u0142aby otwarta i zostanie zamkni\u0119ta dopiero przy nast\u0119pnym wyst\u0105pieniu <em>commit()<\/em> lub <em>rollback()<\/em> dla innej transakcji. Stos transakcji nie by\u0142by ju\u017c sp\u00f3jny, co spowodowa\u0142oby utrat\u0119 danych.<\/p>\n<p>W przypadku transakcji odczytu nale\u017cy sprawdzi\u0107, czy mo\u017cesz u\u017cy\u0107 funkcji <em>beginReadOnly(),<\/em> aby otworzy\u0107 transakcj\u0119 tylko do odczytu.<\/p>\n<h6 id=\"transakcja-odczytu-z-create\" ><span class=\"ez-toc-section\" id=\"Transakcja_odczytu_z_create%E2%80%A6\"><\/span>Transakcja odczytu z<em> create&#8230;<\/em><span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p>Transakcja odczytu z <em>create&#8230;<\/em> musi zawsze odpowiada\u0107 nast\u0119puj\u0105cemu szablonowi. Wynik &#8222;create&#8230;&#8221; musi zosta\u0107 przypisany do zmiennej w &#8222;try&#8221; w nast\u0119puj\u0105cy spos\u00f3b, w przeciwnym razie transakcja nie zostanie zamkni\u0119ta.<\/p>\n<p>Szablon dla transakcji odczytu:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">try (CisTransaction txn=tm.create...(...)) {\n\n...\n}\n<\/pre>\n<h6 id=\"transakcja-zapisu-z-begin\" ><span class=\"ez-toc-section\" id=\"Transakcja_zapisu_z_begin%E2%80%A6\"><\/span>Transakcja zapisu z <em>begin&#8230;<\/em><span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p>Transakcja zapisu z <em>begin&#8230;<\/em> musi zawsze odpowiada\u0107 nast\u0119puj\u0105cemu szablonowi. \u017baden wyj\u0105tek nie mo\u017ce zosta\u0107 rzucony w miejscach oznaczonych <strong>\/*xx*\/. Oznacza to, \u017ce w <\/strong>tych miejscach nie ma kodu lub s\u0105 tylko instrukcje, kt\u00f3re nie mog\u0105 wywo\u0142a\u0107 wyj\u0105tku. Transakcja zapisu musi zosta\u0107 anulowana za pomoc\u0105 funkcji <em>rollback()<\/em> lub pomy\u015blnie zako\u0144czona za pomoc\u0105 funkcji <em>commit().<\/em> Je\u015bli transakcja zostanie anulowana, wszystkie zmiany wprowadzone w transakcji lub w podtransakcjach zostan\u0105 odrzucone. Dost\u0119p do odczytu i modyfikacji za po\u015brednictwem us\u0142ugi trwa\u0142o\u015bci jest dozwolony. Blok <em>try-catch<\/em> zapewnia, \u017ce transakcja zostanie jawnie anulowana za pomoc\u0105 funkcji <em>rollback()<\/em> w przypadku wyst\u0105pienia wyj\u0105tku w bloku transakcji. W przeciwnym razie transakcja zostanie pomy\u015blnie zako\u0144czona za pomoc\u0105 funkcji <em>commit().<\/em><\/p>\n<p>Szablon dla transakcji zapisu:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">byte[] transGuid= tm.begin...(..);\n\n\/*xx*1\/\n\ntry {\n\n...\n\ntm.commit(transGuid);\n\n\/*xx*2\/\n\n} catch (RuntimeException ex) {\n\n\/*xx*3\/\n\ntm.rollback(transGuid);\n\n...\n\n}<\/pre>\n<p>Wyj\u0105tek w pozycji <strong>\/*xx*1\/ spowodowa\u0142by, \u017ce <\/strong>otwarta transakcja nie zosta\u0142aby zamkni\u0119ta za pomoc\u0105 instrukcji nale\u017c\u0105cej do bloku. Wyj\u0105tek w pozycji <strong>\/*xx*2\/ <\/strong>spowodowa\u0142by wykonanie <em>rollback()<\/em> w bloku <em>catch,<\/em> co anulowa\u0142oby transakcj\u0119 wy\u017cszego poziomu. Bie\u017c\u0105ca transakcja zosta\u0142a ju\u017c zamkni\u0119ta przez <em>commit().<\/em> Wyj\u0105tek w pozycji <strong>\/*xx*3\/ oznacza, \u017ce <\/strong>funkcja <em>rollback()<\/em> nie zostanie wykonana, a transakcja pozostanie otwarta.<\/p>\n<h6 id=\"transakcja-zapisu-z-create\" ><span class=\"ez-toc-section\" id=\"Transakcja_zapisu_z_create%E2%80%A6\"><\/span>Transakcja zapisu z create&#8230;<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p>Transakcja zapisu, kt\u00f3ra zosta\u0142a otwarta za pomoc\u0105 <em>create&#8230;<\/em> musi zawsze odpowiada\u0107 nast\u0119puj\u0105cemu szablonowi. <em>Manager obiekt\u00f3w<\/em> nie mo\u017ce by\u0107 dost\u0119pny w punktach oznaczonych<strong> \/*xx*\/<\/strong>. W zwi\u0105zku z tym, po <em>commit()<\/em> nie powinno by\u0107 \u017cadnego kodu. Wynik <em>create&#8230;<\/em> musi zosta\u0107 przypisany do zmiennej w <em>try<\/em> w nast\u0119puj\u0105cy spos\u00f3b, w przeciwnym razie transakcja nie zostanie zamkni\u0119ta.<\/p>\n<p>Szablon dla transakcji zapisu:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">try (CisTransaction txn=tm.create...(..)) {\n\n...\n\ntxn.commit();\n\n\/*xx*\/\n\n}<\/pre>\n<p>Transakcja otwarta za pomoc\u0105 <em>create&#8230;<\/em> jest ju\u017c zamkni\u0119ta w pozycji <strong>\/*xx*\/<\/strong>. Manager obiekt\u00f3w nie u\u017cywa transakcji otwartej w <em>try<\/em> w pozycji <strong>\/*xx*\/<\/strong>.<\/p>\n<h6 id=\"blokowa-transakcja-zapisu-z-create\" ><span class=\"ez-toc-section\" id=\"Blokowa_transakcja_zapisu_z_create%E2%80%A6\"><\/span>Blokowa transakcja zapisu z <em>create&#8230;<a id=\"PS1\"><\/a><\/em><span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p>Transakcja powinna zawsze mie\u0107 ograniczony rozmiar. Je\u015bli ma zosta\u0107 zapisana nieograniczona ilo\u015b\u0107 danych, dane te powinny by\u0107 zapisywane w blokach o ograniczonym rozmiarze. Rozmiar bloku mo\u017ce by\u0107 okre\u015blony jako sta\u0142a (np. 100 rekord\u00f3w danych na transakcj\u0119) lub obliczany dynamicznie przez managera transakcji. <em>Manager obiekt\u00f3w<\/em> nie mo\u017ce by\u0107 dost\u0119pny w punktach oznaczonych <strong>\/*xx*\/<\/strong>. Dlatego najlepiej jest, je\u015bli po zatwierdzeniu nie ma \u017cadnego kodu.<\/p>\n<p>Szablon dla transakcji ze sta\u0142ymi rozmiarami blok\u00f3w z funkcj\u0105 <em>commitBlock():<\/em><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">try (CisTransaction txn=tm.create...(..)) {\n\nint i=0;\n\nwhile (...) {\n\n...\n\nom.putObject(o);\n\nif (++i%100=0) {\n\ntxn.commitBlock();\n\n}\n\n}\n\ntxn.commit();\n\n\/*xx*\/\n\n}<\/pre>\n<p>Szablon dla transakcji z dynamicznym rozmiarem bloku z funkcj\u0105 <em>commitIfSizeLimitExceeded():<\/em><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">try (CisTransaction txn=tm.create...(..)) {\n\nint i=0;\n\nwhile (...) {\n\n...\n\nom.putObject(o);\n\ntxn.commitIfSizeLimitExceeded();\n\n}\n\ntxn.commit();\n\n\/*xx*\/\n\n}<\/pre>\n<p>Transakcja otwarta za pomoc\u0105 <em>create&#8230;<\/em> jest ju\u017c zamkni\u0119ta w pozycji <strong>\/*xx*\/<\/strong>. Manager obiekt\u00f3w nie u\u017cywa transakcji otwartej w <em>try<\/em> w pozycji<strong> \/*xx*\/<\/strong>.<\/p>\n<h5 id=\"inne-metody\" ><span class=\"ez-toc-section\" id=\"Inne_metody\"><\/span>Inne metody<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<h6 id=\"metoda-getcomparator\" ><span class=\"ez-toc-section\" id=\"Metoda_GetComparator\"><\/span>Metoda <em>GetComparator()<\/em><span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p>Metoda <em>getComparator()<\/em> zwraca komparator do por\u00f3wnywania ci\u0105g\u00f3w znak\u00f3w. U\u017cywa tego samego sortowania, co okre\u015blona baza danych. Pozwala to na replikacj\u0119 sortowania bazy danych podczas sortowania ci\u0105g\u00f3w w pami\u0119ci g\u0142\u00f3wnej. Metodzie mo\u017cna przekaza\u0107 alias bazy danych lub identyfikator <em>GUID<\/em> bazy danych, dla kt\u00f3rej ma zosta\u0107 dostarczony pasuj\u0105cy komparator. Je\u015bli nie okre\u015blono bazy danych, zwracany jest komparator dla bie\u017c\u0105cej bazy danych OLTP sesji.<\/p>\n<p>Tabela sortowania znak\u00f3w musi zosta\u0107 okre\u015blona, aby komparator m\u00f3g\u0142 replikowa\u0107 sortowanie bazy danych. Do tego celu s\u0142u\u017cy narz\u0119dzie<em> Sprawd\u017a collation<\/em> (chkcol).<\/p>\n<h6 id=\"metoda-builddatabaselock\" ><span class=\"ez-toc-section\" id=\"Metoda_buildDatabaseLock\"><\/span>Metoda <em>buildDatabaseLock()<\/em><span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p>Metoda <em>buildDatabaseLock()<\/em> powoduje, \u017ce \u0142a\u0144cuch blokady przekazywany jako parametr jest specyficzny dla bazy danych poprzez do\u0142\u0105czenie identyfikatora <em>GUID<\/em> okre\u015blonej bazy danych. Dzi\u0119ki temu ustawiana blokada logiczna jest wa\u017cna tylko dla okre\u015blonej bazy danych. Jest to konieczne, je\u015bli np. instancja obiektu biznesowego, kt\u00f3ra istnieje w kilku bazach danych OLTP, ma zosta\u0107 zmieniona, a klucz obiektu biznesowego jest u\u017cywany jako ci\u0105g blokady dla blokady logicznej. Zostanie on nast\u0119pnie zablokowany we wszystkich bazach danych, chocia\u017c blokada jest konieczna tylko na poziomie bazy danych. Do metody mo\u017cna przekaza\u0107 alias bazy danych lub identyfikator <em>GUID<\/em> bazy danych. Je\u015bli nie okre\u015blono bazy danych, u\u017cywana jest bie\u017c\u0105ca baza danych OLTP sesji.<\/p>\n<h5 id=\"wsparcie-dla-masowego-przetwarzania-danych\" ><span class=\"ez-toc-section\" id=\"Wsparcie_dla_masowego_przetwarzania_danych\"><\/span>Wsparcie dla masowego przetwarzania danych<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Transakcje zapisu w <em>Persistence service<\/em> maj\u0105 ograniczony rozmiar. Maksymalny rozmiar transakcji zale\u017cy od pami\u0119ci serwera aplikacji i ogranicze\u0144 systemu zarz\u0105dzania baz\u0105 danych. W zwi\u0105zku z tym, nie ma sensu kodowanie rozmiar\u00f3w transakcji w aplikacji, poniewa\u017c rozmiary transakcji zale\u017c\u0105 od parametr\u00f3w technicznych i nie s\u0105 wyspecjalizowane.<\/p>\n<p>U\u017cytkownik mo\u017ce zastosowa\u0107 <em>commitBlock()<\/em> lub <em>commitIfSizeLimitExceeded(),<\/em> aby zagwarantowa\u0107 ograniczone rozmiary transakcji. Wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale <em><a href=\"#PS1\">Blokowa transakcja zapisu z create&#8230;<\/a><\/em> .<\/p>\n<h4 id=\"manager-obiektow\" ><span class=\"ez-toc-section\" id=\"Manager_obiektow\"><\/span>Manager obiekt\u00f3w<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p><em>Maanager obiekt\u00f3w<\/em> <em>Persistence service<\/em> oferuje aplikacji dwie opcje dost\u0119pu do bazy danych. Po pierwsze, zapewnia metody odczytu, tworzenia, zmiany i usuwania na poziomie obiektu biznesowego, a po drugie, aplikacja mo\u017ce korzysta\u0107 z <em>Persistence service<\/em> w celu wykonania dowolnej instrukcji OQL systemu ERP w celu otwarcia lub zmiany danych. <em>Manager obiekt\u00f3w<\/em> mapuje obiektowy model danych u\u017cywany w aplikacji na relacyjny model bazy danych. Wymagane zapytania SQL s\u0105 generowane na podstawie instrukcji OQL. Wszystko to odbywa si\u0119 w spos\u00f3b przejrzysty dla aplikacji. Wszystkie dost\u0119py do bazy danych w aplikacjach odbywaj\u0105 si\u0119 w ramach transakcji zarz\u0105dzanych przez <em>Managera transakcji<\/em>.<\/p>\n<p>Instancj\u0119 managera obiekt\u00f3w wa\u017cn\u0105 dla bie\u017c\u0105cej sesji mo\u017cna sprawdzi\u0107 w \u015brodowisku sesji za pomoc\u0105 metody <em>getObjectManager().<\/em><\/p>\n<p><em>Manager obiekt\u00f3w<\/em> jest interfejsem dla aplikacji, za pomoc\u0105 kt\u00f3rego:<\/p>\n<ul>\n<li>Obiekty biznesowe mog\u0105 by\u0107 otwierane lub tworzone<br \/>\n(metoda <em>getObject()<\/em> , <em>getObjectArray()),<\/em><\/li>\n<li>Iteratory obiekt\u00f3w biznesowych mog\u0105 by\u0107 generowane do odczytu<br \/>\n(metoda <em>getObjectIterator()),<\/em><\/li>\n<li>mo\u017cna wykona\u0107 dowolne odczytane instrukcje OQL systemu ERP <em>(SELECT)<\/em><br \/>\n(metoda <em>getResultSet()),<\/em><\/li>\n<li>Obiekty biznesowe mog\u0105 by\u0107 rejestrowane w celu zapisania w bie\u017c\u0105cej transakcji<br \/>\n(metoda <em>putObject()<\/em>),<\/li>\n<li>Obiekty biznesowe mog\u0105 by\u0107 zarejestrowane do usuni\u0119cia w bie\u017c\u0105cej transakcji<br \/>\n(metoda <em>deleteObject()<\/em>),<\/li>\n<li>mo\u017cna wykonywa\u0107 dowolne instrukcje OQL systemu ERP (<em>UPDATE\/INSERT\/ DELETE<\/em>)<br \/>\n(metoda <em>getUpdateStatement()<\/em>).<\/li>\n<\/ul>\n<p>Wszystkie u\u017cywane obiekty biznesowe s\u0105 otwierane, tworzone, zapisywane lub usuwane za pomoc\u0105 <em>Managera obiekt\u00f3w<\/em>. Mo\u017cna ustawi\u0107 r\u00f3\u017cne tryby dost\u0119pu i okre\u015bli\u0107 j\u0119zyk tre\u015bci dla atrybut\u00f3w wieloj\u0119zycznych.<\/p>\n<h5 id=\"jezyk-tresci-content-language\" ><span class=\"ez-toc-section\" id=\"Jezyk_tresci_Content_language\"><\/span>J\u0119zyk tre\u015bci (Content language)<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>J\u0119zyk tre\u015bci s\u0142u\u017cy do kontrolowania j\u0119zyka, w kt\u00f3rym wieloj\u0119zyczne atrybuty instancji obiektu biznesowego powinny by\u0107 dost\u0119pne, tj. warto\u015b\u0107 atrybutu wieloj\u0119zycznego ma zastosowanie tylko do okre\u015blonego j\u0119zyka tre\u015bci. Je\u015bli nie okre\u015blono j\u0119zyka tre\u015bci, w\u00f3wczas u\u017cywany jest aktualnie ustawiony j\u0119zyk tre\u015bci u\u017cytkownika. Okre\u015blony j\u0119zyk tre\u015bci musi istnie\u0107 w bazie danych zgodnie z jej ustawieniami konfiguracyjnymi.<\/p>\n<p>J\u0119zyk tre\u015bci, w kt\u00f3rym zosta\u0142a otwarta instancja obiektu biznesowego, mo\u017cna sprawdzi\u0107 za pomoc\u0105 metody <em>get_contentLanguage()<\/em> klasy obiektu biznesowego.<\/p>\n<h5 id=\"metoda-getobject\" ><span class=\"ez-toc-section\" id=\"Metoda_GetObject\"><\/span>Metoda <em>GetObject()<\/em><span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Instancj\u0119 obiektu biznesowego mo\u017cna otworzy\u0107 za pomoc\u0105 funkcji <em>getObject().<\/em> Uwzgl\u0119dniany jest lokalny kontekst transakcji. Odczytywana jest zawsze ca\u0142a instancja ze wszystkimi atrybutami. Klucz <em>Persistence service<\/em> wygenerowany z klucza obiektu biznesowego i opcjonalnie tryb dost\u0119pu s\u0105 oczekiwane jako parametry. Klucz <em>Persistence service<\/em> wymagany do identyfikacji otwieranej instancji jest generowany przy u\u017cyciu odpowiedniej metody statycznej klasy obiektu biznesowego. Przyk\u0142adowo, metoda <em>buildPrimaryKey()<\/em> s\u0142u\u017cy do generowania klucza <em>Persistence service<\/em> z klucza podstawowego obiektu biznesowego.<\/p>\n<p>Metoda ta ma nast\u0119puj\u0105ce sygnatury:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">extends CisObject getObject(byte[] key);\nextends CisObject getObject(byte[] key, int flags);\nextends CisObject getObject(byte[] key, int flags, String language);<\/pre>\n<h6 id=\"tryb-dzialania\" ><span class=\"ez-toc-section\" id=\"Tryb_dzialania\"><\/span>Tryb dzia\u0142ania<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p>Manager obiekt\u00f3w najpierw pr\u00f3buje odczyta\u0107 instancj\u0119 obiektu biznesowego z <em>pami\u0119ci podr\u0119cznej transakcji<\/em> bie\u017c\u0105cej transakcji. Je\u015bli nie zostanie tam znaleziony, przeszukiwana jest <em>wsp\u00f3\u0142dzielona pami\u0119\u0107 podr\u0119czna<\/em>. Je\u015bli i tam nie zostanie znaleziony, uzyskiwany jest dost\u0119p do bazy danych. Wykonywane jest nast\u0119puj\u0105ce zapytanie SQL, kt\u00f3re wy\u015bwietla jeden wiersz lub brak wierszy jako wynik:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">SELECT * FROM table WHERE keyAttributes='?'<\/pre>\n<p>Manager obiekt\u00f3w tworzy instancj\u0119 klasy obiektu biznesowego, mapuje wynik zapytania na atrybuty i zwraca instancj\u0119 do aplikacji jako <em>CisObject.<\/em> Tam musi nast\u0105pi\u0107 rzutowanie typu z og\u00f3lnej klasy <em>CisObject<\/em> do konkretnej klasy odczytanego obiektu biznesowego. Je\u015bli baza danych nie zwr\u00f3ci\u0142a \u017cadnego wyniku, zwracana jest warto\u015b\u0107 <em>null.<\/em><\/p>\n<p>W zale\u017cno\u015bci od przekazanych flag (np.<em> READ_WRITE, INSERT<\/em>, &#8230;), nowe instancje obiekt\u00f3w biznesowych mog\u0105 by\u0107 r\u00f3wnie\u017c tworzone za pomoc\u0105 funkcji <em>getObject().<\/em> Warto\u015bci atrybut\u00f3w s\u0105 przenoszone z przekazanego klucza do instancji. Je\u015bli instancja jest tworzona z kluczem biznesowym lub kluczem drugorz\u0119dnym, atrybuty <em>GUID<\/em> z klucza podstawowego s\u0105 inicjowane nowym identyfikatorem <em>GUID.<\/em><\/p>\n<section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\"><\/p>\n<p>Poni\u017cszy fragment kodu \u017ar\u00f3d\u0142owego otwiera instancj\u0119 obiektu biznesowego <em>Item<\/em> poprzez klucz<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">podstawowy:byte[] guid = ...;\nbyte[] primKey = Item.buildPrimaryKey( guid );\nItem item = om.getObject(primKey, CisObjectManager.READ);<\/pre>\n<p>Nast\u0119pny fragment kodu \u017ar\u00f3d\u0142owego otwiera instancj\u0119 obiektu biznesowego <em>Item <\/em>poprzez klucz funkcjonalny <em>number:<\/em><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">String number = ...;\nbyte[] busKey = Item.buildByNumberKey( number );\nItem item = om.getObject(busKey, CisObjectManager.READ);<\/pre>\n<p><\/div><\/section>\n<h6 id=\"zaleznosc-od-czasu\" ><span class=\"ez-toc-section\" id=\"Zaleznosc_od_czasu-2\"><\/span>Zale\u017cno\u015b\u0107 od czasu<a id=\"PS2\"><\/a><span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p>Obiekty zale\u017cne od czasu s\u0105 zawsze otwierane z aktualnie aktywn\u0105 wersj\u0105. Je\u015bli ma zosta\u0107 otwarta wersja inna ni\u017c aktywna, musi zosta\u0107 przekazany klucz zale\u017cny od czasu, kt\u00f3ry jest generowany przy u\u017cyciu metody <em>buildTimeDependentKey().<\/em> Atrybuty klucza g\u0142\u00f3wnego i atrybut <em>validFrom<\/em>\u00a0s\u0105 przekazywane jako parametry:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">byte[] guid = ...;\n\nDate validFrom = ...;\nbyte[] primKey = Item.buildTimeDependentKey(guid, validFrom);\nItem item = om.getObject(primKey, CisObjectManager.READ);<\/pre>\n<p>Aby otworzy\u0107 wersj\u0119 instancji obiektu biznesowego, kt\u00f3ra jest wa\u017cna w dowolnym momencie, nale\u017cy wykona\u0107 odpowiednie zapytanie OQL za pomoc\u0105 metody <em>getObjectIterator().<\/em> Nie jest to mo\u017cliwe przy u\u017cyciu metody <em>getObject().<\/em><\/p>\n<p>Je\u015bli zale\u017cna od czasu instancja obiektu biznesowego jest tworzona przy u\u017cyciu funkcji <em>getObject(),<\/em> atrybut <em>validFrom<\/em>\u00a0jest ustawiany na sta\u0142\u0105 <em>MIN_DATE,<\/em> a atrybut <em>validUntil<\/em>\u00a0jest ustawiany na <em>MAX_DATE.<\/em><\/p>\n<h6 id=\"obsluga-nls\" ><span class=\"ez-toc-section\" id=\"Obsluga_NLS\"><\/span>Obs\u0142uga <em>NLS<\/em><span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p>Ka\u017cdy wieloj\u0119zyczny atrybut instancji obiektu biznesowego jest wype\u0142niany warto\u015bci\u0105 okre\u015blonego j\u0119zyka tre\u015bci, je\u015bli jest dost\u0119pny. Je\u015bli j\u0119zyk tre\u015bci odpowiada g\u0142\u00f3wnemu j\u0119zykowi bazy danych, warto\u015b\u0107 jest odczytywana bezpo\u015brednio z tabeli odpowiadaj\u0105cej obiektowi biznesowemu. Je\u015bli j\u0119zyk tre\u015bci jest drugorz\u0119dnym j\u0119zykiem bazy danych, warto\u015b\u0107 jest odczytywana z tabeli odpowiadaj\u0105cej obiektowi <em>NLS.<\/em> Je\u015bli nie ma t\u0142umaczenia dla j\u0119zyka, zwracana jest warto\u015b\u0107 dla j\u0119zyka g\u0142\u00f3wnego.<\/p>\n<p>Je\u015bli <em>null<\/em> zostanie przekazane jako j\u0119zyk dla <em>getObject,<\/em> instancja zostanie otwarta w j\u0119zyku bazy danych.<\/p>\n<p>Aby otworzy\u0107 obiekt z dodatkowym j\u0119zykiem, konieczne jest kilka dost\u0119p\u00f3w do bazy danych, poniewa\u017c t\u0142umaczenia atrybut\u00f3w lokalizowalnych pochodz\u0105 z oddzielnych obiekt\u00f3w <em>NLS.<\/em> Je\u015bli warto\u015b\u0107 atrybut\u00f3w <em>NLS<\/em> nie jest wymagana, obiekt mo\u017cna otworzy\u0107 z warto\u015bci\u0105 <em>null<\/em> jako j\u0119zykiem.<\/p>\n<h5 id=\"metoda-getobjectarray\" ><span class=\"ez-toc-section\" id=\"Metoda_GetObjectArray\"><\/span>Metoda <em>GetObjectArray()<\/em><span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Metoda <em>getObjectArray()<\/em> otwiera wiele instancji obiektu biznesowego. Pozosta\u0142e parametry metody odpowiadaj\u0105 parametrom metody <em>getObject().<\/em> Metoda <em>getObjectArray<\/em> ma zawsze kr\u00f3tszy czas odpowiedzi ni\u017c wielokrotne wywo\u0142anie <em>getObject.<\/em> Dlatego, je\u015bli to mo\u017cliwe, nale\u017cy u\u017cywa\u0107 <em>getObjectArray<\/em> zamiast <em>getObject.<\/em><\/p>\n<p>Sygnatury metody s\u0105 nast\u0119puj\u0105ce:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">CisObject[] getObjectArray(byte[][] primaryKeys, int flags)\nCisObject[] getObjectArray(byte[][] primaryKeys, int flags, String language)\nCisObject[] getObjectArray(java.util.List primaryKeys, int flags)\nCisObject[] getObjectArray(java.util.List primaryKeys, int flags, String language)<\/pre>\n<h6 id=\"tryb-dzialania\" ><span class=\"ez-toc-section\" id=\"Tryb_dzialania-2\"><\/span>Tryb dzia\u0142ania<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p>Manager obiekt\u00f3w pr\u00f3buje odczyta\u0107 instancje obiekt\u00f3w biznesowych z pami\u0119ci podr\u0119cznej transakcji. Instancje, kt\u00f3re nie zosta\u0142y znalezione, s\u0105 wyszukiwane we wsp\u00f3\u0142dzielonej pami\u0119ci podr\u0119cznej. Dost\u0119p do bazy danych jest uzyskiwany dla pozosta\u0142ych instancji, kt\u00f3re r\u00f3wnie\u017c nie zosta\u0142y tam znalezione. Wykonywane jest nast\u0119puj\u0105ce zapytanie SQL:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">SELECT * FROM table\nWHERE primaryKeyAttribute1=? OR ... OR primaryKeyAttributeN=?<\/pre>\n<p>Manager obiekt\u00f3w tworzy instancje klasy obiekt\u00f3w biznesowych, mapuje wynik zapytania na atrybuty i zwraca instancje do aplikacji jako <em>CisObject-Array.<\/em> Tam musi nast\u0105pi\u0107 rzutowanie typu z og\u00f3lnej klasy <em>CisObject<\/em> do konkretnej klasy odczytanych obiekt\u00f3w biznesowych. Je\u015bli nie zostanie znaleziony \u017caden wynik, zwracana jest pusta tablica <em>CisObject.<\/em><\/p>\n<section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\"><\/p>\n<p>Poni\u017cszy fragment kodu \u017ar\u00f3d\u0142owego otwiera instancje obiektu biznesowego <em>Item<\/em> poprzez klucze podstawowe:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">byte[] primKey1 = Item.buildPrimaryKey( guid1 );\n\n... byte\n[]\nprimKeyN\n= Item.buildPrimaryKey( guidN );\nbyte[][] primaryKeys = new byte[][]{primKey1, ...., primKeyN};\n\nCisObject[] objects = om.getObjectArray(\nprimaryKeys, CisTransactionManager.READ);\nfor (int i=0; i&lt; objects.length;i++) {\n\/\/ Pozycja w obiektach odpowiada pozycji w primaryKeys\n\nItem item = (Item) objects[i];\n\n...\n\n}<\/pre>\n<p><\/div><\/section>\n<h6 id=\"zaleznosc-od-czasu\" ><span class=\"ez-toc-section\" id=\"Zaleznosc_od_czasu-3\"><\/span>Zale\u017cno\u015b\u0107 od czasu<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p>Zachowanie odpowiada zachowaniu metody <em>getObject().<\/em> Wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w sekcji <a href=\"#PS2\"><em>Zale\u017cno\u015b\u0107 od czasu<\/em><\/a> w rozdziale<em> Metoda getObject().<\/em><\/p>\n<h6 id=\"obsluga-nls\" ><span class=\"ez-toc-section\" id=\"Obsluga_NLS-2\"><\/span>Obs\u0142uga <em>NLS<\/em><span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p>Zachowanie odpowiada zachowaniu metody <em>getObject()<\/em>. Wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w sekcji <a href=\"#PS2\"><em>Zale\u017cno\u015b\u0107 od czasu<\/em><\/a> w rozdziale <em>Metoda getObject()<\/em>.<\/p>\n<h5 id=\"metoda-getobjectlist\" ><span class=\"ez-toc-section\" id=\"Metoda_GetObjectList\"><\/span>Metoda GetObjectList()<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Metoda <em>getObjectList()<\/em> odczytuje kilka instancji obiektu biznesowego dla podanych kluczy w taki sam spos\u00f3b jak <em>getObjectArray().<\/em> Funkcje <em>getObjectList()<\/em> i <em>getObjectArray()<\/em> s\u0105 identyczne, ale <em>getObjectList()<\/em> wy\u015bwietla list\u0119 z obiektami biznesowymi, podczas gdy <em>getObjectArray()<\/em> wy\u015bwietla tablic\u0119. Rozmiar listy odpowiada liczbie przekazanych kluczy.<\/p>\n<p>Sygnatura metody to:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">&lt;T extends CisObject&gt;\nList&lt;T&gt; getObjectList(CisList keys, int flags)<\/pre>\n<p>Typ danych <em>List<\/em> jako warto\u015b\u0107 zwrotna umo\u017cliwia prost\u0105 konwersj\u0119 typu na list\u0119 z obiektami biznesowymi, kt\u00f3re s\u0105 faktycznie otwarte.<\/p>\n<section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\">\n<p>Poni\u017cszy fragment kodu \u017ar\u00f3d\u0142owego otwiera instancje obiektu biznesowego <em>Item<\/em> poprzez klucze podstawowe:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">CisList primaryKeys = new CisArrayList();\nprimaryKeys.add(Item.buildPrimaryKey( guid1 ));\n...\nprimaryKeys.add(Item.buildPrimaryKey( guidN ));\nList&lt;Item&gt; items = om.getObjectArray(\nprimaryKeys, CisTransactionManager.READ);\nfor (Item item : items) {\n\/\/ Pozycja w items odpowiada pozycji w primaryKeys\n...\n}\n\n<\/div><\/section><\/pre>\n<h5 id=\"metoda-putobject\" ><span class=\"ez-toc-section\" id=\"Metoda_putObject\"><\/span>Metoda putObject ()<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Ta metoda rejestruje instancj\u0119 obiektu biznesowego do zapisania w pami\u0119ci podr\u0119cznej transakcji bie\u017c\u0105cej transakcji i sprawia, \u017ce jej zmienione atrybuty s\u0105 widoczne w ca\u0142ej transakcji (= transakcje podrz\u0119dne lub podczas zatwierdzania transakcji nadrz\u0119dnej, a tym samym wszystkich transakcji podrz\u0119dnych). Dzi\u0119ki temu obiekt jest widoczny w bie\u017c\u0105cym kontek\u015bcie lokalnym transakcji.<\/p>\n<p>Sygnatura metody to:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">void putObject(CisObject obj)<\/pre>\n<h6 id=\"tryb-dzialania\" ><span class=\"ez-toc-section\" id=\"Tryb_dzialania-3\"><\/span>Tryb dzia\u0142ania<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p>Aby utworzy\u0107 lub zmieni\u0107 instancj\u0119 obiektu biznesowego, nale\u017cy najpierw otworzy\u0107 transakcj\u0119 najwy\u017cszego poziomu. Instancja jest nast\u0119pnie otwierana za pomoc\u0105<em> getObject()\/getObjectArray()<\/em>, okre\u015blaj\u0105c \u017c\u0105dany tryb dost\u0119pu.<\/p>\n<p>Tryb dost\u0119pu <em>READ_UPDATE<\/em> zapewnia instancje, kt\u00f3re mog\u0105 by\u0107 zmieniane lub usuwane zgodnie z wymaganiami. Tryb dost\u0119pu <em>READ_WRITE<\/em> tworzy now\u0105 instancj\u0119 obiektu biznesowego, je\u015bli obiekt jeszcze nie istnieje. W takim przypadku <em>READ_UPDATE<\/em> zwraca warto\u015b\u0107 <em>null.<\/em><\/p>\n<p>Odczytana instancja obiektu biznesowego jest blokowana dla innych transakcji przez <em>Persistence service<\/em>. Je\u015bli inna transakcja chce odczyta\u0107 t\u0119 sam\u0105 instancj\u0119 obiektu biznesowego, wyj\u0105tek limitu czasu pojawia si\u0119 po okre\u015blonym czasie oczekiwania.<\/p>\n<p>Zmiany atrybut\u00f3w s\u0105 wprowadzane przy u\u017cyciu metod <em>set&#8230;()<\/em> klasy obiektu biznesowego. Wywo\u0142anie <em>putObject()<\/em> z instancj\u0105 obiektu biznesowego jako parametrem przenosi zmiany do bie\u017c\u0105cej pami\u0119ci podr\u0119cznej transakcji.<\/p>\n<p>Instancja obiektu biznesowego, kt\u00f3ra zosta\u0142a przekazana do <em>putObject<\/em> jest niewa\u017cna po wywo\u0142aniu <em>putObject()<\/em> i nie mo\u017ce by\u0107 ju\u017c u\u017cywana. Nowa funkcja <em>getObject()<\/em> w ramach transakcji zwraca zmienion\u0105 instancj\u0119 obiektu biznesowego.<\/p>\n<p>Tylko zarejestrowane zmiany s\u0105 brane pod uwag\u0119 podczas <em>commit()<\/em> transakcji. Operacja bazy danych maj\u0105ca na celu utrwalenie zarejestrowanych zmian w bazie danych nie jest wykonywana do momentu <em>commit()<\/em> transakcji najwy\u017cszego poziomu.<\/p>\n<p>Je\u015bli obiekt biznesowy zawiera informacje o aktualizacji (atrybut <em>UpdateInformation<\/em>), czas i osoba, kt\u00f3ra dokona\u0142a ostatniej zmiany, s\u0105 aktualizowane podczas tego wywo\u0142ania.<\/p>\n<section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\"><\/p>\n<p>Poni\u017cszy fragment kodu \u017ar\u00f3d\u0142owego otwiera instancj\u0119 obiektu biznesowego <em>UnitOfMeasure<\/em> z bazy danych lub tworzy now\u0105 instancj\u0119:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">try (CisTransaction txn = tm.createNew()) {\nbyte[] key = UnitOfMeasure.buildByCodeKey(code);\n\n\/\/ Za\u0142aduj instancj\u0119 do zmiany\/utworzenia\nUnitOfMeasure unitOfMeasure = om.getObject(key,\n\nCisObjectManager.READ_WRITE);\n\nif (unitOfMeasure.is_newObject() ) {\n\n\/\/ utworzy\u0107\n\n} else {\n\n\/\/ aktualizacja\n\n}\n\n\/\/ Ustaw atrybuty\n\nunitOfMeasure.setDescription(description);\n...\n\n\/\/ Zarejestruj zmiany w pami\u0119ci podr\u0119cznej transakcji\n\nom.putObject(unitOfMeasure);\n\n\/\/ Zako\u0144czenie transakcji, zapisanie zmian\n\ntxn.commit() ;\n\n}<\/pre>\n<p><\/div><\/section>\n<h6 id=\"obiekt-stanu\" ><span class=\"ez-toc-section\" id=\"Obiekt_stanu\"><\/span>Obiekt stanu<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p>Ka\u017cda zmieniona instancja obiektu biznesowego ma jeden lub wi\u0119cej obiekt\u00f3w stanu, kt\u00f3re zawieraj\u0105 rzeczywiste warto\u015bci atrybut\u00f3w. W przypadku zmian atrybut\u00f3w, nowy obiekt stanu jest tworzony w kontek\u015bcie lokalnym transakcji &#8211; je\u015bli jeszcze nie istnieje &#8211; kt\u00f3ry zawiera atrybuty obowi\u0105zuj\u0105ce w tym kontek\u015bcie. Obiekty stanu s\u0105 specyficzne dla transakcji i s\u0105 przenoszone do transakcji nadrz\u0119dnej tylko podczas zatwierdzenia.<\/p>\n<h6 id=\"zaleznosc-od-czasu\" ><span class=\"ez-toc-section\" id=\"Zaleznosc_od_czasu-4\"><\/span>Zale\u017cno\u015b\u0107 od czasu<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p>Instancje zale\u017cne od czasu s\u0105 obs\u0142ugiwane w zale\u017cno\u015bci od warto\u015bci atrybut\u00f3w <em>validFrom<\/em> i <em>validUntil<\/em>:<\/p>\n<ul>\n<li>Je\u015bli <em>validFrom<\/em> ma warto\u015b\u0107 <em>null,<\/em> w\u00f3wczas <em>validFrom<\/em> jest ustawiane na bie\u017c\u0105cy czas.<\/li>\n<li>Je\u015bli atrybut <em>validUntil<\/em> jest ustawiony na <em>null,<\/em> atrybut ten jest ustawiany na <em>validFrom<\/em> kolejnej wersji podczas <em>putObject.<\/em> Je\u015bli nie istnieje kolejna wersja, <em>validUntil<\/em> jest ustawiane na <em>MAX_DATE.<\/em><\/li>\n<\/ul>\n<p>Atrybut <em>validUntil<\/em> poprzedniej wersji jest ustawiany na <em>validFrom<\/em>\u00a0zmodyfikowanego obiektu.<\/p>\n<p>Wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale\u00a0<em><a href=\"#PS3\">Zale\u017cno\u015b\u0107 od czasu.<\/a><\/em><\/p>\n<h6 id=\"obsluga-nls\" ><span class=\"ez-toc-section\" id=\"Obsluga_NLS-3\"><\/span>Obs\u0142uga <em>NLS<\/em><span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p>Gdy tworzona jest instancja obiektu biznesowego, wszystkie wpisy j\u0119zyk\u00f3w drugorz\u0119dnych s\u0105 tworzone w tabeli <em>NLS<\/em> powi\u0105zanej z atrybutem wieloj\u0119zyczno\u015bci, niezale\u017cnie od okre\u015blonego j\u0119zyka tre\u015bci. Warto\u015b\u0107 atrybutu jest przenoszona zar\u00f3wno do j\u0119zyka g\u0142\u00f3wnego, jak i j\u0119zyk\u00f3w dodatkowych.<\/p>\n<p>Gdy instancja obiektu biznesowego zostanie zmieniona, warto\u015b\u0107 ustawiona dla atrybutu wieloj\u0119zycznego zostanie zapisana w okre\u015blonym j\u0119zyku tre\u015bci w bazie danych. Je\u015bli j\u0119zyk tre\u015bci jest g\u0142\u00f3wnym j\u0119zykiem bazy danych, warto\u015b\u0107 jest zapisywana bezpo\u015brednio w tabeli odpowiadaj\u0105cej obiektowi biznesowemu. Je\u015bli jest to j\u0119zyk drugorz\u0119dny, warto\u015b\u0107 jest zapisywana w tabeli odpowiadaj\u0105cej tabeli <em>NLS.<\/em><\/p>\n<h5 id=\"metoda-deleteobject\" ><span class=\"ez-toc-section\" id=\"Metoda_deleteObject\"><\/span>Metoda deleteObject()<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Metoda <em>deleteObject()<\/em> rejestruje instancj\u0119 obiektu biznesowego do usuni\u0119cia w pami\u0119ci podr\u0119cznej transakcji bie\u017c\u0105cej transakcji. Powoduje to usuni\u0119cie go z bie\u017c\u0105cego kontekstu lokalnego transakcji. Sygnatura metody to:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">void deleteObject(CisObject obj)\n<\/pre>\n<h6 id=\"tryb-dzialania\" ><span class=\"ez-toc-section\" id=\"Tryb_dzialania-4\"><\/span>Tryb dzia\u0142ania<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p>Aby usun\u0105\u0107 instancj\u0119, nale\u017cy najpierw otworzy\u0107 transakcj\u0119 najwy\u017cszego poziomu. Obiekt biznesowy, kt\u00f3ry ma zosta\u0107 zmieniony, jest nast\u0119pnie otwierany za pomoc\u0105 funkcji <em>getObject(),<\/em> okre\u015blaj\u0105c tryb dost\u0119pu <em>READ_UPDATE.<\/em> Wywo\u0142anie <em>deleteObject()<\/em> z instancj\u0105 obiektu biznesowego oznaczon\u0105 jako parametr ustawia instancj\u0119 w pami\u0119ci podr\u0119cznej bie\u017c\u0105cej transakcji do usuni\u0119cia. Gdy transakcja najwy\u017cszego poziomu zostanie zatwierdzona, instancja obiektu biznesowego zarejestrowana do usuni\u0119cia zostanie usuni\u0119ta z bazy danych.<\/p>\n<p>Po usuni\u0119ciu instancji obiektu biznesowego za pomoc\u0105 funkcji <em>deleteObject(),<\/em> otwarta instancja jest niewa\u017cna i nie mo\u017ce by\u0107 ju\u017c u\u017cywana. Ponowny odczyt tej samej instancji obiektu biznesowego w trybie dost\u0119pu <em>READ-UPDATE<\/em> zwraca teraz warto\u015b\u0107 <em>null.<\/em> Je\u015bli usuni\u0119ta instancja zostanie ponownie odczytana w trybie <em>READ_WRITE<\/em> w tej samej transakcji (lub jej podtransakcjach), w kt\u00f3rej instancja zosta\u0142a usuni\u0119ta, us\u0142uga trwa\u0142o\u015bci nie utworzy nowego obiektu, ale zwr\u00f3ci zawarto\u015b\u0107 poprzednio usuni\u0119tej instancji.<\/p>\n<section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\"><\/p>\n<p>Poni\u017cszy fragment kodu \u017ar\u00f3d\u0142owego otwiera instancj\u0119 obiektu biznesowego <em>UnitOfMeasure<\/em> z bazy danych. Znaleziona instancja jest oznaczona do usuni\u0119cia. Instancja jest usuwana w momencie <em>commit.<\/em><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">try (CisTransaction txn = tm.beginNew()) {\nbyte[] key = UnitOfMeasure.buildByCodeKey(code);\n\n\/\/ Za\u0142aduj instancj\u0119 do zmiany\/utworzenia\nUnitOfMeasure unitOfMeasure = (UnitOfMeasure) om.getObject(key,\n\nCisObjectManager.READ_UPDATE);\n\nif (unitOfMeasure==null) {\n\n\/\/ Nie znaleziono\n\n...\n\n} else {\n\n\/\/ Wybierz, aby usun\u0105\u0107\n\nom.deleteObject(unitOfMeasure);\n\n}\n\n\/\/ Zako\u0144czenie transakcji, zapisanie zmian\n\ntxn.commit();\n\n}<\/pre>\n<p><\/div><\/section>\n<h6 id=\"zaleznosc-od-czasu\" ><span class=\"ez-toc-section\" id=\"Zaleznosc_od_czasu-5\"><\/span>Zale\u017cno\u015b\u0107 od czasu<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p>Gdy zale\u017cna od czasu wersja instancji obiektu biznesowego zostanie usuni\u0119ta, warto\u015b\u0107 atrybutu <em>validUntil<\/em>\u00a0kontroluje, czy powsta\u0142a luka w \u0142a\u0144cuchu wersji zostanie zamkni\u0119ta.<\/p>\n<p>Je\u015bli warto\u015b\u0107 wynosi <em>null,<\/em> okres wa\u017cno\u015bci poprzedniej wersji jest przed\u0142u\u017cany o okres wa\u017cno\u015bci usuni\u0119tej wersji. Poprzednia wersja jest zatem wa\u017cna tak d\u0142ugo, jak usuni\u0119ta wersja (przeniesienie warto\u015bci z <em>validUntil<\/em>\u00a0usuni\u0119tej wersji do poprzedniej wersji).<\/p>\n<p>Je\u015bli warto\u015b\u0107 nie wynosi <em>null,<\/em> okre\u015blona wersja zostanie usuni\u0119ta, a w \u0142a\u0144cuchu wersji mo\u017ce pozosta\u0107 luka.<\/p>\n<p>Wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale\u00a0<em><a href=\"#PS3\">Zale\u017cno\u015b\u0107 od czasu.<\/a><\/em><\/p>\n<h6 id=\"obsluga-nls\" ><span class=\"ez-toc-section\" id=\"Obsluga_NLS-4\"><\/span>Obs\u0142uga <em>NLS<\/em><span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p>Po usuni\u0119ciu instancji obiektu biznesowego z atrybutami wieloj\u0119zycznymi, powi\u0105zane wpisy dla j\u0119zyk\u00f3w dodatkowych s\u0105 r\u00f3wnie\u017c usuwane z tabel NLS.<\/p>\n<h5 id=\"metoda-getobjectiterator\" ><span class=\"ez-toc-section\" id=\"Metoda_getObjectIterator\"><\/span>Metoda <em>getObjectIterator()<\/em><span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Metoda <em>getObjectIterator()<\/em> mo\u017ce by\u0107 u\u017cyta do otwarcia zestawu instancji obiekt\u00f3w biznesowych. W tym celu metoda zwraca iterator poprzez zestaw wynik\u00f3w okre\u015blonego zapytania OQL. Instrukcja OQL <em>SELECT<\/em> i opcjonalnie tryb dost\u0119pu s\u0105 oczekiwane jako parametry. Podobnie jak w przypadku <em>getObject(),<\/em> mo\u017cna r\u00f3wnie\u017c okre\u015bli\u0107 j\u0119zyk tre\u015bci dla otwieranych instancji.<\/p>\n<p>Metoda ta ma nast\u0119puj\u0105ce sygnatury:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">CisObjectIterator getObjectIterator (String oqlString)\nCisObjectIterator getObjectIterator (String oqlString, int flags)\nCisObjectIterator getObjectIterator (String oqlString, int flags, String language)<\/pre>\n<p>U\u017cycie sub-selekcji w klauzuli <em>WHERE<\/em> jest dozwolone w instrukcji OQL. Po\u0142\u0105czenia nie s\u0105 obs\u0142ugiwane.<\/p>\n<h6 id=\"tryb-dzialania\" ><span class=\"ez-toc-section\" id=\"Tryb_dzialania-5\"><\/span>Tryb dzia\u0142ania<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p>Metoda <em>getObjectIterator()<\/em> zwraca iterator, kt\u00f3ry jest u\u017cywany w aplikacji do otwierania instancji obiekt\u00f3w biznesowych. Nast\u0119pnie ustawiane s\u0105 warto\u015bci parametr\u00f3w wyboru, kt\u00f3re zosta\u0142y okre\u015blone w instrukcji OQL za pomoc\u0105 symbolu zast\u0119pczego <em>?<\/em>. Pierwsze wywo\u0142anie <em>hasNext()<\/em> lub <em>next()<\/em> na iteratorze wyzwala dost\u0119p do bazy danych. Metoda <em>hasNext()<\/em> sprawdza, czy instancje mog\u0105 by\u0107 nadal dostarczane. Metoda <em>next()<\/em> dostarcza nast\u0119pn\u0105 instancj\u0119 do aplikacji. Je\u015bli obiekt biznesowy jest buforowany we wsp\u00f3\u0142dzielonej pami\u0119ci podr\u0119cznej, warto\u015bci klucza podstawowego s\u0105 otwierane jako pierwsze:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">SELECT primkeyAttr FROM table [WHERE ...]<\/pre>\n<p>Instancje obiekt\u00f3w biznesowych s\u0105 tworzone przy u\u017cyciu wewn\u0119trznie wywo\u0142ywanej metody <em>getObjectArray(),<\/em> kt\u00f3ra otwiera instancje w blokach za po\u015brednictwem kluczy g\u0142\u00f3wnych. Domy\u015blny rozmiar bloku to 16. Je\u015bli instancja obiektu biznesowego jest oznaczona jako usuni\u0119ta w pami\u0119ci podr\u0119cznej bie\u017c\u0105cej transakcji, jest filtrowana i nie jest zwracana. Iterator obiekt\u00f3w nigdy nie zwraca warto\u015bci <em>null.<\/em> W aplikacji nale\u017cy wykona\u0107 rzutowanie typu z og\u00f3lnej klasy <em>CisObject<\/em> do okre\u015blonej klasy odczytywanych obiekt\u00f3w biznesowych.<\/p>\n<p>Je\u015bli obiekt biznesowy nie jest buforowany we wsp\u00f3\u0142dzielonej pami\u0119ci podr\u0119cznej, wszystkie atrybuty s\u0105 odczytywane bezpo\u015brednio z bazy danych i tworzone s\u0105 instancje obiektu biznesowego. Je\u015bli znacznik <em>BYPASS_CACHE<\/em> jest okre\u015blona dla <em>getObjectIterator(),<\/em> instancje s\u0105 r\u00f3wnie\u017c ca\u0142kowicie otwierane przez baz\u0119 danych, tak jakby obiekt biznesowy nie by\u0142 buforowany.<\/p>\n<p>Je\u015bli u\u017cywany jest iterator obiekt\u00f3w z znacznikami <em>READ_UPDATE<\/em> lub <em>READ_WRITE,<\/em> w\u00f3wczas tylko klucze podstawowe s\u0105 odczytywane z bazy danych, a obiekty s\u0105 otwierane za pomoc\u0105 funkcji <em>getObjectArray().<\/em><\/p>\n<section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\"><\/p>\n<p>Poni\u017cszy fragment kodu \u017ar\u00f3d\u0142owego otwiera instancje obiektu biznesowego <em>Item,<\/em> do kt\u00f3rego przypisana jest okre\u015blona jednostka miary (obiekt biznesowy <em>UnitOfMeasure).<\/em> Ich klucz g\u0142\u00f3wny typu <em>GUID<\/em> jest ustawiany jako parametr w iteratorze za pomoc\u0105 metody <em>setGuid(),<\/em> kt\u00f3ra przekazuje pozycj\u0119 w instrukcji OQL i warto\u015b\u0107 jako parametry.<\/p>\n<p>Przyk\u0142ad z parametrem OQL:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">byte[] uomGuid = ... ; try (CisObjectIterator&lt;Item&gt; iter = ... ;\ntry (CisObjectIterator&lt;Item&gt; iter = om.getObjectIterator(\n\n\"SELECT FROM com.cisag.app.general.obj.Item i WHERE i:uom=?\")\n\n) {\n\niter.setGuid(1, uomGuid);\n\nwhile (iter.hasNext() ) {\nItem item = (Item) iter.next() ;\n\n...\n\n}\n}<\/pre>\n<p><\/div><\/section>\n<h6 id=\"nota-wyjasniajaca\" ><span class=\"ez-toc-section\" id=\"Nota_wyjasniajaca\"><\/span>Nota wyja\u015bniaj\u0105ca<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p>Wynik wyra\u017cenia OQL jest obliczany bezpo\u015brednio na danych w bazie danych; pami\u0119\u0107 podr\u0119czna transakcji nie jest brana pod uwag\u0119. Obiekty zmienione w tym samym kontek\u015bcie transakcji nie s\u0105 zatem brane pod uwag\u0119, poniewa\u017c zmiany te nie zosta\u0142y jeszcze zapisane w bazie danych. Staj\u0105 si\u0119 one trwa\u0142e dopiero po zako\u0144czeniu transakcji najwy\u017cszego poziomu. Oznacza to, \u017ce iterator obiekt\u00f3w mo\u017ce dostarcza\u0107 nieprawid\u0142owe dane, je\u015bli jego instrukcja OQL wp\u0142ywa r\u00f3wnie\u017c na zmienione obiekty. Nowo utworzone obiekty nie mog\u0105 by\u0107 brane pod uwag\u0119 ze wzgl\u0119du na zasad\u0119 funkcjonaln\u0105, usuni\u0119te obiekty mo\u017cna odfiltrowa\u0107 za pomoc\u0105 klucza podstawowego.<\/p>\n<p>To zachowanie nale\u017cy wzi\u0105\u0107 pod uwag\u0119 podczas korzystania z funkcji <em>getObjectIterator()<\/em> w zmieniaj\u0105cych si\u0119 transakcjach.<\/p>\n<h6 id=\"zaleznosc-od-czasu\" ><span class=\"ez-toc-section\" id=\"Zaleznosc_od_czasu-6\"><\/span>Zale\u017cno\u015b\u0107 od czasu<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p>Je\u015bli ani <em>validFrom,<\/em> ani <em>validUntil<\/em> nie s\u0105 u\u017cywane w instrukcji OQL dla obiekt\u00f3w biznesowych zale\u017cnych od czasu, zwracane s\u0105 tylko aktualnie wa\u017cne instancje. Je\u015bli <em>validFrom<\/em> lub <em>validUntil<\/em>\u00a0jest u\u017cywane w dowolnej cz\u0119\u015bci instrukcji OQL, w\u00f3wczas zwracane s\u0105 wszystkie dost\u0119pne wersje, do kt\u00f3rych odnosi si\u0119 warunek instrukcji OQL.<\/p>\n<h6 id=\"obsluga-nls\" ><span class=\"ez-toc-section\" id=\"Obsluga_NLS-5\"><\/span>Obs\u0142uga <em>NLS<\/em><span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p>Zachowanie odpowiada zachowaniu metody <em>getObject(),<\/em> patrz sekcja<a href=\"#PS2\"><em> Zale\u017cno\u015b\u0107 od czasu<\/em><\/a> w rozdziale <em>Metoda getObject().<\/em><\/p>\n<h5 id=\"metoda-getresultset\" ><span class=\"ez-toc-section\" id=\"Metoda_getResultSet\"><\/span>Metoda getResultSet()<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Metoda <em>getResultSet()<\/em> mo\u017ce by\u0107 u\u017cywana do odczytywania atrybut\u00f3w z obiekt\u00f3w biznesowych za pomoc\u0105 instrukcji <em>SELECT<\/em> j\u0119zyka OQL. Atrybuty wynik\u00f3w mog\u0105 by\u0107 \u0142\u0105czone zgodnie z wymaganiami za pomoc\u0105 instrukcji <em>SELECT<\/em> w OQL. \u017badne kompletne instancje obiekt\u00f3w biznesowych nie s\u0105 odczytywane z bazy danych. Zestaw wynik\u00f3w jest powi\u0105zany z bie\u017c\u0105c\u0105 transakcj\u0105. Po\u0142\u0105czenia i podselekcje s\u0105 dozwolone w \u0142a\u0144cuchu OQL.<\/p>\n<p>Dop\u00f3ki zestaw wynik\u00f3w nie zostanie zamkni\u0119ty, po\u0142\u0105czenie z baz\u0105 danych jest u\u017cywane wy\u0142\u0105cznie. Po\u0142\u0105czenie z baz\u0105 danych jest ponownie zwalniane dopiero po zamkni\u0119ciu zestawu wynik\u00f3w. Polecenie <em>rollback()<\/em> lub <em>commit()<\/em> domy\u015blnie zamyka wszystkie zestawy wynik\u00f3w powi\u0105zanej transakcji. Je\u015bli zestaw wynik\u00f3w jest u\u017cywany w ramach fikcyjnej transakcji, deweloper musi upewni\u0107 si\u0119, \u017ce zosta\u0142 on zamkni\u0119ty. Zestaw wynik\u00f3w powinien by\u0107 zawsze u\u017cywany w bloku <em>try\/catch.<\/em> W bloku <em>finally<\/em> zestaw wynik\u00f3w jest jawnie zamykany za pomoc\u0105 metody <em>close().<\/em><\/p>\n<p>Wa\u017cne jest, aby zminimalizowa\u0107 czas otwarcia zestawu wynik\u00f3w, poniewa\u017c liczba dost\u0119pnych po\u0142\u0105cze\u0144 z baz\u0105 danych jest ograniczona. Z\u0142o\u017cone lub d\u0142ugie operacje powinny by\u0107 wykonywane dopiero po zamkni\u0119ciu zestawu wynik\u00f3w. Wa\u017cne jest r\u00f3wnie\u017c, aby zagnie\u017cd\u017cone zestawy wynik\u00f3w korzysta\u0142y z w\u0142asnego po\u0142\u0105czenia z baz\u0105 danych. Oznacza to, \u017ce liczba dost\u0119pnych po\u0142\u0105cze\u0144 z baz\u0105 danych ogranicza g\u0142\u0119boko\u015b\u0107 zagnie\u017cd\u017cenia. Z tego powodu g\u0142\u0119boko\u015b\u0107 zagnie\u017cd\u017cenia powinna by\u0107 niewielka.<\/p>\n<p>Sygnatury metody s\u0105 nast\u0119puj\u0105ce:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">CisResultSet getResultSet(String oqlString)\nCisResultSet getResultSet(String oqlString, int flags)\nCisResultSet getResultSet(String oqlString, int flags, String language)<\/pre>\n<h6 id=\"tryb-dzialania\" ><span class=\"ez-toc-section\" id=\"Tryb_dzialania-6\"><\/span>Tryb dzia\u0142ania<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p>Metoda <em>getResultSet()<\/em> zwraca zestaw wynik\u00f3w, kt\u00f3ry mo\u017ce by\u0107 u\u017cyty do zapytania zestawu wynik\u00f3w rekord po rekordzie. Instrukcja OQL przekazana jako parametr mo\u017ce zawiera\u0107 symbole zast\u0119pcze (<em>?<\/em>) dla warto\u015bci, kt\u00f3rym nale\u017cy przypisa\u0107 odpowiednie warto\u015bci wyboru przed wykonaniem zapytania. Odbywa si\u0119 to za pomoc\u0105 metody <em>set&#8230;()<\/em> odpowiadaj\u0105cej typowi danych parametru wyboru, do kt\u00f3rej warto\u015b\u0107 wyboru i numer parametru wyboru s\u0105 przekazywane jako parametry. Numeracja parametr\u00f3w wyboru jest niejawnie okre\u015blona przez ich pozycj\u0119 (od lewej) w instrukcji OQL. Zapytanie jest oceniane przez baz\u0119 danych, gdy pierwszy rekord wyniku jest odpytywany przy u\u017cyciu metody <em>next()<\/em>.<\/p>\n<p>Warto\u015bci atrybut\u00f3w dla tego zestawu mog\u0105 by\u0107 nast\u0119pnie odpytywane przy u\u017cyciu metody <em>get&#8230;()<\/em> odpowiadaj\u0105cej typowi danych. Numer atrybutu jest przekazywany do metody <em>get&#8230;()<\/em> jako parametr. Jest on okre\u015blony przez kolejno\u015b\u0107 atrybut\u00f3w wyniku w klauzuli <em>SELECT<\/em> (od lewej). Istnienie nast\u0119pnego rekordu wyniku mo\u017cna sprawdzi\u0107 za pomoc\u0105 metody <em>hasNext().<\/em> Je\u015bli istniej\u0105 kolejne rekordy, ponowne wywo\u0142anie metody <em>next()<\/em> zwraca nast\u0119pny rekord. Aplikacja musi pobra\u0107 atrybuty odczytanego rekordu ze zbioru wynik\u00f3w za pomoc\u0105 odpowiedniej metody (w zale\u017cno\u015bci od typu danych). Po odczytaniu danych nale\u017cy upewni\u0107 si\u0119, \u017ce zestaw wynik\u00f3w zosta\u0142 zamkni\u0119ty.<\/p>\n<section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\"><\/p>\n<p>Poni\u017cszy fragment kodu \u017ar\u00f3d\u0142owego otwiera tylko atrybuty <em>guid<\/em> (klucz podstawowy) i <em>number<\/em>\u00a0(klucz funkcjonalny) instancji obiektu biznesowego <em>Item,<\/em> do kt\u00f3rego przypisana jest okre\u015blona jednostka miary (obiekt biznesowy <em>UnitOfMeasure).<\/em> Ich klucz g\u0142\u00f3wny typu <em>GUID<\/em> jest ustawiany jako parametr w zestawie wynik\u00f3w za pomoc\u0105 metody <em>setGuid()<\/em> (pasuj\u0105cej do typu), do kt\u00f3rej pozycja w instrukcji OQL i warto\u015b\u0107 s\u0105 przekazywane jako parametry. Blok <em>try-catch-finally<\/em> zapewnia, \u017ce zestaw wynik\u00f3w zostanie zamkni\u0119ty, nawet je\u015bli wyst\u0105pi wyj\u0105tek.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">byte[] uomGuid = ... ;\n\ntry (CisResultSet rs = om.getResultSet(\"SELECT i:guid, i:number\n\nFROM com.cisag.app.general.obj.Item i\n\nWHERE i:uom=?\")) {\n\nrs.setGuid(1, uomGuid);\n\nwhile (rs.next() ) {\n\n\/\/ czytaj dalej\n\nbyte[] guid = rs.getGuid(1);\n\nString number = rs.getString(2);\n\n...\n\n}\n}<\/pre>\n<p>[\/alert]<\/p>\n<h6 id=\"nota-wyjasniajaca\" ><span class=\"ez-toc-section\" id=\"Nota_wyjasniajaca-2\"><\/span>Nota wyja\u015bniaj\u0105ca<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p>Zestaw wynik\u00f3w jest zawsze oceniany w bazie danych, pami\u0119\u0107 podr\u0119czna transakcji nie jest brana pod uwag\u0119. Podobnie jak w przypadku <em>getObjectIterator(),<\/em> zmiany w pami\u0119ci podr\u0119cznej transakcji nie maj\u0105 wp\u0142ywu na wyb\u00f3r zwracanych warto\u015bci. Nale\u017cy to wzi\u0105\u0107 pod uwag\u0119 podczas korzystania z funkcji <em>getResultSet()<\/em> w zmieniaj\u0105cych si\u0119 transakcjach.<\/p>\n<h6 id=\"zaleznosc-od-czasu\" ><span class=\"ez-toc-section\" id=\"Zaleznosc_od_czasu-7\"><\/span>Zale\u017cno\u015b\u0107 od czasu<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p>Je\u015bli ani atrybut <em>validFrom,<\/em> ani <em>validUntil<\/em> obiektu biznesowego zale\u017cnego od czasu nie jest u\u017cywany w instrukcji OQL, w\u00f3wczas tylko aktualnie wa\u017cne wersje s\u0105 brane pod uwag\u0119 podczas oceny instrukcji OQL. Je\u015bli atrybut <em>validFrom<\/em> lub <em>validUntil<\/em>\u00a0obiektu biznesowego jest u\u017cywany w dowolnej cz\u0119\u015bci instrukcji OQL, w\u00f3wczas wszystkie dost\u0119pne wersje s\u0105 uwzgl\u0119dniane w zapytaniu.<\/p>\n<h6 id=\"obsluga-nls\" ><span class=\"ez-toc-section\" id=\"Obsluga_NLS-6\"><\/span>Obs\u0142uga <em>NLS<\/em><span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p>Zestaw wynik\u00f3w oferuje obs\u0142ug\u0119 <em>NLS<\/em> dla atrybut\u00f3w wieloj\u0119zycznych. Je\u015bli okre\u015blony j\u0119zyk tre\u015bci jest g\u0142\u00f3wnym j\u0119zykiem bazy danych, warto\u015bci atrybut\u00f3w s\u0105 odczytywane z tabel powi\u0105zanych obiekt\u00f3w biznesowych. Je\u015bli zaanga\u017cowany jest j\u0119zyk dodatkowy, instrukcja OQL jest rozszerzana o odpowiednie sprz\u0119\u017cenia wewn\u0119trzne do obiekt\u00f3w <em>NLS<\/em> atrybut\u00f3w wieloj\u0119zycznych. Warto\u015b\u0107 atrybutu wieloj\u0119zycznego jest odczytywana z tabeli <em>NLS<\/em> dla okre\u015blonego j\u0119zyka tre\u015bci.<\/p>\n<h5 id=\"metoda-getupdatestatement\" ><span class=\"ez-toc-section\" id=\"Metoda_getUpdateStatement\"><\/span>Metoda <em>getUpdateStatement<\/em> ()<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>OQL mo\u017ce by\u0107 u\u017cywany do wykonywania instrukcji <em>UPDATE, INSERT<\/em> lub <em>DELETE.<\/em> Pozwala to na zmian\u0119, wstawienie lub usuni\u0119cie wielu instancji obiekt\u00f3w biznesowych za pomoc\u0105 jednego polecenia.<\/p>\n<p>Instrukcja aktualizacji jest wykonywana tylko wtedy, gdy transakcja najwy\u017cszego poziomu jest zatwierdzona. Wcze\u015bniej instrukcja <em>UPDATE<\/em> nie ma wp\u0142ywu na dane, kt\u00f3re maj\u0105 zosta\u0107 otwarte w transakcji. Je\u015bli u\u017cytkownik chcia\u0142by zmieni\u0107, wprowadzi\u0107 lub usun\u0105\u0107 obiekt biznesowy za pomoc\u0105 instrukcji <em>UPDATE,<\/em> a tak\u017ce zmodyfikujesz go w tej samej transakcji za pomoc\u0105 metod <em>putObject<\/em> lub <em>deleteObject,<\/em> spowoduje to b\u0142\u0105d. Instrukcja <em>UPDATE<\/em> blokuje ca\u0142\u0105 tabel\u0119, na kt\u00f3rej dzia\u0142a instrukcja; \u017cadna inna transakcja nie mo\u017ce otworzy\u0107 instancji obiektu biznesowego tego typu. Je\u015bli obiekt biznesowy zostanie zmieniony za pomoc\u0105 instrukcji <em>UPDATE,<\/em> wszystkie inne sesje, kt\u00f3re chc\u0105 zmieni\u0107 instancje tego samego obiektu biznesowego, musz\u0105 poczeka\u0107 na zako\u0144czenie transakcji z instrukcj\u0105 <em>UPDATE.<\/em> U\u017cycie instrukcji <em>UPDATE<\/em> mo\u017ce zatem uniemo\u017cliwi\u0107 skalowanie aplikacji.<\/p>\n<p>Instrukcja <em>UPDATE<\/em> nie mo\u017ce zmienia\u0107 \u017cadnych atrybut\u00f3w klucza podstawowego.<\/p>\n<p>Wydajno\u015b\u0107, np. podczas usuwania wielu rekord\u00f3w danych, jest znacznie wy\u017csza w przypadku usuwania OQL ni\u017c za po\u015brednictwem <em>Persistence service<\/em>. U\u017cycie instrukcji <em>UPDATE<\/em> ma jednak powa\u017cny wp\u0142yw na og\u00f3ln\u0105 wydajno\u015b\u0107 systemu. Po u\u017cyciu instrukcji aktualizacji wszystkie instancje tego obiektu biznesowego w tej bazie danych s\u0105 usuwane ze wszystkich wsp\u00f3\u0142dzielonych pami\u0119ci podr\u0119cznych w ca\u0142ym systemie. Je\u015bli inne aplikacje zale\u017c\u0105 od instancji tego obiektu biznesowego przechowywanych w pami\u0119ci podr\u0119cznej, wydajno\u015b\u0107 jest znacznie zmniejszona.<\/p>\n<p>Ani Workflow management, ani dziennik zmian nie s\u0105 powiadamiane, je\u015bli instancje obiekt\u00f3w biznesowych s\u0105 zmieniane, usuwane lub tworzone przez instrukcje aktualizacji. Informacje o aktualizacji nie s\u0105 aktualizowane dla instancji obiekt\u00f3w biznesowych utworzonych i zmienionych przez instrukcje aktualizacji.<\/p>\n<p>Instrukcje aktualizacji s\u0105 przede wszystkim odpowiednie dla nast\u0119puj\u0105cych przypadk\u00f3w u\u017cycia:<\/p>\n<ul>\n<li>Usuwanie danych tymczasowych<\/li>\n<li>Reorganizacje<\/li>\n<\/ul>\n<p><section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\"><\/div><\/section><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">try (CisTransaction txn=tm.create()) {\nCisUpdateStatement s = om.getUpdateStatement(\"DELETE FROM com.cisag.sys.tools.testsuite.obj.SimpleMasterData a WHERE a:code like ?\");\ns.setString(1,'001%');\nom.putUpdateStatement(s);\ntxn.commit() ;\n}<\/pre>\n<p><\/div><\/section>\n<h6 id=\"obsluga-nls\" ><span class=\"ez-toc-section\" id=\"Obsluga_NLS-7\"><\/span>Obs\u0142uga <em>NLS<\/em><span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p>Instrukcje aktualizacji nie obs\u0142uguj\u0105 atrybut\u00f3w wieloj\u0119zycznych. Je\u015bli s\u0105 one u\u017cywane w instrukcji update, g\u0142\u00f3wny j\u0119zyk bazy danych jest zawsze u\u017cywany jako j\u0119zyk tre\u015bci. Tabele <em>NLS<\/em> nie s\u0105 brane pod uwag\u0119, dlatego nie mo\u017cna wstawia\u0107 danych do tabel obiekt\u00f3w biznesowych z atrybutami wieloj\u0119zycznymi w instrukcjach <em>INSERT.<\/em> W przeciwnym razie w tabelach <em>NLS<\/em> atrybut\u00f3w brakowa\u0142oby wpis\u00f3w dla j\u0119zyk\u00f3w dodatkowych.<\/p>\n<h6 id=\"zaleznosc-od-czasu\" ><span class=\"ez-toc-section\" id=\"Zaleznosc_od_czasu-8\"><\/span>Zale\u017cno\u015b\u0107 od czasu<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p>Instrukcje aktualizacji nie obs\u0142uguj\u0105 zale\u017cno\u015bci od czasu. Je\u015bli obiekty biznesowe zale\u017cne od czasu s\u0105 u\u017cywane w instrukcjach aktualizacji, wszystkie wersje s\u0105 zawsze obs\u0142ugiwane niezale\u017cnie od u\u017cycia <em>validFrom<\/em> i <em>validUntil<\/em>, a nie tylko aktualnie wa\u017cna wersja. Je\u015bli ma by\u0107 wybrana tylko aktualnie wa\u017cna wersja, wyb\u00f3r musi by\u0107 odpowiednio ograniczony.<\/p>\n<h5 id=\"zalety-i-wady-metod-dostepu\" ><span class=\"ez-toc-section\" id=\"Zalety_i_wady_metod_dostepu\"><\/span>Zalety i wady metod dost\u0119pu<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Ta sekcja zawiera kilka wskaz\u00f3wek dotycz\u0105cych korzystania z przedstawionych metod w celu osi\u0105gni\u0119cia dobrej wydajno\u015bci.<\/p>\n<p>Metoda <em>getObjectArray()<\/em> (<em>ArrayFetch<\/em>) nigdy nie jest wolniejsza ni\u017c wykonanie metody <em>getObject()<\/em> n-razy, ale cz\u0119sto jest szybsza. Wymaga maksymalnie jednego \u017c\u0105dania bazy danych w przeciwie\u0144stwie do maksymalnie n-\u017c\u0105da\u0144 bazy danych.<\/p>\n<p>Kolejn\u0105 zalet\u0105 jest to, \u017ce mapowanie atrybut\u00f3w mi\u0119dzy atrybutami OQL, SQL i Java musi by\u0107 okre\u015blone tylko raz.<\/p>\n<p>Je\u015bli dla otwieranego obiektu biznesowego ustawiona jest strategia pami\u0119ci podr\u0119cznej, metody <em>getObject(), getObjectArray()<\/em> i <em>getObjectIterator()<\/em> zawsze najpierw odczytuj\u0105 wsp\u00f3\u0142dzielon\u0105 pami\u0119\u0107 podr\u0119czn\u0105. Wstawiaj\u0105 one r\u00f3wnie\u017c instancje otwarte przez baz\u0119 danych do pami\u0119ci podr\u0119cznej. Metody te s\u0105 przydatne w przypadku cz\u0119sto u\u017cywanych obiekt\u00f3w biznesowych (np. danych podstawowych), poniewa\u017c uwzgl\u0119dniaj\u0105 pami\u0119\u0107 podr\u0119czn\u0105 podczas dost\u0119pu.<\/p>\n<p>Z drugiej strony, s\u0105 one s\u0142abo przystosowane do masowych operacji na danych transakcyjnych (np. zapytania o dost\u0119pno\u015b\u0107 artyku\u0142\u00f3w), poniewa\u017c mog\u0105 one wyprze\u0107 inne cz\u0119sto u\u017cywane dane ze wsp\u00f3\u0142dzielonej pami\u0119ci podr\u0119cznej, nawet je\u015bli nowo przechowywane dane prawie nigdy nie b\u0119d\u0105 ponownie potrzebne. Inn\u0105 wad\u0105 jest to, \u017ce metody te generuj\u0105 wiele obiekt\u00f3w Java, kt\u00f3re s\u0105 potrzebne tylko tymczasowo, co wymaga czasu i miejsca w pami\u0119ci g\u0142\u00f3wnej.<\/p>\n<p>Dzi\u0119ki metodzie <em>getResultSet()<\/em> mo\u017cliwe jest otwarcie tylko tych atrybut\u00f3w, kt\u00f3re s\u0105 wymagane, a nie ca\u0142ej instancji obiektu biznesowego z by\u0107 mo\u017ce dziesi\u0105tkami atrybut\u00f3w. Zmniejsza to ilo\u015b\u0107 danych do przes\u0142ania, a zatem w Javie tworzonych jest mniej obiekt\u00f3w. W przypadku korzystania z funkcji <em>getResultSet(),<\/em> na deweloperze spoczywa wi\u0119ksza odpowiedzialno\u015b\u0107, poniewa\u017c otwarty zestaw wynik\u00f3w zajmuje wy\u0142\u0105cznie po\u0142\u0105czenie z baz\u0105 danych. Ponadto trzeba samodzielnie zadba\u0107 o mapowanie wynik\u00f3w zestawu wynik\u00f3w na atrybuty Java.<\/p>\n<h5 id=\"tryby-dostepu\" ><span class=\"ez-toc-section\" id=\"Tryby_dostepu\"><\/span>Tryby dost\u0119pu<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Typ dost\u0119pu do obiekt\u00f3w biznesowych jest kontrolowany przez tryb dost\u0119pu. Je\u015bli nie okre\u015blono trybu dost\u0119pu, w\u00f3wczas u\u017cywany jest standardowy tryb dost\u0119pu <em>READ.<\/em><\/p>\n<table style=\"height: 1071px; width: 100%; border-color: #000000; background-color: #ffffff; border-style: outset;\">\n<thead>\n<tr style=\"height: 23px;\">\n<td style=\"height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\" width=\"168\"><strong>Tryb dost\u0119pu<\/strong><\/td>\n<td style=\"height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\" width=\"372\"><strong>Znaczenie<\/strong><\/td>\n<\/tr>\n<\/thead>\n<tbody>\n<tr style=\"height: 70px;\">\n<td style=\"height: 70px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\" width=\"168\"><em>READ<\/em><\/td>\n<td style=\"height: 70px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\" width=\"372\">Instancja obiektu biznesowego jest odczytywana, ale nie mo\u017ce zosta\u0107 zmieniona. Je\u015bli instancja nie zosta\u0142a znaleziona, wy\u015bwietlana jest warto\u015b\u0107 <em>null.<\/em><\/td>\n<\/tr>\n<tr style=\"height: 70px;\">\n<td style=\"height: 70px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\" width=\"168\"><em>READ_UPDATE<\/em><\/td>\n<td style=\"height: 70px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\" width=\"372\">Instancja obiektu biznesowego jest odczytywana w celu modyfikacji i mo\u017ce zosta\u0107 zmieniona lub usuni\u0119ta zgodnie z wymaganiami. Je\u015bli instancja nie zosta\u0142a znaleziona, wy\u015bwietlana jest warto\u015b\u0107 <em>null.<\/em><\/td>\n<\/tr>\n<tr style=\"height: 163px;\">\n<td style=\"height: 163px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\" width=\"168\"><em>READ_WRITE<\/em><\/td>\n<td style=\"height: 163px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\" width=\"372\">Podobnie jak tryb dost\u0119pu <em>READ_UPDATE.<\/em> Ale: je\u015bli instancja, do kt\u00f3rej ma zosta\u0107 uzyskany dost\u0119p, nie istnieje, wy\u015bwietlana jest nowa instancja. Je\u015bli nowa instancja zawiera atrybut <em>UpdateInformation<\/em>, czas utworzenia i u\u017cytkownik s\u0105 wprowadzane do <em>UpdateInformation<\/em>. Je\u015bli instancja jest nowo utworzona za pomoc\u0105 klucza pomocniczego, wszystkie atrybuty klucza g\u0142\u00f3wnego typu <em>GUID<\/em> s\u0105 inicjowane nowym identyfikatorem <em>GUID.<\/em><\/td>\n<\/tr>\n<tr style=\"height: 210px;\">\n<td style=\"height: 210px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\" width=\"168\"><em>READ_REPEATABLE<\/em><\/td>\n<td style=\"height: 210px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\" width=\"372\">Tryb dost\u0119pu jawnie ustawia blokad\u0119 odczytu na instancj\u0119 obiektu biznesowego i zapewnia, \u017ce nie mo\u017ce ona zosta\u0107 zmieniona przez inne transakcje. Gwarantuje to, \u017ce instancja w pami\u0119ci podr\u0119cznej pasuje do danych w bazie danych. Oznacza to, \u017ce tryb dost\u0119pu gwarantuje dostarczanie sp\u00f3jnych danych, nawet je\u015bli kilka serwer\u00f3w aplikacji pracuje na bazie danych OLTP. Inaczej jest w przypadku zwyk\u0142ego <em>READ,<\/em> poniewa\u017c synchronizacja cache pomi\u0119dzy serwerami odbywa si\u0119 co 30 sekund, a instancja obiektu biznesowego z nieaktualnymi warto\u015bciami atrybut\u00f3w mo\u017ce znajdowa\u0107 si\u0119 w cache.<\/td>\n<\/tr>\n<tr style=\"height: 116px;\">\n<td style=\"height: 116px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\" width=\"168\"><em>READ_PARALLEL<\/em><\/td>\n<td style=\"height: 116px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\" width=\"372\">Ten tryb dost\u0119pu jest przydatny, je\u015bli u\u017cytkownik chcia\u0142by u\u017cy\u0107 fikcyjnej transakcji do odczytu z innej transakcji. Umo\u017cliwia to powi\u0105zanie wa\u017cno\u015bci iterator\u00f3w obiekt\u00f3w i zestaw\u00f3w wynik\u00f3w z fikcyjn\u0105 transakcj\u0105, a nie z bie\u017c\u0105c\u0105 transakcj\u0105. Transakcja fikcyjna musi by\u0107 otwarta w bazie danych. Opcja ta dzia\u0142a zatem tylko w bazie danych OLTP przypisanej do u\u017cytkownika.<\/td>\n<\/tr>\n<tr style=\"height: 163px;\">\n<td style=\"height: 163px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\" width=\"168\"><em>INSERT<\/em><\/td>\n<td style=\"height: 163px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\" width=\"372\">Je\u015bli ma zosta\u0107 utworzona nowa instancja obiektu biznesowego, a z logiki programu wiadomo, \u017ce instancja jeszcze nie istnieje, w\u00f3wczas us\u0142uga trwa\u0142o\u015bci nie musi sprawdza\u0107 jej istnienia w bazie danych. Ten tryb dost\u0119pu wy\u0142\u0105cza sprawdzanie istnienia i tworzy now\u0105, nietrwa\u0142\u0105 instancj\u0119 obiektu biznesowego niezale\u017cnie od zawarto\u015bci bazy danych. Je\u015bli, wbrew za\u0142o\u017ceniu, instancja nadal istnieje, wyst\u0105pi b\u0142\u0105d podczas zatwierdzania transakcji najwy\u017cszego poziomu.<\/td>\n<\/tr>\n<tr style=\"height: 163px;\">\n<td style=\"height: 163px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\" width=\"168\"><em>INSERT_DIRTY<\/em><\/td>\n<td style=\"height: 163px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\" width=\"372\">Ten tryb dost\u0119pu zachowuje si\u0119 jak <em>INSERT,<\/em> ale blokowanie jest wy\u0142\u0105czone. Oznacza to, \u017ce nie s\u0105 powiadamiani s\u0142uchacze pami\u0119ci podr\u0119cznej ani nie s\u0105 wyzwalane zdarzenia przep\u0142ywu pracy. Ten tryb nie powinien by\u0107 u\u017cywany w przypadku obiekt\u00f3w biznesowych zale\u017cnych od czasu i obiekt\u00f3w biznesowych ze strategi\u0105 pami\u0119ci podr\u0119cznej <em>Otw\u00f3rz wszystkie instancje przy pierwszym dost\u0119pie<\/em>. <em>INSERT_DIRTY<\/em> jest zatem u\u017cyteczny tylko dla danych tymczasowych.<\/td>\n<\/tr>\n<tr style=\"height: 93px;\">\n<td style=\"height: 93px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\" width=\"168\"><em>NEW_VERSION<\/em><\/td>\n<td style=\"height: 93px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\" width=\"372\">W tym trybie dost\u0119pu nowa pusta wersja instancji obiektu biznesowego jest zawsze tworzona bez uwzgl\u0119dniania pami\u0119ci podr\u0119cznej lub bazy danych. Ta opcja jest przydatna tylko w trybie tylko do wstawiania dla obiekt\u00f3w zale\u017cnych od czasu.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Wymienione tryby dost\u0119pu mo\u017cna modyfikowa\u0107 za pomoc\u0105 dodatkowych znacznik\u00f3w. Aby to zrobi\u0107, odpowiednie sta\u0142e musz\u0105 by\u0107 po\u0142\u0105czone za pomoc\u0105 operacji binarnej <em>AND.<\/em><\/p>\n<table style=\"width: 100%; border-color: #000000; background-color: #ffffff; border-style: outset; height: 534px;\">\n<thead>\n<tr style=\"height: 23px;\">\n<td style=\"width: 31.4285%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center; height: 23px;\" scope=\"rowgroup\" width=\"189\"><strong>Znacznik<\/strong><\/td>\n<td style=\"width: 67.6191%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center; height: 23px;\" scope=\"rowgroup\" width=\"351\"><strong>Znaczenie<\/strong><\/td>\n<\/tr>\n<\/thead>\n<tbody>\n<tr style=\"height: 70px;\">\n<td style=\"width: 31.4285%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center; height: 70px;\" scope=\"rowgroup\" width=\"189\"><em>DISABLE_LOCKING<\/em><\/td>\n<td style=\"width: 67.6191%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center; height: 70px;\" scope=\"rowgroup\" width=\"351\">Blokowanie jest wy\u0142\u0105czone w tym trybie dost\u0119pu. Znacznik ten zasadniczo nie powinien by\u0107 u\u017cywany, poniewa\u017c w przeciwnym razie dane mog\u0105 sta\u0107 si\u0119 niesp\u00f3jne z powodu brakuj\u0105cych blokad.<\/td>\n<\/tr>\n<tr style=\"height: 46px;\">\n<td style=\"width: 31.4285%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center; height: 46px;\" scope=\"rowgroup\" width=\"189\"><em>NO_PUT_SHARED_CACHE<\/em><\/td>\n<td style=\"width: 67.6191%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center; height: 46px;\" scope=\"rowgroup\" width=\"351\">Wyst\u0105pienie obiektu biznesowego nie jest przechowywane we wsp\u00f3\u0142dzielonej pami\u0119ci podr\u0119cznej.<\/td>\n<\/tr>\n<tr style=\"height: 116px;\">\n<td style=\"width: 31.4285%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center; height: 116px;\" scope=\"rowgroup\" width=\"189\"><em>CACHE_ONLY<\/em><\/td>\n<td style=\"width: 67.6191%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center; height: 116px;\" scope=\"rowgroup\" width=\"351\">Instancja obiektu biznesowego jest wyszukiwana tylko we wsp\u00f3\u0142dzielonej pami\u0119ci podr\u0119cznej. Je\u015bli go tam nie ma, zwracana jest warto\u015b\u0107 <em>null,<\/em> nawet je\u015bli jest on obecny w bazie danych. Ten tryb dost\u0119pu nie powinien by\u0107 u\u017cywany, poniewa\u017c wynik nie jest deterministyczny.<\/td>\n<\/tr>\n<tr style=\"height: 163px;\">\n<td style=\"width: 31.4285%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center; height: 163px;\" scope=\"rowgroup\" width=\"189\"><em>BYPASS_CACHE<\/em><\/td>\n<td style=\"width: 67.6191%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center; height: 163px;\" scope=\"rowgroup\" width=\"351\">Instancja obiektu biznesowego jest odczytywana bezpo\u015brednio z bazy danych. Zar\u00f3wno wsp\u00f3\u0142dzielona pami\u0119\u0107 podr\u0119czna, jak i lokalna pami\u0119\u0107 podr\u0119czna transakcji s\u0105 ignorowane. Je\u015bli dla obiektu biznesowego ustawiona jest strategia pami\u0119ci podr\u0119cznej, instancja jest do\u0142\u0105czana do pami\u0119ci podr\u0119cznej. Ten tryb dost\u0119pu zwi\u0119ksza wydajno\u015b\u0107 iterator\u00f3w obiekt\u00f3w, je\u015bli wi\u0119kszo\u015b\u0107 instancji do otwarcia nie znajduje si\u0119 we wsp\u00f3\u0142dzielonej pami\u0119ci podr\u0119cznej.<\/td>\n<\/tr>\n<tr style=\"height: 116px;\">\n<td style=\"width: 31.4285%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center; height: 116px;\" scope=\"rowgroup\" width=\"189\"><em>IGNORE_SHARED_CACHE<\/em><\/td>\n<td style=\"width: 67.6191%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center; height: 116px;\" scope=\"rowgroup\" width=\"351\">Tryb dost\u0119pu ma taki sam efekt jak <em>BYPASS_CACHE,<\/em> tylko instancja obiektu biznesowego nie jest przechowywana we wsp\u00f3\u0142dzielonej pami\u0119ci podr\u0119cznej po odczycie. Zapobiega to wypieraniu wa\u017cniejszych obiekt\u00f3w w pami\u0119ci podr\u0119cznej przez odczytywany obiekt.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h4 id=\"jak-dziala-dostep-do-obiektow-biznesowych\" ><span class=\"ez-toc-section\" id=\"Jak_dziala_dostep_do_obiektow_biznesowych\"><\/span>Jak dzia\u0142a dost\u0119p do obiekt\u00f3w biznesowych<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Poni\u017cej wyja\u015bniono, w jaki spos\u00f3b<em> Persistence service<\/em> dzia\u0142a podczas otwierania i zapisywania instancji obiekt\u00f3w biznesowych w transakcjach.<\/p>\n<h5 id=\"dostep-do-odczytu\" ><span class=\"ez-toc-section\" id=\"Dostep_do_odczytu\"><\/span>Dost\u0119p do odczytu<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Gdy odczytywana jest instancja obiektu biznesowego, jest ona najpierw wyszukiwana w pami\u0119ci podr\u0119cznej transakcji. W pierwszej kolejno\u015bci brane s\u0105 pod uwag\u0119 zmiany w ostatnio otwartej podtransakcji. Je\u015bli obiekt nie zostanie znaleziony w pami\u0119ci podr\u0119cznej transakcji, w\u00f3wczas jest wyszukiwany we wsp\u00f3\u0142dzielonej pami\u0119ci podr\u0119cznej. Je\u015bli obiekt nie znajduje si\u0119 r\u00f3wnie\u017c we wsp\u00f3\u0142dzielonej pami\u0119ci podr\u0119cznej, jest wyszukiwany w bazie danych.<\/p>\n<figure id=\"attachment_29568\" aria-describedby=\"caption-attachment-29568\" style=\"width: 1024px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/04\/ChatGPT-Image-30-kwi-2025-11_32_41.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-29568\" src=\"https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/04\/ChatGPT-Image-30-kwi-2025-11_32_41.png\" alt=\"\" width=\"1024\" height=\"1536\" srcset=\"https:\/\/pomoc.comarch.pl\/cee\/640\/wp-content\/uploads\/2025\/04\/ChatGPT-Image-30-kwi-2025-11_32_41.png 1024w, https:\/\/pomoc.comarch.pl\/cee\/640\/wp-content\/uploads\/2025\/04\/ChatGPT-Image-30-kwi-2025-11_32_41-200x300.png 200w, https:\/\/pomoc.comarch.pl\/cee\/640\/wp-content\/uploads\/2025\/04\/ChatGPT-Image-30-kwi-2025-11_32_41-683x1024.png 683w, https:\/\/pomoc.comarch.pl\/cee\/640\/wp-content\/uploads\/2025\/04\/ChatGPT-Image-30-kwi-2025-11_32_41-768x1152.png 768w, https:\/\/pomoc.comarch.pl\/cee\/640\/wp-content\/uploads\/2025\/04\/ChatGPT-Image-30-kwi-2025-11_32_41-33x50.png 33w, https:\/\/pomoc.comarch.pl\/cee\/640\/wp-content\/uploads\/2025\/04\/ChatGPT-Image-30-kwi-2025-11_32_41-920x1380.png 920w, https:\/\/pomoc.comarch.pl\/cee\/640\/wp-content\/uploads\/2025\/04\/ChatGPT-Image-30-kwi-2025-11_32_41-600x900.png 600w, https:\/\/pomoc.comarch.pl\/cee\/640\/wp-content\/uploads\/2025\/04\/ChatGPT-Image-30-kwi-2025-11_32_41-320x480.png 320w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption id=\"caption-attachment-29568\" class=\"wp-caption-text\"><em>Hierarchia pami\u0119ci podr\u0119cznych dla dost\u0119pu do odczytu<\/em><\/figcaption><\/figure>\n<h5 id=\"dostep-do-zapisu\" ><span class=\"ez-toc-section\" id=\"Dostep_do_zapisu\"><\/span>Dost\u0119p do zapisu<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>W przypadku dost\u0119pu do zapisu dane s\u0105 zapisywane z pami\u0119ci podr\u0119cznej transakcji do wsp\u00f3\u0142dzielonej pami\u0119ci podr\u0119cznej i do bazy danych w tym samym czasie podczas zatwierdzenia.<\/p>\n<p><a href=\"https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/04\/ChatGPT-Image-30-kwi-2025-12_01_18.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-29576 size-full\" src=\"https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/04\/ChatGPT-Image-30-kwi-2025-12_01_18.png\" alt=\"\" width=\"1536\" height=\"1024\" srcset=\"https:\/\/pomoc.comarch.pl\/cee\/640\/wp-content\/uploads\/2025\/04\/ChatGPT-Image-30-kwi-2025-12_01_18.png 1536w, https:\/\/pomoc.comarch.pl\/cee\/640\/wp-content\/uploads\/2025\/04\/ChatGPT-Image-30-kwi-2025-12_01_18-300x200.png 300w, https:\/\/pomoc.comarch.pl\/cee\/640\/wp-content\/uploads\/2025\/04\/ChatGPT-Image-30-kwi-2025-12_01_18-1024x683.png 1024w, https:\/\/pomoc.comarch.pl\/cee\/640\/wp-content\/uploads\/2025\/04\/ChatGPT-Image-30-kwi-2025-12_01_18-768x512.png 768w, https:\/\/pomoc.comarch.pl\/cee\/640\/wp-content\/uploads\/2025\/04\/ChatGPT-Image-30-kwi-2025-12_01_18-50x33.png 50w, https:\/\/pomoc.comarch.pl\/cee\/640\/wp-content\/uploads\/2025\/04\/ChatGPT-Image-30-kwi-2025-12_01_18-920x613.png 920w, https:\/\/pomoc.comarch.pl\/cee\/640\/wp-content\/uploads\/2025\/04\/ChatGPT-Image-30-kwi-2025-12_01_18-600x400.png 600w, https:\/\/pomoc.comarch.pl\/cee\/640\/wp-content\/uploads\/2025\/04\/ChatGPT-Image-30-kwi-2025-12_01_18-320x213.png 320w\" sizes=\"auto, (max-width: 1536px) 100vw, 1536px\" \/><\/a><\/p>\n<p>Procedura zatwierdzania transakcji najwy\u017cszego poziomu<\/p>\n<h3 id=\"obiekty-stanu\" ><span class=\"ez-toc-section\" id=\"Obiekty_stanu\"><\/span>Obiekty stanu<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Obiekty stanu przechowuj\u0105 atrybuty instancji obiektu biznesowego. Klasa g\u0142\u00f3wna jest opakowaniem, kt\u00f3re hermetyzuje dost\u0119p do obiekt\u00f3w stanu. Obiekty stanu tworz\u0105 \u0142a\u0144cuch zgodnie z g\u0142\u0119boko\u015bci\u0105 zagnie\u017cd\u017cenia podtransakcji. Ostatni obiekt stanu zawiera status instancji obiektu biznesowego. Wszystkie metody <em>set()<\/em> i <em>get()<\/em> klasy obiektu biznesowego wywo\u0142uj\u0105 odpowiednie metody obiektu stanu.<\/p>\n<p>Dla niezmienionej instancji obiektu biznesowego nowy obiekt stanu jest tworzony przy pierwszej zmianie atrybutu. Nowy obiekt stanu jest kopi\u0105 poprzedniego obiektu stanu ze zmienionym atrybutem.<\/p>\n<figure id=\"attachment_29590\" aria-describedby=\"caption-attachment-29590\" style=\"width: 1536px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/04\/ChatGPT-Image-30-kwi-2025-14_05_50-1.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-29590 size-full\" src=\"https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/04\/ChatGPT-Image-30-kwi-2025-14_05_50-1.png\" alt=\"\" width=\"1536\" height=\"1024\" srcset=\"https:\/\/pomoc.comarch.pl\/cee\/640\/wp-content\/uploads\/2025\/04\/ChatGPT-Image-30-kwi-2025-14_05_50-1.png 1536w, https:\/\/pomoc.comarch.pl\/cee\/640\/wp-content\/uploads\/2025\/04\/ChatGPT-Image-30-kwi-2025-14_05_50-1-300x200.png 300w, https:\/\/pomoc.comarch.pl\/cee\/640\/wp-content\/uploads\/2025\/04\/ChatGPT-Image-30-kwi-2025-14_05_50-1-1024x683.png 1024w, https:\/\/pomoc.comarch.pl\/cee\/640\/wp-content\/uploads\/2025\/04\/ChatGPT-Image-30-kwi-2025-14_05_50-1-768x512.png 768w, https:\/\/pomoc.comarch.pl\/cee\/640\/wp-content\/uploads\/2025\/04\/ChatGPT-Image-30-kwi-2025-14_05_50-1-50x33.png 50w, https:\/\/pomoc.comarch.pl\/cee\/640\/wp-content\/uploads\/2025\/04\/ChatGPT-Image-30-kwi-2025-14_05_50-1-920x613.png 920w, https:\/\/pomoc.comarch.pl\/cee\/640\/wp-content\/uploads\/2025\/04\/ChatGPT-Image-30-kwi-2025-14_05_50-1-600x400.png 600w, https:\/\/pomoc.comarch.pl\/cee\/640\/wp-content\/uploads\/2025\/04\/ChatGPT-Image-30-kwi-2025-14_05_50-1-320x213.png 320w\" sizes=\"auto, (max-width: 1536px) 100vw, 1536px\" \/><\/a><figcaption id=\"caption-attachment-29590\" class=\"wp-caption-text\"><em>Przyk\u0142ad zmian obiektu stanu<\/em><\/figcaption><\/figure>\n<p>W powy\u017cszym przyk\u0142adzie aplikacja otworzy\u0142a instancj\u0119 obiektu biznesowego w <em>Podtransakcji 2<\/em>, zmieni\u0142a atrybut A, a tym samym utworzy\u0142a nowy obiekt stanu, kt\u00f3ry zawiera nowy stan instancji obiektu biznesowego z warto\u015bci\u0105 <em>X3 A.<\/em> Instancja obiektu biznesowego nie zosta\u0142a jeszcze zarejestrowana do zapisu, a obiekt stanu nie zosta\u0142 jeszcze zapisany w pami\u0119ci podr\u0119cznej transakcji. Obiekt stanu odwo\u0142uje si\u0119 do obiektu stanu w nadrz\u0119dnej <em>Podtransakcji 1<\/em>. W tym przypadku atrybut <em>B<\/em> instancji obiektu biznesowego zosta\u0142 zmieniony, a zmieniony stan zosta\u0142 zapisany w obiekcie stanu. Instancja obiektu biznesowego zosta\u0142a zarejestrowana do zapisania w <em>Podtransakcja 1<\/em>. W rezultacie powi\u0105zany obiekt stanu jest przechowywany w pami\u0119ci podr\u0119cznej transakcji. Obiekt stanu odwo\u0142uje si\u0119 do obiektu stanu w transakcji <em>Top Level<\/em>. W tej transakcji atrybuty <em>A<\/em> i <em>B<\/em> instancji obiektu biznesowego zosta\u0142y zmienione, a zmieniony stan zosta\u0142 zapisany w obiekcie stanu. Instancja obiektu biznesowego zosta\u0142a zarejestrowana do zapisania w transakcji najwy\u017cszego poziomu. W rezultacie powi\u0105zany obiekt stanu jest przechowywany w pami\u0119ci podr\u0119cznej transakcji. Obiekt stanu odwo\u0142uje si\u0119 do obiektu stanu we wsp\u00f3\u0142dzielonej pami\u0119ci podr\u0119cznej, w kt\u00f3rej otwarte instancje obiekt\u00f3w biznesowych s\u0105 globalnie buforowane. Gdyby obiekt zosta\u0142 ponownie otwarty w <em>Podtransakcji 2<\/em>, zawiera\u0142by warto\u015bci<em> A=X1, B=Y2<\/em> i<em> C=Z<\/em>, poniewa\u017c warto\u015b\u0107 <em>B<\/em> w obiekcie stanu zosta\u0142a zmieniona w Podtransakcji <em>1<\/em>.<\/p>\n<h3 id=\"obiekty-stanu-w-transakcjach\" ><span class=\"ez-toc-section\" id=\"Obiekty_stanu_w_transakcjach\"><\/span>Obiekty stanu w transakcjach<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Ka\u017cdy obiekt biznesowy nale\u017cy do transakcji, w kt\u00f3rej zosta\u0142 odczytany lub utworzony. Mo\u017cna go u\u017cywa\u0107 tylko w tym kontek\u015bcie transakcji. Obiekty stanu s\u0105 r\u00f3wnie\u017c specyficzne dla transakcji. Odpowiedni obiekt stanu jest tworzony w ka\u017cdej transakcji, w kt\u00f3rej obiekt biznesowy jest zmieniany. Zawiera on wszystkie atrybuty zmienione w tej transakcji.<\/p>\n<h6 id=\"otwieranie-instancji-obiektu-biznesowego-getobject\" ><span class=\"ez-toc-section\" id=\"Otwieranie_instancji_obiektu_biznesowego_getObject\"><\/span>Otwieranie instancji obiektu biznesowego (<em>getObject()<\/em>)<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p>Instancja obiektu biznesowego jest otwierana z bazy danych za pomoc\u0105 funkcji <em>getObject()<\/em> i jest przechowywana we wsp\u00f3\u0142dzielonej pami\u0119ci podr\u0119cznej. Jest on nadal w tym samym stanie, co w bazie danych. W zwi\u0105zku z tym, wystarczy utworzy\u0107 pojedynczy obiekt stanu, kt\u00f3ry jest dost\u0119pny do odczytu ze wszystkich sesji.<\/p>\n<p>Ilustracja przedstawia transakcj\u0119 najwy\u017cszego poziomu, kt\u00f3ra otworzy\u0142a obiekt biznesowy za pomoc\u0105 funkcji <em>getObject()<\/em>. Poniewa\u017c nie wprowadzono \u017cadnych zmian, odwo\u0142uje si\u0119 do obiektu stanu we wsp\u00f3\u0142dzielonej pami\u0119ci podr\u0119cznej, kt\u00f3ra zawiera warto\u015bci atrybut\u00f3w.<\/p>\n<figure id=\"attachment_29591\" aria-describedby=\"caption-attachment-29591\" style=\"width: 731px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/04\/Persistence-service1.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-29591 size-full\" src=\"https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/04\/Persistence-service1.png\" alt=\"\" width=\"731\" height=\"430\" srcset=\"https:\/\/pomoc.comarch.pl\/cee\/640\/wp-content\/uploads\/2025\/04\/Persistence-service1.png 731w, https:\/\/pomoc.comarch.pl\/cee\/640\/wp-content\/uploads\/2025\/04\/Persistence-service1-300x176.png 300w, https:\/\/pomoc.comarch.pl\/cee\/640\/wp-content\/uploads\/2025\/04\/Persistence-service1-50x29.png 50w, https:\/\/pomoc.comarch.pl\/cee\/640\/wp-content\/uploads\/2025\/04\/Persistence-service1-600x353.png 600w, https:\/\/pomoc.comarch.pl\/cee\/640\/wp-content\/uploads\/2025\/04\/Persistence-service1-320x188.png 320w\" sizes=\"auto, (max-width: 731px) 100vw, 731px\" \/><\/a><figcaption id=\"caption-attachment-29591\" class=\"wp-caption-text\">Stan po za\u0142adowaniu instancji obiektu biznesowego<\/figcaption><\/figure>\n<h6 id=\"ustawianie-wartosci-atrybutow-set-i-get\" ><span class=\"ez-toc-section\" id=\"Ustawianie_wartosci_atrybutow_set_%E2%80%A6_i_get_%E2%80%A6\"><\/span>Ustawianie warto\u015bci atrybut\u00f3w (<em>set &#8230;()<\/em> i <em>get &#8230;()<\/em>)<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p>Odwo\u0142ywanie si\u0119 do obiektu stanu we wsp\u00f3\u0142dzielonej pami\u0119ci podr\u0119cznej nie jest ju\u017c mo\u017cliwe, je\u015bli atrybut instancji obiektu biznesowego zostanie zmieniony w ramach transakcji (<em>set&#8230;()<\/em>). Nast\u0119pnie tworzony jest nowy obiekt stanu dla instancji obiektu biznesowego, kt\u00f3rego atrybut zosta\u0142 zmieniony, w kt\u00f3rym zapisywane s\u0105 zmienione warto\u015bci atrybut\u00f3w.<\/p>\n<figure id=\"attachment_29592\" aria-describedby=\"caption-attachment-29592\" style=\"width: 731px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/04\/Persistence-service2.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-29592 size-full\" src=\"https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/04\/Persistence-service2.png\" alt=\"\" width=\"731\" height=\"430\" srcset=\"https:\/\/pomoc.comarch.pl\/cee\/640\/wp-content\/uploads\/2025\/04\/Persistence-service2.png 731w, https:\/\/pomoc.comarch.pl\/cee\/640\/wp-content\/uploads\/2025\/04\/Persistence-service2-300x176.png 300w, https:\/\/pomoc.comarch.pl\/cee\/640\/wp-content\/uploads\/2025\/04\/Persistence-service2-50x29.png 50w, https:\/\/pomoc.comarch.pl\/cee\/640\/wp-content\/uploads\/2025\/04\/Persistence-service2-600x353.png 600w, https:\/\/pomoc.comarch.pl\/cee\/640\/wp-content\/uploads\/2025\/04\/Persistence-service2-320x188.png 320w\" sizes=\"auto, (max-width: 731px) 100vw, 731px\" \/><\/a><figcaption id=\"caption-attachment-29592\" class=\"wp-caption-text\"><em>Status po zmianie atrybutu<\/em><\/figcaption><\/figure>\n<p>W transakcji najwy\u017cszego poziomu instancja obiektu biznesowego zosta\u0142a otwarta do modyfikacji, a atrybut <em>A<\/em> zosta\u0142 zmieniony na warto\u015b\u0107 <em>X3<\/em> przy u\u017cyciu odpowiedniej metody <em>set&#8230;().<\/em> Tworzony jest nowy obiekt stanu, kt\u00f3ry zawiera stan instancji obiektu biznesowego ze zmienion\u0105 warto\u015bci\u0105 atrybutu. Poprzedni obiekt stanu jest przywo\u0142ywany w obiekcie stanu.<\/p>\n<h6 id=\"zarejestruj-sie-do-zapisu-putobject\" ><span class=\"ez-toc-section\" id=\"Zarejestruj_sie_do_zapisu_putObject\"><\/span>Zarejestruj si\u0119 do zapisu (<em>putObject()<\/em>)<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p>Aby dokona\u0107 zmiany w instancji obiektu biznesowego znanej w ramach transakcji, nale\u017cy j\u0105 zarejestrowa\u0107 w celu zapisania za pomoc\u0105 funkcji<em> putObject()<\/em>. Spowoduje to dodanie obiektu stanu do pami\u0119ci podr\u0119cznej transakcji najwy\u017cszego poziomu.<\/p>\n<p>Transakcja najwy\u017cszego poziomu otworzy\u0142a instancj\u0119 obiektu biznesowego do modyfikacji i zmieni\u0142a atrybut <em>A<\/em> na warto\u015b\u0107 <em>X1<\/em>, a atrybut B na warto\u015b\u0107 <em>Y1<\/em>. Utworzony obiekt stanu jest rejestrowany w celu zapisania przy u\u017cyciu funkcji <em>putObject().<\/em> Powoduje to wstawienie go do pami\u0119ci podr\u0119cznej transakcji. Zmiany s\u0105 nast\u0119pnie widoczne w ca\u0142ej transakcji<\/p>\n<figure id=\"attachment_29593\" aria-describedby=\"caption-attachment-29593\" style=\"width: 731px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/04\/Persistence-service3.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-29593 size-full\" src=\"https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/04\/Persistence-service3.png\" alt=\"\" width=\"731\" height=\"430\" srcset=\"https:\/\/pomoc.comarch.pl\/cee\/640\/wp-content\/uploads\/2025\/04\/Persistence-service3.png 731w, https:\/\/pomoc.comarch.pl\/cee\/640\/wp-content\/uploads\/2025\/04\/Persistence-service3-300x176.png 300w, https:\/\/pomoc.comarch.pl\/cee\/640\/wp-content\/uploads\/2025\/04\/Persistence-service3-50x29.png 50w, https:\/\/pomoc.comarch.pl\/cee\/640\/wp-content\/uploads\/2025\/04\/Persistence-service3-600x353.png 600w, https:\/\/pomoc.comarch.pl\/cee\/640\/wp-content\/uploads\/2025\/04\/Persistence-service3-320x188.png 320w\" sizes=\"auto, (max-width: 731px) 100vw, 731px\" \/><\/a><figcaption id=\"caption-attachment-29593\" class=\"wp-caption-text\"><em>Stan po putObject()<\/em><\/figcaption><\/figure>\n<p>Kolejna podtransakcja r\u00f3wnie\u017c otwiera ten sam obiekt biznesowy. Poniewa\u017c obiekt stanu istnieje dla obiektu biznesowego w pami\u0119ci podr\u0119cznej transakcji, otwarty obiekt biznesowy odnosi si\u0119 do obiektu stanu w pami\u0119ci podr\u0119cznej transakcji, a zatem r\u00f3wnie\u017c do nowej zawarto\u015bci atrybut\u00f3w. Zmieniaj\u0105c atrybut <em>C<\/em> na<em> Z1<\/em>, tworzony jest nowy obiekt stanu, kt\u00f3ry jest wstawiany do obszaru pami\u0119ci podr\u0119cznej transakcji za pomoc\u0105 funkcji <em>putObject(),<\/em> kt\u00f3ra rejestruje zmiany w podtransakcji. Gdy podtransakcja zostanie zatwierdzona, zarejestrowane zmiany s\u0105 przenoszone do pami\u0119ci podr\u0119cznej transakcji wy\u017cszego poziomu, w tym przypadku transakcji najwy\u017cszego poziomu. Po wycofaniu s\u0105 one odrzucane.<\/p>\n<figure id=\"attachment_29594\" aria-describedby=\"caption-attachment-29594\" style=\"width: 759px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/04\/Persistence-service4.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-29594 size-full\" src=\"https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/04\/Persistence-service4.png\" alt=\"\" width=\"759\" height=\"430\" srcset=\"https:\/\/pomoc.comarch.pl\/cee\/640\/wp-content\/uploads\/2025\/04\/Persistence-service4.png 759w, https:\/\/pomoc.comarch.pl\/cee\/640\/wp-content\/uploads\/2025\/04\/Persistence-service4-300x170.png 300w, https:\/\/pomoc.comarch.pl\/cee\/640\/wp-content\/uploads\/2025\/04\/Persistence-service4-50x28.png 50w, https:\/\/pomoc.comarch.pl\/cee\/640\/wp-content\/uploads\/2025\/04\/Persistence-service4-600x340.png 600w, https:\/\/pomoc.comarch.pl\/cee\/640\/wp-content\/uploads\/2025\/04\/Persistence-service4-320x181.png 320w\" sizes=\"auto, (max-width: 759px) 100vw, 759px\" \/><\/a><figcaption id=\"caption-attachment-29594\" class=\"wp-caption-text\">Stan po dalszym przetwarzaniu putObject() instancji obiektu biznesowego<\/figcaption><\/figure>\n<p style=\"text-align: center;\">Stan po kolejnym &#8222;putObject()&#8221; tej samej instancji obiektu biznesowego<\/p>\n<p>Gdy transakcja najwy\u017cszego poziomu zostanie zatwierdzona, zarejestrowane zmiany s\u0105 utrwalane w pami\u0119ci podr\u0119cznej transakcji, a wsp\u00f3\u0142dzielona pami\u0119\u0107 podr\u0119czna jest aktualizowana.<\/p>\n<h5 id=\"zaleznosc-od-czasu\" ><span class=\"ez-toc-section\" id=\"Zaleznosc_od_czasu-9\"><\/span>Zale\u017cno\u015b\u0107 od czasu<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Wszystkie operacje odczytu <em>Managera obiekt\u00f3w<\/em> dzia\u0142aj\u0105 na aktualnie wa\u017cnej wersji instancji obiektu biznesowego.<em> Persistence service<\/em> zak\u0142ada, \u017ce interwa\u0142y wa\u017cno\u015bci wszystkich zapisanych wersji dla instancji obiektu biznesowego z tym samym kluczem podstawowym s\u0105 p\u0142ynne i nie nak\u0142adaj\u0105 si\u0119 na siebie.<\/p>\n<p><em>Persistence service<\/em> rozpoznaje tryby tylko wstawiania i aktualizacji do przetwarzania obiekt\u00f3w biznesowych zale\u017cnych od czasu. Je\u015bli te dwa tryby s\u0105 zawsze u\u017cywane, us\u0142uga trwa\u0142o\u015bci gwarantuje, \u017ce wygenerowane wersje instancji obiektu biznesowego s\u0105 p\u0142ynne i wolne od nak\u0142adania si\u0119. Instancje obiekt\u00f3w biznesowych zale\u017cnych od czasu mo\u017cna zapisywa\u0107 lub usuwa\u0107 w taki sam spos\u00f3b, jak wszystkie inne obiekty biznesowe przy u\u017cyciu metod <em>putObject()<\/em> i <em>deleteObject().<\/em> Przypisanie atrybut\u00f3w <em>validFrom<\/em> i <em>validUntil<\/em> kontroluje, w kt\u00f3rym z tych tryb\u00f3w obs\u0142ugiwana jest zale\u017cno\u015b\u0107 od czasu.<\/p>\n<h6 id=\"tryb-insert-only\" ><span class=\"ez-toc-section\" id=\"Tryb_Insert-Only\"><\/span>Tryb <em>Insert-Only<\/em><span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p>Ten tryb s\u0142u\u017cy do tworzenia nowej wersji instancji obiektu biznesowego. W tym celu nale\u017cy utworzy\u0107 now\u0105 wersj\u0119 za po\u015brednictwem us\u0142ugi trwa\u0142o\u015bci przy u\u017cyciu trybu dost\u0119pu <em>NEW_VERSION.<\/em> Atrybuty <em>validFrom<\/em> i <em>validUntil<\/em>\u00a0musz\u0105 by\u0107 ustawione na <em>null<\/em> przed zapisaniem wersji za pomoc\u0105 funkcji <em>putObject(),<\/em> poniewa\u017c atrybuty te s\u0105 obliczane przez same <em>Persistence service<\/em>. Wygenerowana wersja jest wa\u017cna od bie\u017c\u0105cego czasu (<em>validFrom<\/em>) do maksymalnej daty. Data <em>validUntil<\/em> poprzedniej wersji jest ustawiana na dat\u0119 <em>validFrom<\/em>\u00a0nowej wersji.<\/p>\n<p><a href=\"https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/04\/Zrzut-ekranu-2025-04-30-144329.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-29595 size-full\" src=\"https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/04\/Zrzut-ekranu-2025-04-30-144329.png\" alt=\"\" width=\"849\" height=\"427\" srcset=\"https:\/\/pomoc.comarch.pl\/cee\/640\/wp-content\/uploads\/2025\/04\/Zrzut-ekranu-2025-04-30-144329.png 849w, https:\/\/pomoc.comarch.pl\/cee\/640\/wp-content\/uploads\/2025\/04\/Zrzut-ekranu-2025-04-30-144329-300x151.png 300w, https:\/\/pomoc.comarch.pl\/cee\/640\/wp-content\/uploads\/2025\/04\/Zrzut-ekranu-2025-04-30-144329-768x386.png 768w, https:\/\/pomoc.comarch.pl\/cee\/640\/wp-content\/uploads\/2025\/04\/Zrzut-ekranu-2025-04-30-144329-50x25.png 50w, https:\/\/pomoc.comarch.pl\/cee\/640\/wp-content\/uploads\/2025\/04\/Zrzut-ekranu-2025-04-30-144329-600x302.png 600w, https:\/\/pomoc.comarch.pl\/cee\/640\/wp-content\/uploads\/2025\/04\/Zrzut-ekranu-2025-04-30-144329-320x161.png 320w\" sizes=\"auto, (max-width: 849px) 100vw, 849px\" \/><\/a><\/p>\n<p style=\"text-align: center;\"><em>Przyk\u0142ad do\u0142\u0105czenia nowej wersji<\/em><\/p>\n<h6 id=\"tryb-update\" ><span class=\"ez-toc-section\" id=\"Tryb_Update\"><\/span>Tryb <em>Update<\/em><span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p>Tryb <em>Update<\/em> s\u0142u\u017cy do wstawiania nowej wersji mi\u0119dzy istniej\u0105cymi wersjami instancji obiektu biznesowego. Okre\u015blany jest pocz\u0105tek okresu wa\u017cno\u015bci (<em>validFrom<\/em>) wersji, kt\u00f3ra ma zosta\u0107 wstawiona; w tym przypadku j\u0105dro automatycznie ogranicza maksymalny czas wa\u017cno\u015bci (<em>validUntil<\/em>) wersji wa\u017cnej w tym czasie.<\/p>\n<p>Podczas korzystania z trybu aktualizacji instancja powinna zosta\u0107 otwarta z trybem dost\u0119pu <em>READ_WRITE<\/em> i kluczem zale\u017cnym od czasu do utworzenia, aby uwzgl\u0119dni\u0107 ka\u017cd\u0105 istniej\u0105c\u0105 wersj\u0119 instancji obiektu biznesowego. W trybie <em>Update<\/em> atrybut <em>validUntil<\/em>\u00a0musi by\u0107 ustawiony na <em>null,<\/em> poniewa\u017c jest ustawiany przez us\u0142ug\u0119 trwa\u0142o\u015bci.<\/p>\n<p><a href=\"https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/04\/Zrzut-ekranu-2025-04-30-145021.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-29598 size-full\" src=\"https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/04\/Zrzut-ekranu-2025-04-30-145021.png\" alt=\"\" width=\"823\" height=\"379\" srcset=\"https:\/\/pomoc.comarch.pl\/cee\/640\/wp-content\/uploads\/2025\/04\/Zrzut-ekranu-2025-04-30-145021.png 823w, https:\/\/pomoc.comarch.pl\/cee\/640\/wp-content\/uploads\/2025\/04\/Zrzut-ekranu-2025-04-30-145021-300x138.png 300w, https:\/\/pomoc.comarch.pl\/cee\/640\/wp-content\/uploads\/2025\/04\/Zrzut-ekranu-2025-04-30-145021-768x354.png 768w, https:\/\/pomoc.comarch.pl\/cee\/640\/wp-content\/uploads\/2025\/04\/Zrzut-ekranu-2025-04-30-145021-50x23.png 50w, https:\/\/pomoc.comarch.pl\/cee\/640\/wp-content\/uploads\/2025\/04\/Zrzut-ekranu-2025-04-30-145021-600x276.png 600w, https:\/\/pomoc.comarch.pl\/cee\/640\/wp-content\/uploads\/2025\/04\/Zrzut-ekranu-2025-04-30-145021-320x147.png 320w\" sizes=\"auto, (max-width: 823px) 100vw, 823px\" \/><\/a><\/p>\n<p style=\"text-align: center;\"><em>Przyk\u0142ad wstawiania nowej wersji<\/em><\/p>\n<h4 id=\"przetwarzanie-przez-aplikacje\" ><span class=\"ez-toc-section\" id=\"Przetwarzanie_przez_aplikacje\"><\/span>Przetwarzanie przez aplikacj\u0119<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Je\u015bli <em>validFrom<\/em>\u00a0i <em>validUntil<\/em>\u00a0s\u0105 ustawione dla obiektu biznesowego, tj. nie s\u0105 <em>null,<\/em> w\u00f3wczas <em>Persistence service<\/em> nie wykonuje \u017cadnych dalszych operacji w celu utrzymania sp\u00f3jno\u015bci interwa\u0142\u00f3w wa\u017cno\u015bci. W takim przypadku zapisywane s\u0105 dok\u0142adnie okre\u015blone warto\u015bci atrybut\u00f3w. <em>Persistence service<\/em> nie wykonuje \u017cadnych dalszych dzia\u0142a\u0144 w celu zapewnienia, \u017ce nie ma nak\u0142adania si\u0119 lub luk w pe\u0142nych przystankach wa\u017cno\u015bci.<\/p>\n<h5 id=\"schematy-numeracji\" ><span class=\"ez-toc-section\" id=\"Schematy_numeracji\"><\/span>Schematy numeracji<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Us\u0142uga trwa\u0142o\u015bci obs\u0142uguje automatyczne przypisywanie numer\u00f3w dla zakres\u00f3w numer\u00f3w. Jest to bardzo przydatne, je\u015bli ma zosta\u0107 osi\u0105gni\u0119te pe\u0142ne przypisanie numeru. Numery s\u0105 generowane tylko podczas tworzenia obiekt\u00f3w. \u017badne nowe numery nie s\u0105 przypisywane podczas aktualizacji.<\/p>\n<h5 id=\"rysowanie-liczb-bez-przerw\" ><span class=\"ez-toc-section\" id=\"Rysowanie_liczb_bez_przerw\"><\/span>Rysowanie liczb bez przerw<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Przypisywanie numer\u00f3w bez luk wykorzystuje funkcjonalno\u015b\u0107 <em>Persistence service<\/em>, aby zapobiec wyst\u0119powaniu luk. Numery nie s\u0105 przypisywane, dop\u00f3ki powi\u0105zana transakcja najwy\u017cszego poziomu nie zostanie pomy\u015blnie zako\u0144czona za pomoc\u0105 funkcji <em>commit().<\/em> Oznacza to, \u017ce przypisany numer nie jest wcze\u015bniej znany i nie mo\u017ce by\u0107 jeszcze wy\u015bwietlany, np. podczas wprowadzania danych dla obiektu biznesowego. Aby <em>Persistence service<\/em> rozpozna\u0142o, \u017ce podczas tworzenia instancji obiektu biznesowego konieczna jest specjalna obs\u0142uga, definicja obiektu biznesowego musi spe\u0142nia\u0107 nast\u0119puj\u0105ce warunki:<\/p>\n<ul>\n<li>Logiczny typ danych dla atrybutu zakresu liczbowego musi pochodzi\u0107 od logicznego typu danych <em>com.cisag.pgm.base.numberrange.GaplessNumberRange<\/em><\/li>\n<li>Logiczny typ danych dla atrybutu schematu numeracji musi pochodzi\u0107 od logicznego typu danych <em>com.cisag.pgm.base.numberrange.GaplessNumber10<\/em> lub <em>com.cisag.pgm.base.numberrange.GaplessNumber50<\/em><\/li>\n<li>Te dwa atrybuty razem tworz\u0105 indeks obiektu biznesowego<\/li>\n<\/ul>\n<p>Podczas tworzenia instancji obiektu biznesowego deweloper musi ustawi\u0107 warto\u015b\u0107 tablicy bajt\u00f3w w atrybucie schematu numeracji, kt\u00f3ry jest okre\u015blany przez wywo\u0142anie metody<em> getAutoNumberRangeValue()<\/em> w managerze schematu numeracji. Identyfikator <em>GUID<\/em> zakresu liczb, kt\u00f3ry ma zosta\u0107 u\u017cyty, oraz informacje kontekstowe s\u0105 przekazywane do tej metody jako parametry. Aby wymusi\u0107 automatyczne rysowanie liczby, atrybut <em>number<\/em> jest albo ustawiony na <em>null,<\/em> albo ma przypisany identyfikator schematu. Je\u015bli atrybut <em>number<\/em> jest pusty, w\u00f3wczas zawsze rysowana jest nowa liczba. Czasami konieczne jest przypisanie kilku instancjom obiektu biznesowego tego samego numeru dla tego samego zakresu liczb. W atrybucie number mo\u017cna zatem ustawi\u0107 dowolny ci\u0105g znak\u00f3w, kt\u00f3ry b\u0119dzie s\u0142u\u017cy\u0142 jako identyfikator. <em>Persistence service<\/em> u\u017cywa tego samego wylosowanego numeru dla schematu numeracji dla instancji obiekt\u00f3w biznesowych, w kt\u00f3rych wprowadzono ten sam identyfikator. Identyfikator jest zawsze wa\u017cny dla ka\u017cdej transakcji najwy\u017cszego poziomu. Po wstawieniu instancji do pami\u0119ci podr\u0119cznej transakcji za pomoc\u0105 funkcji <em>putObject()<\/em> transakcja jest ko\u0144czona za pomoc\u0105 funkcji <em>commit().<\/em> Podczas tworzenia instancji obiektu biznesowego, <em>Persistence service<\/em> wyszukuje zdefiniowany indeks sk\u0142adaj\u0105cy si\u0119 z dw\u00f3ch atrybut\u00f3w z wy\u017cej wymienionymi typami danych. Po znalezieniu indeksu automatycznie przypisuje numer do przeniesionego zakresu numer\u00f3w w atrybucie zakresu numer\u00f3w i zapisuje go w atrybucie numeru instancji oraz w centralnej tabeli <em>NumbersRangeUse.<\/em> Je\u015bli numer zosta\u0142 ju\u017c przypisany do identyfikatora numeru, numer ten jest u\u017cywany. Dzieje si\u0119 to w ramach transakcji. Gwarantuje to, \u017ce numery s\u0105 przypisywane bez luk. Je\u015bli kilka instancji obiekt\u00f3w biznesowych jest zapisywanych w ramach transakcji, mo\u017cna u\u017cy\u0107 specjalnego znacznika <em>ORDERED_COMMIT,<\/em> aby okre\u015bli\u0107, \u017ce kolejno\u015b\u0107 przypisywania numer\u00f3w musi odpowiada\u0107 kolejno\u015bci <em>putObject().<\/em><\/p>\n<p>W przypadku ustawienia <em>ZERO_GUID<\/em> zamiast <em>GUID <\/em>schematu numeracji, warto\u015b\u0107 ustawiona w atrybucie <em>number<\/em> jest zapisywana jako liczba.<\/p>\n<p>Je\u015bli liczby w zakresie numer\u00f3w zostan\u0105 wyczerpane, generowany jest wyj\u0105tek <em>CisApplicationServerException<\/em> typu <em>NUMBER_RANGE_OVERFLOW.<\/em> Wyj\u0105tek ten generuje odpowiedni komunikat, je\u015bli zostanie zapisany w dzienniku komunikat\u00f3w.<\/p>\n<p>W poni\u017cszym przyk\u0142adzie dwie instancje obiekt\u00f3w biznesowych s\u0105 tworzone w transakcji i ka\u017cda z nich jest automatycznie przypisywana do numeru przez us\u0142ug\u0119 trwa\u0142o\u015bci. Kolejno\u015b\u0107, w jakiej numery s\u0105 przypisywane, jest okre\u015blana przez kolejno\u015b\u0107 <em>putObject().<\/em><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">tm.beginNew(CisTransactionManager.ORDERED_COMMIT);\n\ntry {\n\n...\n\nCisNumberRangeManager nrm= CisEnvironment.getInstance().getNumberRangeManager();\n\nobj=(InventoryTransaction) om.getObject(key, CisObjectManager.READ_WRITE);\n\nbyte[] autoNumberRangeValue= nrm.getAutoNumberRangeValue(numberRangeGuid, context);\n\nobj.setNumberRange(autoNumberRangeValue); \/\/ Ustawienie zakresu liczb i informacji kontekstowych\n\nobj.setNumber(null); \/\/ wymusza now\u0105 liczb\u0119\n\nobj2=(InventoryTransaction) om.getObject(key, CisObjectManager.READ_WRITE);\n\nautoNumberRangeValue= nrm.getAutoNumberRangeValue(numberRangeGuid, context);\n\nobj2.setNumberRange(autoNumberRangeValue); \/\/ Ustawienie zakresu liczb i informacji kontekstowych\n\nobj2.setNumber(\"Number-ID\"); \/\/ wymusza nowy numer lub u\u017cycie numeru wcze\u015bniej narysowanego pod okre\u015blonym Number-ID\n\n...\n\nom.putObject(obj2);\n\nom.putObject(obj);\n\n...\n\ntm.commit() ;\n\n} catch (RuntimeException ex) {\n\ntm.rollback() ;\n\nrzuca\u0107 np;\n\n}<\/pre>\n<h4 id=\"wyszukiwanie-oql-getoqlsearchstatement\" ><span class=\"ez-toc-section\" id=\"Wyszukiwanie_OQL_getOqlSearchStatement\"><\/span>Wyszukiwanie OQL (<em>getOqlSearchStatement()<\/em>)<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Wyszukiwania OQL s\u0105 rejestrowane jako obiekty deweloperskie w aplikacji <em>Obiekty deweloperskie<\/em>. Wyszukiwanie OQL sk\u0142ada si\u0119 z kolekcji fragment\u00f3w, warunk\u00f3w i parametr\u00f3w. <em>CisOqlSearchStatement<\/em> opiera si\u0119 na wyszukiwaniu OQL. Instrukcja <em>CisOqlSearchStatement<\/em> jest tworzona w <em>Managerze obiekt\u00f3w<\/em> przy u\u017cyciu metody:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">CisOqlSearchStatement getOqlSearchStatement(String searchName);\nCisOqlSearchStatement getOqlSearchStatement(String searchName,\n String language); \n<\/pre>\n<p>Instrukcja <em>CisOqlSearchStatement<\/em> zawiera metody ustawiania warto\u015bci parametr\u00f3w. Rozr\u00f3\u017cnia si\u0119 parametry, kt\u00f3re s\u0105 ju\u017c zawarte w definicji wyszukiwania i parametry wolne.<\/p>\n<h5 id=\"wykonywanie-wyszukiwania\" ><span class=\"ez-toc-section\" id=\"Wykonywanie_wyszukiwania\"><\/span>Wykonywanie wyszukiwania<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Instrukcja <em>CisOqlSearchStatement<\/em> ma dwie metody wykonywania wyszukiwania. W obu przypadkach wynik wyszukiwania mo\u017cna okre\u015bli\u0107 na podstawie <em>CisResultSet.<\/em> Metody r\u00f3\u017cni\u0105 si\u0119 tym, \u017ce do jednej z nich mo\u017cna przekaza\u0107 dodatkowy ci\u0105g znak\u00f3w, kt\u00f3ry wp\u0142ywa na struktur\u0119 klauzuli <em>WHERE<\/em> wyszukiwania (patrz rozdzia\u0142<a href=\"#PS5\"> <em>Dowolne parametry<\/em><\/a>).<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">public CisResultSet execute() ;\npublic CisResultSet execute(String pattern);<\/pre>\n<h5 id=\"limit-czasu-wyszukiwania\" ><span class=\"ez-toc-section\" id=\"Limit_czasu_wyszukiwania\"><\/span>Limit czasu wyszukiwania<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Podczas wykonywania wyszukiwania OQL limit czasu wyszukiwania nie jest domy\u015blnie aktywowany. Jednak limit czasu wyszukiwania mo\u017cna p\u00f3\u017aniej aktywowa\u0107 za pomoc\u0105 opcji<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">public void setUseSearchTimeout(boolean useSearchTimeout);<\/pre>\n<p>mo\u017cna aktywowa\u0107. Je\u015bli limit czasu wyszukiwania jest aktywny, wykonanie zapytania do bazy danych wywo\u0142anego przez wyszukiwanie OQL jest anulowane po up\u0142ywie limitu czasu wyszukiwania ustawionego dla bazy danych w panelu systemu, je\u015bli zapytanie do bazy danych nie wy\u015bwietli\u0142o wyniku w ci\u0105gu limitu czasu wyszukiwania. Gdy zapytanie do bazy danych jest anulowane, generowany jest wyj\u0105tek <em>CisApplicationServerException<\/em> typu <em>SEARCH_TIMEOUT.<\/em> Mo\u017ce on zosta\u0107 zarejestrowany i specjalnie obs\u0142u\u017cony przez aplikacj\u0119.<\/p>\n<h5 id=\"ustawianie-parametrow\" ><span class=\"ez-toc-section\" id=\"Ustawianie_parametrow\"><\/span>Ustawianie parametr\u00f3w<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Wszystkie parametry wyszukiwania s\u0105 zdefiniowane w definicji wyszukiwania. Ka\u017cdy parametr ma unikaln\u0105 nazw\u0119 w wyszukiwaniu. Poszczeg\u00f3lne parametry s\u0105 u\u017cywane jako kryterium ograniczaj\u0105ce w wyszukiwaniu i \u0142\u0105czone za pomoc\u0105 <em>AND.<\/em><\/p>\n<p>Ka\u017cdemu parametrowi wyszukiwania mo\u017cna przypisa\u0107 wi\u0119cej ni\u017c jedn\u0105 warto\u015b\u0107. Poszczeg\u00f3lne warto\u015bci parametru s\u0105 po\u0142\u0105czone za pomoc\u0105 <em>OR.<\/em> Parametr, kt\u00f3remu nie przypisano warto\u015bci, nie jest uwzgl\u0119dniany w wyszukiwaniu jako kryterium ograniczaj\u0105ce.<\/p>\n<section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\"><\/p>\n<p>Wyszukiwanie ma parametry <em>a, b, c, d<\/em>. Parametrowi <em>a<\/em> nale\u017cy przypisa\u0107 warto\u015bci <em>1, 2, 4<\/em>, a parametrowi <em>b<\/em> warto\u015bci <em>10, 20.<\/em> Parametrom<em> c<\/em> i <em>d<\/em> nie przypisuje si\u0119 \u017cadnych warto\u015bci. Przypisanie parametr\u00f3w<\/p>\n<p>prowadzi do nast\u0119puj\u0105cego wyra\u017cenia: (a = 1 <em>OR<\/em> a = 2 <em>OR<\/em> a = 4) <em>AND<\/em> (b = 10 <em>OR<\/em> b = 20)<\/div><\/section>\n<p>Instrukcja <em>CisOqlSearchStatement<\/em> udost\u0119pnia metody dla r\u00f3\u017cnych typ\u00f3w danych w celu ustawienia indywidualnych warto\u015bci dla parametru wyszukiwania.<\/p>\n<section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\"><\/p>\n<p>Podpisy metod wybrane jako przyk\u0142ady mog\u0105 by\u0107 u\u017cywane do ustawiania indywidualnych warto\u015bci <em>long<\/em> i <em>int<\/em> dla parametru:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">public void setLongSelection(String name, long value);\npublic void setIntSelection(String name, int value);<\/pre>\n<p><\/div><\/section>\n<p>Je\u015bli dla parametru ma zosta\u0107 ustawionych kilka warto\u015bci lub zakres\u00f3w, nale\u017cy utworzy\u0107 ci\u0105g zapytania przy u\u017cyciu klasy <em>com.cisag.pgm.objsearch.SelectionSupport<\/em> i przekaza\u0107 go do metody <em>setSelection(&#8230;).<\/em><\/p>\n<h5 id=\"dowolne-parametry\" ><span class=\"ez-toc-section\" id=\"Dowolne_parametry\"><\/span>Dowolne parametry<a id=\"PS5\"><\/a><span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Opr\u00f3cz parametr\u00f3w okre\u015blonych w definicji wyszukiwania, mo\u017cna zdefiniowa\u0107 dalsze wolne parametry i przypisa\u0107 je do <em>CisOqlSearchStatement.<\/em><\/p>\n<p>W przeciwie\u0144stwie do parametr\u00f3w sta\u0142ych, dla parametr\u00f3w wolnych nie s\u0105 u\u017cywane ci\u0105gi zapyta\u0144. W zwi\u0105zku z tym metody ustawiania wolnych parametr\u00f3w nie ko\u0144cz\u0105 si\u0119 na <em>Selection.<\/em><\/p>\n<section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\"><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">public void setLong(String name, long value);\npublic void setInt(String name, int value);<\/pre>\n<p><\/div><\/section>\n<p>Dowolne parametry s\u0105 zdefiniowane w \u0142a\u0144cuchu znak\u00f3w, kt\u00f3ry jest do\u0142\u0105czany do klauzuli <em>WHERE<\/em> instrukcji <em>CisOqlSearchStatement<\/em> podczas wykonywania wyszukiwania. Ci\u0105g znak\u00f3w zawiera symbole zast\u0119pcze dla u\u017cywanych parametr\u00f3w. Nazwy symboli zast\u0119pczych odpowiadaj\u0105 nazwom parametr\u00f3w.<\/p>\n<h5 id=\"korzystanie-z-dodatkowego-wzorca-wyszukiwania\" ><span class=\"ez-toc-section\" id=\"Korzystanie_z_dodatkowego_wzorca_wyszukiwania\"><\/span>Korzystanie z dodatkowego wzorca wyszukiwania<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Instrukcja <em>CisOqlSearchStatement<\/em> oferuje dwie metody wykonywania wyszukiwania. Jednej z metod mo\u017cna przekaza\u0107 ci\u0105g znak\u00f3w, kt\u00f3ry wp\u0142ywa na klauzul\u0119 <em>WHERE<\/em> wyszukiwania OQL.<\/p>\n<p>Ci\u0105g zawiera wyra\u017cenie OQL, kt\u00f3re mo\u017ce by\u0107 r\u00f3wnie\u017c u\u017cywane w klauzuli <em>WHERE.<\/em> Parametry wyszukiwania, normalne i dowolne, mog\u0105 by\u0107 osadzone w wyra\u017ceniu. Aby to zrobi\u0107, nale\u017cy umie\u015bci\u0107 nazw\u0119 parametru w nawiasach klamrowych jako symbol zast\u0119pczy w \u017c\u0105danych pozycjach.<\/p>\n<p>Dowolne parametry s\u0105 zawsze u\u017cywane jako warto\u015b\u0107, a normalne parametry jako wyra\u017cenie logiczne.<\/p>\n<section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\"><\/p>\n<p>Dowolny parametr <em>number<\/em> powinien mie\u0107 przypisan\u0105 warto\u015b\u0107 <em>0815<\/em> dla atrybutu <em>ac:name.<\/em><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">stm.setString(\"numer\", \"0815\");\nstm.execute(\"ac:name={number});<\/pre>\n<p><\/div><\/section>\n<section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\"><\/p>\n<p>Normalne parametry <em>code<\/em> i <em>name<\/em> nie powinny by\u0107 \u0142\u0105czone za pomoc\u0105 <em>AND,<\/em> ale za pomoc\u0105 <em>OR.<\/em><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">stm.execute(\"({code} LUB {name})\");<\/pre>\n<p><\/div><\/section>\n<p>Je\u015bli w wyra\u017ceniu OQL u\u017cywane s\u0105 normalne parametry, nie s\u0105 one ju\u017c uwzgl\u0119dniane w normalnym \u0142\u0105czeniu parametr\u00f3w.<\/p>\n<section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\"><\/p>\n<p>Parametry <em>A, B, C <\/em>i<em> D<\/em> s\u0105 zdefiniowane w wyszukiwaniu i maj\u0105 przypisane warto\u015bci. Zazwyczaj parametry s\u0105 po\u0142\u0105czone za pomoc\u0105 <em>AND:<\/em> <em>A AND B AND C AND D<\/em>. Je\u015bli parametry C i D s\u0105 u\u017cywane w wyra\u017ceniu OQL, np. <em>({C} OR {D})<\/em>, tylko<em> A<\/em> i <em>B<\/em> s\u0105 po\u0142\u0105czone, a wyra\u017cenie OQL jest do\u0142\u0105czane: <em>A AND B AND (C OR D)<\/em>.<\/p>\n<p><\/div><\/section>\n<h3 id=\"restart\" ><span class=\"ez-toc-section\" id=\"Restart\"><\/span>Restart<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Z regu\u0142y wyszukiwanie nigdy nie zwraca wszystkich rekord\u00f3w danych. Zamiast tego odczytywana jest tylko ograniczona liczba rekord\u00f3w danych. W dostarczonych wizualizacjach wyszukiwania, np. wyszukiwanie dialogowe, pomoc warto\u015bci aplikacji itp. liczba ta jest ograniczona do 60 rekord\u00f3w danych. W przypadku aplikacji zapyta\u0144 liczba rekord\u00f3w danych zale\u017cy od dost\u0119pnego miejsca w interfejsie. Je\u015bli wymagana jest wi\u0119ksza liczba rekord\u00f3w danych, wyszukiwanie musi zosta\u0107 wznowione od starej pozycji i wczyta\u0107 kolejne rekordy danych.<\/p>\n<p>Aby mo\u017cliwe by\u0142o ponowne uruchomienie, ka\u017cdy ze znalezionych rekord\u00f3w danych musi by\u0107 unikalny dla zastosowanego sortowania, tj. parametry u\u017cyte w sortowaniu, kt\u00f3re musz\u0105 by\u0107 r\u00f3wnie\u017c warto\u015bciami zwracanymi, tworz\u0105 unikalny klucz do okre\u015blenia rekordu danych. Je\u015bli ten wym\u00f3g jest spe\u0142niony, mo\u017cna skonfigurowa\u0107 warunek przy u\u017cyciu parametr\u00f3w sortowania i warto\u015bci zwracanych ostatniego znalezionego rekordu danych w celu okre\u015blenia nast\u0119pnego rekordu danych do ponownego uruchomienia.<\/p>\n<p>Wi\u0119cej informacji na temat tworzenia warunku mo\u017cna znale\u017a\u0107 w dokumentacji <em>Podr\u0119cznik referencji: Wyszukiwanie.<\/em><\/p>\n<p>Instrukcja <em>CisOqlSearchStatement<\/em> zawiera dwie metody ponownego uruchamiania wyszukiwania. Metoda <em>setContinuePosition(&#8230;)<\/em> s\u0142u\u017cy do ustawiania pozycji dla ponownego uruchomienia. Do metody mo\u017cna przekaza\u0107 <em>CisResultSet.<\/em> Warto\u015bci parametr\u00f3w istotnych dla sortowania s\u0105 odczytywane i kompilowane do warunku zgodnie z opisan\u0105 procedur\u0105. Nast\u0119pnie nale\u017cy zamkn\u0105\u0107 <em>CisResultSet.<\/em><\/p>\n<p>Je\u015bli metoda <em>continueExec<\/em><em>ute(&#8230;)<\/em> zostanie wywo\u0142ana p\u00f3\u017aniej, wyszukiwanie b\u0119dzie kontynuowane z warunkiem utworzonym dla ponownego uruchomienia. Je\u015bli metoda zostanie wywo\u0142ana bez wcze\u015bniejszego okre\u015blenia pozycji dla ponownego uruchomienia, zostanie zg\u0142oszony wyj\u0105tek.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">public void setContinuePosition(CisResultSet rs) \nthrows SQLException; \npublic CisResultSet continueExecute() ;<\/pre>\n<h5 id=\"dolaczanie-unikalnego-klucza\" ><span class=\"ez-toc-section\" id=\"Dolaczanie_unikalnego_klucza\"><\/span>Do\u0142\u0105czanie unikalnego klucza<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Je\u015bli wybrane parametry sortowania nie s\u0105 wystarczaj\u0105ce do okre\u015blenia unikalnej pozycji dla restartu, mo\u017cna sztucznie doda\u0107 dodatkowe parametry. S\u0105 to parametry oznaczone jako atrybuty kluczowe w definicji wyszukiwania. Parametry z tym wska\u017anikiem by\u0142yby wystarczaj\u0105ce do jednoznacznego okre\u015blenia rekordu danych.<\/p>\n<p>Aby uwzgl\u0119dni\u0107 te parametry w warunku ponownego uruchomienia, nale\u017cy przekaza\u0107 warto\u015b\u0107 <em>true<\/em> do metody <em>setAppendUnqiuekey(&#8230;).<\/em><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">public void setAppendUnqiueKey(boolean appendUniqueKey);<\/pre>\n<h5 id=\"fragmenty\" ><span class=\"ez-toc-section\" id=\"Fragmenty\"><\/span>Fragmenty<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Definicja wyszukiwania OQL sk\u0142ada si\u0119 z co najmniej jednego g\u0142\u00f3wnego fragmentu i zestawu parametr\u00f3w, kt\u00f3re s\u0105 zdefiniowane w tym g\u0142\u00f3wnym fragmencie.<\/p>\n<p>W definicji wyszukiwania mo\u017cna zdefiniowa\u0107 dodatkowe fragmenty i powi\u0105zane z nimi parametry. Fragmenty te powinny by\u0107 zawsze powi\u0105zane z g\u0142\u00f3wnym fragmentem za pomoc\u0105 <em>outer join<\/em>.<\/p>\n<p>R\u00f3\u017cnica w stosunku do g\u0142\u00f3wnego fragmentu polega na tym, \u017ce te fragmenty s\u0105 dodawane do wyszukiwania tylko wtedy, gdy co najmniej jeden ze zdefiniowanych parametr\u00f3w jest u\u017cywany do wyszukiwania, np. do zapytania lub sortowania. Je\u015bli parametry nie s\u0105 u\u017cywane, ca\u0142y fragment jest pomijany. Wynikowe wyra\u017cenie OQL jest kr\u00f3tsze, a zatem mniej z\u0142o\u017cone. Zwi\u0119ksza to wydajno\u015b\u0107 zapytania.<\/p>\n<section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\"><\/p>\n<p>Definicja wyszukiwania ma g\u0142\u00f3wny i dodatkowy fragment. G\u0142\u00f3wny fragment jest zdefiniowany w nast\u0119puj\u0105cy spos\u00f3b:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">{base = com.cisag.app.test.AEntity A}<\/pre>\n<p>Atrybuty <em>A:a, A:b, A:c<\/em> s\u0105 u\u017cywane pod nazwami parametr\u00f3w<em> a, b, c<\/em> dla zapytania.<\/p>\n<p>Drugi fragment jest zdefiniowany w nast\u0119puj\u0105cy spos\u00f3b:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">{base} LEFT OUTER JOIN com.cisag.app.test.BEntity B<\/pre>\n<p>Atrybuty <em>B:e, B:f<\/em> s\u0105 u\u017cywane pod nazwami parametr\u00f3w <em>e, f<\/em> dla zapytania.<\/p>\n<p>Je\u015bli dla parametr\u00f3w e lub f zapytania zapisane s\u0105 warto\u015bci, otrzymamy nast\u0119puj\u0105cy wynik OQL:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">SELECT ... FROM com.cisag.app.test.AEntity A\n\nLEFT OUTER JOIN com.cisag.app.test.BEntity B\n\nON A:bguid = B:guid\n\nWHERE B:e = ...\n\nORDER BY ...<\/pre>\n<p>Je\u015bli jednak nie s\u0105 u\u017cywane \u017cadne parametry z drugiego fragmentu, OQL jest skracany do nast\u0119puj\u0105cego wyra\u017cenia:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">SELECT ... FROM com.cisag.app.test.AEntity A\n\nWHERE A:a = ...\n\nORDER BY ...<\/pre>\n<p><\/div><\/section>\n<h4 id=\"ograniczenia\" ><span class=\"ez-toc-section\" id=\"Ograniczenia\"><\/span>Ograniczenia<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Poni\u017cej wymieniono ograniczenia dotycz\u0105ce korzystania z <em>Persistence service.<\/em><\/p>\n<h5 id=\"typ-danych-sblob\" ><span class=\"ez-toc-section\" id=\"Typ_danych_SBlob\"><\/span>Typ danych <em>SBlob<\/em><span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Typ danych systemu ERP <em>SBlob<\/em> jest dost\u0119pny tylko do u\u017cytku wewn\u0119trznego w Comarch ERP Enterprise. W przysz\u0142o\u015bci, ten typ danych nie b\u0119dzie obs\u0142ugiwany &#8211; jego stosowanie nie jest zalecane. Alternatyw\u0105 jest korzystanie z plik\u00f3w za po\u015brednictwem Knowledge Store.<\/p>\n<p>Typ danych systemu ERP <em>SBlob<\/em> (Streamable Blob) to specjalny typ danych do przechowywania du\u017cych ilo\u015bci danych binarnych. Zalet\u0105 jest to, \u017ce <em>Persistence service<\/em> nigdy nie przechowuje danych w ca\u0142o\u015bci w pami\u0119ci g\u0142\u00f3wnej. Ten typ danych jest u\u017cywany, gdy dane binarne s\u0105 tak du\u017ce, \u017ce zu\u017cycie pami\u0119ci g\u0142\u00f3wnej w celu pe\u0142nego za\u0142adowania zestawu danych na serwerze aplikacji nie jest ju\u017c uzasadnione.<\/p>\n<p>Klasa <em>com.cisag.pgm.datatype.CisStreamableBlob <\/em>mo\u017ce by\u0107 u\u017cywana do odpytywania zar\u00f3wno <em>InputStream do <\/em>odczytu danych typu blob, jak i <em>OutputStream <\/em>do zapisu.<\/p>\n<p>Nast\u0119puj\u0105ce ograniczenia maj\u0105 zastosowanie do korzystania ze strumieniowych obiekt\u00f3w blob:<\/p>\n<ul>\n<li><em>Streamable blob<\/em>s mog\u0105 by\u0107 zapisywane tylko raz na transakcj\u0119<\/li>\n<li><em>Streamable blobs<\/em> mog\u0105 by\u0107 zapisywane tylko na poziomie pierwszej transakcji, tj. nie w podtransakcjach<\/li>\n<li><em>Streamable blobs<\/em> mog\u0105 by\u0107 ponownie odczytane dopiero po potwierdzeniu transakcji przez <em>commit<\/em><\/li>\n<\/ul>\n<h4 id=\"usluga-blokady\" ><span class=\"ez-toc-section\" id=\"Usluga_blokady\"><\/span>Us\u0142uga blokady<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Us\u0142uga blokady zarz\u0105dza blokadami logicznymi i blokadami obiekt\u00f3w biznesowych. Blokady wszystkich serwer\u00f3w aplikacji w systemie s\u0105 zarz\u0105dzane centralnie na serwerze komunikat\u00f3w.<\/p>\n<p>W systemie z wieloma u\u017cytkownikami konieczne jest regulowanie korzystania ze wsp\u00f3\u0142dzielonych zasob\u00f3w. Blokada s\u0142u\u017cy do synchronizacji dost\u0119pu do ograniczonego zasobu. Zasoby te to zazwyczaj jedna lub wi\u0119cej instancji obiekt\u00f3w biznesowych. Ka\u017cda blokada jest wymagana dla zasobu w okre\u015blonym kontek\u015bcie blokady.<\/p>\n<p>Wszystkie blokady s\u0105 wydawane przez centraln\u0105 us\u0142ug\u0119 blokady. Gdy blokada jest wymagana, \u017c\u0105danie jest wysy\u0142ane do us\u0142ugi blokady. Us\u0142uga blokady albo przyznaje t\u0119 blokad\u0119, albo odrzuca \u017c\u0105danie blokady. Blokada pozostaje na miejscu do momentu jej jawnego zwolnienia lub zwolnienia kontekstu blokady.<\/p>\n<h5 id=\"konteksty-blokady\" ><span class=\"ez-toc-section\" id=\"Konteksty_blokady\"><\/span>Konteksty blokady<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Blokady s\u0105 zawsze wymagane w kontek\u015bcie blokady. Mo\u017cliwe konteksty blokady to transakcje, instancje aplikacji i sesje. Istnienie blokady jest powi\u0105zane z odpowiednim kontekstem blokady. Je\u015bli blokada zosta\u0142a za\u017c\u0105dana w ramach transakcji, jest ona zwalniana po zako\u0144czeniu transakcji (z zatwierdzeniem lub wycofaniem). Konteksty blokady maj\u0105 nast\u0119puj\u0105ce zale\u017cno\u015bci:<\/p>\n<p><a href=\"https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/04\/ChatGPT-Image-30-kwi-2025-14_55_10-2.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-29604\" src=\"https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/04\/ChatGPT-Image-30-kwi-2025-14_55_10-2.png\" alt=\"\" width=\"1536\" height=\"1024\" srcset=\"https:\/\/pomoc.comarch.pl\/cee\/640\/wp-content\/uploads\/2025\/04\/ChatGPT-Image-30-kwi-2025-14_55_10-2.png 1536w, https:\/\/pomoc.comarch.pl\/cee\/640\/wp-content\/uploads\/2025\/04\/ChatGPT-Image-30-kwi-2025-14_55_10-2-300x200.png 300w, https:\/\/pomoc.comarch.pl\/cee\/640\/wp-content\/uploads\/2025\/04\/ChatGPT-Image-30-kwi-2025-14_55_10-2-1024x683.png 1024w, https:\/\/pomoc.comarch.pl\/cee\/640\/wp-content\/uploads\/2025\/04\/ChatGPT-Image-30-kwi-2025-14_55_10-2-768x512.png 768w, https:\/\/pomoc.comarch.pl\/cee\/640\/wp-content\/uploads\/2025\/04\/ChatGPT-Image-30-kwi-2025-14_55_10-2-50x33.png 50w, https:\/\/pomoc.comarch.pl\/cee\/640\/wp-content\/uploads\/2025\/04\/ChatGPT-Image-30-kwi-2025-14_55_10-2-920x613.png 920w, https:\/\/pomoc.comarch.pl\/cee\/640\/wp-content\/uploads\/2025\/04\/ChatGPT-Image-30-kwi-2025-14_55_10-2-600x400.png 600w, https:\/\/pomoc.comarch.pl\/cee\/640\/wp-content\/uploads\/2025\/04\/ChatGPT-Image-30-kwi-2025-14_55_10-2-320x213.png 320w\" sizes=\"auto, (max-width: 1536px) 100vw, 1536px\" \/><\/a><\/p>\n<p>Na ilustracji wewn\u0119trzne konteksty s\u0105 egzystencjalnie powi\u0105zane z zewn\u0119trznymi kontekstami blokad. Na przyk\u0142ad, je\u015bli sesja zostanie zako\u0144czona, wszystkie blokady na poziomie transakcji i instancji aplikacji , kt\u00f3re zosta\u0142y za\u017c\u0105dane w tej sesji, zostan\u0105 r\u00f3wnie\u017c zwolnione. Je\u015bli serwer aplikacji zostanie zako\u0144czony, wszystkie blokady \u017c\u0105dane przez serwer aplikacji zostan\u0105 zwolnione.<\/p>\n<h5 id=\"rodzaje-blokad\" ><span class=\"ez-toc-section\" id=\"Rodzaje_blokad\"><\/span>Rodzaje blokad<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Nast\u0119puj\u0105ce typy blokad s\u0105 widoczne dla dewelopera aplikacji w <em>Persistence service.<\/em><\/p>\n<h6 id=\"blokady-logiczne\" ><span class=\"ez-toc-section\" id=\"Blokady_logiczne\"><\/span>Blokady logiczne<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p>Blokady logiczne s\u0105 identyfikowane przez ci\u0105g znak\u00f3w. Nie blokuj\u0105 one \u017cadnych zasob\u00f3w, kt\u00f3re s\u0105 bezpo\u015brednio rozpoznawalne dla <em>Persistence service<\/em>, ale maj\u0105 znaczenie tylko dla aplikacji, kt\u00f3ra z nich korzysta. Blokady logiczne s\u0105<\/p>\n<ul>\n<li>wy\u0142\u0105czne, tzn. tylko jeden kontekst mo\u017ce posiada\u0107 wy\u0142\u0105czn\u0105 blokad\u0119 logiczn\u0105 w danym momencie,<\/li>\n<\/ul>\n<p>lub<\/p>\n<ul>\n<li>niewy\u0142\u0105czne, tj. dowolna liczba kontekst\u00f3w mo\u017ce jednocze\u015bnie posiada\u0107 niewy\u0142\u0105czne blokady logiczne.<\/li>\n<\/ul>\n<p>Blokady logiczne s\u0105 zawsze wyra\u017anie wymagane przez aplikacj\u0119. Kontekstem blokady logicznej jest zazwyczaj instancja aplikacji.<\/p>\n<h6 id=\"blokady-instancji\" ><span class=\"ez-toc-section\" id=\"Blokady_instancji\"><\/span>Blokady instancji<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p>Blokady instancji s\u0105 niejawnie wymagane przez us\u0142ug\u0119 trwa\u0142o\u015bci dla poszczeg\u00f3lnych instancji obiekt\u00f3w biznesowych w zale\u017cno\u015bci od trybu dost\u0119pu. Wszystkie blokady instancji s\u0105 wymagane w kontek\u015bcie blokady transakcji najwy\u017cszego poziomu.<\/p>\n<p>W trybie dost\u0119pu <em>READ_REPEATABLE<\/em> wymagana jest blokada instancji odczytu. Dowolna liczba transakcji najwy\u017cszego poziomu mo\u017ce posiada\u0107 blokad\u0119 instancji odczytu w tym samym czasie.<\/p>\n<p>Blokada instancji zapisu jest wymagana dla trybu dost\u0119pu <em>READ_UPDATE, READ_WRITE<\/em> lub <em>INSERT.<\/em> Tylko transakcja <em>Top Level<\/em> mo\u017ce posiada\u0107 blokad\u0119 instancji zapisu w dowolnym momencie.<\/p>\n<p>Tylko jedna blokada zapisu instancji lub dowolna liczba blokad odczytu instancji mo\u017ce zosta\u0107 za\u017c\u0105dana na instancji obiektu biznesowego. Blokady instancji s\u0105 zwalniane dopiero po zako\u0144czeniu transakcji najwy\u017cszego poziomu. Oznacza to np. \u017ce je\u015bli transakcja zostanie zako\u0144czona za pomoc\u0105 funkcji <em>commit(),<\/em> zmienione obiekty zostan\u0105 zapisane w bazie danych i dopiero wtedy blokady instancji zostan\u0105 zwolnione.<\/p>\n<h6 id=\"blokady-tablicy\" ><span class=\"ez-toc-section\" id=\"Blokady_tablicy\"><\/span>Blokady tablicy<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p>Podczas korzystania z metody<em> getUpdateStatement()<\/em> blokada zapisu tabeli jest wymagana niejawnie. Obejmuje ona ca\u0142\u0105 tabel\u0119, tj. wszystkie instancje obiekt\u00f3w biznesowych danego typu w bazie danych. Tylko jedna transakcja najwy\u017cszego poziomu w danym momencie mo\u017ce posiada\u0107 blokad\u0119 zapisu tabeli. Blokady tabel s\u0105 zwalniane dopiero po zako\u0144czeniu transakcji najwy\u017cszego poziomu. Oznacza to, \u017ce po zako\u0144czeniu transakcji za pomoc\u0105 funkcji <em>commit(),<\/em> instrukcje aktualizacji s\u0105 wykonywane w bazie danych i dopiero wtedy blokady tabel s\u0105 zwalniane.<\/p>\n<h5 id=\"blokady-jednostek-biznesowych\" ><span class=\"ez-toc-section\" id=\"Blokady_jednostek_biznesowych\"><\/span>Blokady jednostek biznesowych<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>W przypadku gdy podmioty zale\u017cne jednostki biznesowej s\u0105 odpowiednie dla blokad jednostki biznesowej, to je\u015bli wymagana jest blokada instancji dla podmiotu zale\u017cnego, zamiast tego wymagana jest blokada dla powi\u0105zanego podmiotu biznesowego. W szczeg\u00f3lno\u015bci, je\u015bli kilka blokad instancji jest \u017c\u0105danych dla podmiot\u00f3w zale\u017cnych tej samej instancji jednostki biznesowej, tylko jedno \u017c\u0105danie blokady musi zosta\u0107 przetworzone dla jednostki biznesowej. Blokady instancji podmiot\u00f3w zale\u017cnych s\u0105 przetwarzane w \u017c\u0105daniu blokady po zako\u0144czeniu transakcji.<\/p>\n<p>Aby jednostka zale\u017cna obs\u0142ugiwa\u0142a blokady jednostek biznesowych, klucz podstawowy jednostki zale\u017cnej musi zaczyna\u0107 si\u0119 od klucza obcego dla klucza podstawowego jednostki biznesowej.<\/p>\n<section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\"><\/p>\n<p>Jednostka biznesowa <em>E<\/em> posiada klucz podstawowy <em>guid.<\/em> Podmiot zale\u017cny <em>D<\/em> przechowuje klucz g\u0142\u00f3wny <em>E<\/em> w atrybucie <em>header.<\/em><\/p>\n<p>Je\u015bli klucz podstawowy <em>D<\/em> sk\u0142ada si\u0119 z atrybut\u00f3w <em>header<\/em> i <em>detailGuid,<\/em> w\u00f3wczas <em>D<\/em> nadaje si\u0119 do blokowania encji biznesowej.<\/p>\n<p>Je\u015bli klucz podstawowy <em>D<\/em> sk\u0142ada si\u0119 tylko z atrybutu <em>detailGuid,<\/em> w\u00f3wczas <em>D<\/em> nie nadaje si\u0119 do blokowania encji biznesowej.<\/p>\n<p><\/div><\/section>\n<p>Blokady jednostek biznesowych powinny by\u0107 brane pod uwag\u0119 przy projektowaniu modelu danych, szczeg\u00f3lnie w przypadku jednostek biznesowych z du\u017c\u0105 liczb\u0105 podmiot\u00f3w zale\u017cnych.<\/p>\n<h5 id=\"synchronizacja-wspoldzielonych-pamieci-podrecznych-shared-caches\" ><span class=\"ez-toc-section\" id=\"Synchronizacja_wspoldzielonych_pamieci_podrecznych_Shared_Caches\"><\/span>Synchronizacja wsp\u00f3\u0142dzielonych pami\u0119ci podr\u0119cznych (Shared Caches)<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Blokady obiekt\u00f3w biznesowych s\u0142u\u017c\u0105 do synchronizacji pami\u0119ci podr\u0119cznej serwer\u00f3w aplikacji w systemie. Za ka\u017cdym razem, gdy dla instancji obiektu biznesowego zostanie za\u017c\u0105dana blokada instancji zapisu, zak\u0142ada si\u0119, \u017ce instancja zostanie r\u00f3wnie\u017c zmieniona. W regularnych odst\u0119pach czasu (zazwyczaj co 5 sekund) wszystkie instancje obiekt\u00f3w biznesowych s\u0105 usuwane ze wsp\u00f3\u0142dzielonych pami\u0119ci podr\u0119cznych wszystkich serwer\u00f3w aplikacji, kt\u00f3rych blokada instancji zapisu zosta\u0142a zwolniona. W pami\u0119ci podr\u0119cznej serwera aplikacji, kt\u00f3ry wprowadzi\u0142 zmian\u0119, instancje pozostaj\u0105 w pami\u0119ci podr\u0119cznej, poniewa\u017c ten serwer aplikacji posiada aktualnie wa\u017cn\u0105 wersj\u0119 instancji.<\/p>\n<p>Gdy blokady tabel zapisu s\u0105 zwalniane, wszystkie instancje obiekt\u00f3w biznesowych s\u0105 usuwane ze wsp\u00f3\u0142dzielonej pami\u0119ci podr\u0119cznej wszystkich serwer\u00f3w aplikacji w tych samych regularnych odst\u0119pach czasu w ca\u0142ym systemie.<\/p>\n<h5 id=\"blokady-logiczne\" ><span class=\"ez-toc-section\" id=\"Blokady_logiczne-2\"><\/span>Blokady logiczne<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Blokady logiczne blokuj\u0105 dowolny zas\u00f3b. Zasoby te s\u0105 zazwyczaj zestawem instancji obiekt\u00f3w biznesowych, kt\u00f3re nie mog\u0105 by\u0107 zmieniane przez okre\u015blony czas. Dzieje si\u0119 tak, gdy z\u0142o\u017cona i rozleg\u0142a operacja jest podzielona na kilka transakcji najwy\u017cszego poziomu. Odpowiednie transakcje najwy\u017cszego poziomu mog\u0105 czasami pozostawia\u0107 niesp\u00f3jne stany w bazie danych. Blokady instancji maj\u0105 transakcj\u0119 najwy\u017cszego poziomu jako kontekst blokady. Je\u015bli istnieje kilka kolejnych transakcji <em>Top Level<\/em>, mo\u017cliwe jest, \u017ce inne sesje uzyskaj\u0105 dost\u0119p do wcze\u015bniej zablokowanych i prawdopodobnie niesp\u00f3jnych obiekt\u00f3w mi\u0119dzy transakcjami. T\u0119 z\u0142o\u017con\u0105 operacj\u0119 mo\u017cna zabezpieczy\u0107 za pomoc\u0105 blokady logicznej. Jednak aby to zadzia\u0142a\u0142o, blokada logiczna musi by\u0107 jawnie wymagana za ka\u017cdym razem, gdy uzyskuje si\u0119 dost\u0119p do zablokowanych instancji obiekt\u00f3w biznesowych. Us\u0142uga trwa\u0142o\u015bci nie zna relacji mi\u0119dzy blokad\u0105 a instancjami obiekt\u00f3w biznesowych i nie mo\u017ce sprawdzi\u0107 blokady w spos\u00f3b niejawny.<\/p>\n<p>Blokady logiczne s\u0105 zwykle wymagane w kontek\u015bcie blokady instancji aplikacji. Te logiczne blokady mog\u0105 by\u0107 tworzone przy u\u017cyciu funkcji<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">public acquireLock(String value);\npublic acquireLock(String value, byte use);<\/pre>\n<p>managera aplikacji. Opcjonalny parametr <em>use<\/em> okre\u015bla, czy nale\u017cy za\u017c\u0105da\u0107 blokady wy\u0142\u0105cznej czy niewy\u0142\u0105cznej. Tak d\u0142ugo, jak instancja aplikacji posiada wy\u0142\u0105czn\u0105 blokad\u0119 na ci\u0105gu znak\u00f3w <em>value,<\/em> \u017cadna inna wy\u0142\u0105czna lub niewy\u0142\u0105czna blokada nie jest przyznawana na tym samym ci\u0105gu znak\u00f3w. Je\u015bli instancja aplikacji posiada blokad\u0119 niewy\u0142\u0105czn\u0105 na ci\u0105gu znak\u00f3w <em>value,<\/em> wszelkie dalsze blokady niewy\u0142\u0105czne \u017c\u0105dane bezpo\u015brednio po tym s\u0105 przyznawane na tym samym ci\u0105gu znak\u00f3w. Je\u015bli opcjonalny parametr <em>use<\/em> nie jest okre\u015blony, \u017c\u0105dana jest blokada wy\u0142\u0105czna. Warto\u015b\u0107 zwrotna funkcji <em>acquireLock()<\/em> okre\u015bla, czy blokada zosta\u0142a przyznana, czy odrzucona. Je\u015bli blokada zosta\u0142a odrzucona, mo\u017cna u\u017cy\u0107 funkcji<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">public String getLockInformation(String value);<\/pre>\n<p>Informacje o tym, kt\u00f3ry u\u017cytkownik posiada blokad\u0119, mo\u017cna uzyska\u0107 za pomoc\u0105 metody <em>getLockInformation().<\/em> Metoda <em>getLockInformation()<\/em> nie mo\u017ce by\u0107 wywo\u0142ywana, je\u015bli blokada zosta\u0142a pomy\u015blnie przyznana, poniewa\u017c metoda ta mo\u017ce zwolni\u0107 blokad\u0119.<\/p>\n<p>Instancja aplikacji jest odpowiedzialna za przywr\u00f3cenie ka\u017cdej blokady logicznej, kt\u00f3rej za\u017c\u0105da\u0142a za pomoc\u0105<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">public void releaseLock( String value );<\/pre>\n<p>Je\u015bli instancja aplikacji nie zwolni \u017c\u0105danych blokad, inne instancje aplikacji nie mog\u0105 pomy\u015blnie za\u017c\u0105da\u0107 blokady, a zatem nie mog\u0105 uzyska\u0107 dost\u0119pu do zablokowanego zasobu.<\/p>\n<h4 id=\"przelaczanie-awaryjne-bazy-danych\" ><span class=\"ez-toc-section\" id=\"Przelaczanie_awaryjne_bazy_danych\"><\/span>Prze\u0142\u0105czanie awaryjne bazy danych<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Wi\u0119kszo\u015b\u0107 system\u00f3w zarz\u0105dzania bazami danych (DBMS) posiada mechanizmy prze\u0142\u0105czania awaryjnego. Oznacza to, \u017ce kilka instancji bazy danych dzia\u0142a r\u00f3wnolegle w tej samej bazie danych lub w lustrzanej bazie danych. Je\u015bli instancja bazy danych nie jest ju\u017c dost\u0119pna z powodu b\u0142\u0119du, inna instancja bazy danych mo\u017ce przej\u0105\u0107 zadania uszkodzonej instancji. Cz\u0119sto istnieje kilka opcji konfiguracji prze\u0142\u0105czania awaryjnego dla systemu bazy danych w ramach systemu DBMS. Obs\u0142ugiwane konfiguracje mo\u017cna znale\u017a\u0107 w dokumentacji instalacyjnej.<\/p>\n<p><em>Persistence service<\/em> utrzymuje wszystkie po\u0142\u0105czenia z jedn\u0105 instancj\u0105 bazy danych na baz\u0119 danych systemu ERP we wsp\u00f3lnej puli. Je\u015bli serwer aplikacji wymaga po\u0142\u0105czenia, wszystkie po\u0142\u0105czenia w puli s\u0105 ju\u017c u\u017cywane, a maksymalna liczba po\u0142\u0105cze\u0144 w puli nie zosta\u0142a jeszcze osi\u0105gni\u0119ta, nowe po\u0142\u0105czenie jest otwierane i rejestrowane w puli. Je\u015bli baza danych zg\u0142osi b\u0142\u0105d, dane po\u0142\u0105czenie zostanie zamkni\u0119te.<\/p>\n<p>Je\u015bli <em>Persistence service<\/em> rozpozna na podstawie komunikatu o b\u0142\u0119dzie, \u017ce instancja bazy danych nie powiod\u0142a si\u0119, wszystkie otwarte nieaktywne po\u0142\u0105czenia z baz\u0105 danych s\u0105 zamykane i ponownie otwierane po okresie oczekiwania. Operacja aktualnie wykonywana w aktywnym po\u0142\u0105czeniu z baz\u0105 danych jest anulowana z komunikatem o b\u0142\u0119dzie, je\u015bli instancja bazy danych ulegnie awarii. <em>Persistence service<\/em> rozpoznaje ten komunikat o b\u0142\u0119dzie i pr\u00f3buje ponownie wykona\u0107 operacj\u0119 z nowym po\u0142\u0105czeniem z baz\u0105 danych. Nast\u0119puj\u0105ce operacje nie mog\u0105 zosta\u0107 wykonane ponownie:<\/p>\n<ul>\n<li>Zako\u0144czenie transakcji bazy danych przez <em>commit<\/em><\/li>\n<li>Przeszukanie nast\u0119pnego zestawu danych w ju\u017c otwartym <em>ResultSet<\/em> lub <em>ObjectIterator<\/em><\/li>\n<li>Modyfikacje schematu danych, np. za pomoc\u0105 <em>crtbo<\/em> lub <em>upgaps<\/em><\/li>\n<\/ul>\n<p>Je\u015bli po\u0142\u0105czenie z baz\u0105 danych zostanie przerwane podczas jednej z tych operacji, generowany jest wyj\u0105tek <em>CisApplicationServerException<\/em> typu <em>DATABASE_CONNECTION_LOST.<\/em> Wyj\u0105tek ten mo\u017ce by\u0107 specjalnie obs\u0142ugiwany przez aplikacje. Przyk\u0142adowo, transakcje zapisu powinny zosta\u0107 powt\u00f3rzone, je\u015bli wyst\u0105pi ten wyj\u0105tek. Wyj\u0105tek ten jest r\u00f3wnie\u017c zg\u0142aszany dla innych operacji, je\u015bli nie mo\u017cna ponownie nawi\u0105za\u0107 po\u0142\u0105czenia z baz\u0105 danych.<\/p>\n<h4 id=\"dziennik-zmian\" ><span class=\"ez-toc-section\" id=\"Dziennik_zmian\"><\/span>Dziennik zmian<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Dziennik zmian jest funkcj\u0105 dziennika dla historii zmiennych biznesowych i rejestruje zdarzenia w cyklu jednostek biznesowych. Dla ka\u017cdej jednostki biznesowej i instancji bazy danych mo\u017cna okre\u015bli\u0107, czy zmiany powinny by\u0107 rejestrowane. <em>Persistence service<\/em> dba zatem nie tylko o informacje o zmianach dla podmiot\u00f3w biznesowych, ale tak\u017ce o wpisy w dzienniku zmian. Rejestrowane s\u0105 tylko pomy\u015blnie zako\u0144czone transakcje <em>Top Level<\/em>.<\/p>\n<p>Artyku\u0142 <em>Dziennik zmian<\/em> zawiera dalsze informacje.<\/p>\n<h4 id=\"lista-transferu\" ><span class=\"ez-toc-section\" id=\"Lista_transferu\"><\/span>Lista transferu<a id=\"PS6\"><\/a><span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>W przeciwie\u0144stwie do dziennika zmian, lista transferu rejestruje tylko, \u017ce instancja jednostki biznesowej zosta\u0142a zmieniona od czasu ostatniego przetworzenia tej instancji. Lista transferu mo\u017ce by\u0107 u\u017cywana w szczeg\u00f3lno\u015bci podczas wymiany danych z systemami zewn\u0119trznymi.<\/p>\n<p>Artyku\u0142 <em>Dziennik zmian<\/em> zawiera dalsze informacje.<\/p>\n<h4 id=\"update-listener\" ><span class=\"ez-toc-section\" id=\"Update_Listener\"><\/span>Update Listener<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>W szczeg\u00f3lno\u015bci podczas wymiany danych z systemami zewn\u0119trznymi pomocna jest informacja, czy obiekt biznesowy zosta\u0142 zmieniony w okre\u015blonym czasie. Wymiana danych z systemem zewn\u0119trznym musi zosta\u0107 uruchomiona tylko wtedy, gdy nast\u0105pi\u0142a zmiana. <em>Update Listener<\/em> mo\u017ce by\u0107 teraz u\u017cyty do sprawdzenia dok\u0142adnie tego.<\/p>\n<p><em>Update Listener<\/em> jest tworzony w <em>CisSystemManager<\/em> przy u\u017cyciu metody <em>createUpdateListener.<\/em> Baza danych, kt\u00f3ra ma by\u0107 monitorowana i obiekty biznesowe, kt\u00f3re maj\u0105 by\u0107 monitorowane s\u0105 zdefiniowane.<\/p>\n<p>Metoda <em>getUpdateTimeStamps<\/em> mo\u017ce by\u0107 u\u017cywana w <em>Update Listener<\/em> w celu sprawdzenia, kt\u00f3re obiekty biznesowe s\u0105 monitorowane przez <em>Update Listener<\/em> i czy te obiekty biznesowe zosta\u0142y zmienione od czasu ostatniego wywo\u0142ania metod <em>waitUpdate<\/em> lub <em>checkUpdate.<\/em> Metoda <em>isChanged<\/em> zwraca warto\u015b\u0107 <em>true,<\/em> je\u015bli instancja obiektu biznesowego zosta\u0142a zmieniona. Metoda <em>etTimeStamp<\/em> zwraca czas, w kt\u00f3rym zmiana zosta\u0142a przetworzona przez detektor aktualizacji. Czas ten zazwyczaj r\u00f3\u017cni si\u0119 od czasu podanego w <em>UpdateInfo.<\/em><\/p>\n<p><em>Update Listener<\/em> mog\u0105 by\u0107 u\u017cywane razem z list\u0105 transferow\u0105. S\u0142uchacz aktualizacji zg\u0142asza, \u017ce instancja obiektu biznesowego zosta\u0142a zmieniona, a lista transfer\u00f3w pokazuje, kt\u00f3ra instancja zosta\u0142a zmieniona. Wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale <em><a href=\"#PS6\">Lista\u00a0transferu<\/a><\/em>.<\/p>\n<p>Nale\u017cy pami\u0119ta\u0107, \u017ce <em>Update Listener<\/em> monitoruje zmiany tylko po jego utworzeniu. Wszystkie zmiany w monitorowanych obiektach biznesowych, kt\u00f3re mia\u0142y miejsce przed utworzeniem s\u0142uchacza aktualizacji, nie powoduj\u0105, \u017ce <em>isChanged<\/em> wy\u015bwietla warto\u015b\u0107 true.<\/p>\n<p>Po utworzeniu <em>Update Listener<\/em> nale\u017cy zatem za\u0142o\u017cy\u0107, \u017ce wszystkie obiekty biznesowe zosta\u0142y zmienione przed utworzeniem <em>Update Listener<\/em>.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">byte[] databaseGuid =\ntm.getDatabaseGuid(CisTransactionManager.OLTP);\n\nClass[] classes = new Class[] {\n\nPartner.class, Item.class\n\n};\n\nCisUpdateListener updateListener = sm.createUpdateListener(\n\ndatabaseGuid, classes );\n\ntry {\n\n\/\/ Przetwarzanie wszystkich danych przed Update listener\n\n\/\/ Zmienione obiekty\n\nfor (UpdateTimeStamp updateTimeStamp :\n\nupdateListener.getUpdateTimeStamps()) {\n\nprocess(updateTimeStamp.getClassGuid());\n\n}\n\nwhile (! env.isToBeRemoved()) {\n\n\/\/ Odczekaj co najmniej 30 sekund pomi\u0119dzy dwoma krokami przetwarzania.\n\n\/\/ kroki\n\nwait(30000);\n\n\/\/ Oczekiwanie na zmian\u0119 przez niesko\u0144czenie d\u0142ugi czas\n\nif (updateListener.waitUpdate(0)) {\n\n\/\/ Przetwarzanie wszystkich zmienionych obiekt\u00f3w\n\nfor (UpdateTimeStamp updateTimeStamp :\n\nupdateListener.getUpdateTimeStamps()) {\n\nif (updateTimeStamp.isChanged()) {\n\nprocess(updateTimeStamp.getClassGuid());\n\n}\n\n}\n\n}\n\n}\n\n} finally {\n\nupdateListener.deregister();\n\n}<\/pre>\n","protected":false},"author":28,"comment_status":"closed","ping_status":"closed","template":"","format":"standard","meta":{"footnotes":""},"class_list":["post-8178","ht_kb","type-ht_kb","status-publish","format-standard","hentry","ht_kb_category-persistence-service"],"_links":{"self":[{"href":"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/wp-json\/wp\/v2\/ht_kb\/8178","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/wp-json\/wp\/v2\/ht_kb"}],"about":[{"href":"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/wp-json\/wp\/v2\/types\/ht_kb"}],"author":[{"embeddable":true,"href":"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/wp-json\/wp\/v2\/users\/28"}],"replies":[{"embeddable":true,"href":"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/wp-json\/wp\/v2\/comments?post=8178"}],"version-history":[{"count":20,"href":"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/wp-json\/wp\/v2\/ht_kb\/8178\/revisions"}],"predecessor-version":[{"id":29757,"href":"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/wp-json\/wp\/v2\/ht_kb\/8178\/revisions\/29757"}],"wp:attachment":[{"href":"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/wp-json\/wp\/v2\/media?parent=8178"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}