Programmēšana

Sāciet darbu ar hibernāciju

Ir labi saprast objektu / relāciju kartēšanas (ORM) nepieciešamību Java lietojumprogrammās, taču jūs, iespējams, ļoti vēlaties redzēt hibernāciju darbībā. Mēs sāksim ar vienkāršu piemēru, kas parāda daļu no tā spēka.

Kā jūs droši vien zināt, programmēšanas grāmatas iesākums ir “Hello World” piemērs. Šajā nodaļā mēs ievērojam šo tradīciju, ieviešot hibernāciju ar salīdzinoši vienkāršu programmu “Sveika pasaule”. Tomēr, lai patiešām demonstrētu hibernācijas režīmu, nepietiek ar vienkāršu ziņojuma izdrukāšanu konsoles logā. Tā vietā mūsu programma glabās jaunizveidotos objektus datu bāzē, atjauninās tos un veiks vaicājumus, lai tos izgūtu no datu bāzes.

Papildus kanoniskajam "Hello World" piemēram, mēs iepazīstinām ar galvenajiem hibernācijas API un sniedzam informāciju par pamata konfigurāciju.

"Sveika pasaule" ar hibernātu

Hibernācijas lietojumprogrammas definē pastāvīgās klases, kas ir "piesaistītas" datu bāzes tabulām. Mūsu piemērs "Sveika pasaule" sastāv no vienas klases un viena kartēšanas faila. Apskatīsim, kā izskatās vienkārša pastāvīgā klase, kā tiek norādīta kartēšana un dažas lietas, ko mēs varam darīt ar pastāvīgās klases gadījumiem, izmantojot hibernāciju.

Mūsu parauga lietojumprogrammas mērķis ir saglabāt ziņojumus datu bāzē un iegūt tos rādīšanai. Lietojumprogrammai ir vienkārša noturīga klase, Ziņojums, kas apzīmē šos izdrukājamos ziņojumus. Mūsu Ziņojums klase ir parādīta 1. sarakstā.

Saraksts 1. Message.java: vienkārša neatlaidīga klase

paka sveiki; public class Ziņojums {private Long id; privāts virknes teksts; privāts ziņojums nextMessage; privāts ziņojums () {} publiskais ziņojums (virknes teksts) {this.text = text; } public Long getId () {return ID; } private void setId (Long id) {this.id = id; } public String getText () {return text; } public void setText (String text) {this.text = text; } public message getNextMessage () {return nextMessage; } public void setNextMessage (Ziņojums nextMessage) {this.nextMessage = nextMessage; }} 

Mūsu Ziņojums klasei ir trīs atribūti: identifikatora atribūts, ziņojuma teksts un atsauce uz citu Ziņojums. Identifier atribūts ļauj lietojumprogrammai piekļūt pastāvīga objekta datu bāzes identitātei - primārās atslēgas vērtībai. Ja divi gadījumi Ziņojums ir tāda pati identifikatora vērtība, tie datu bāzē apzīmē to pašu rindu. Mēs esam izvēlējušies Garš mūsu identifikatora atribūta tipam, taču tā nav prasība. Hibernācija ļauj praktiski jebko izmantot identifikatora tipam, kā redzēsit vēlāk.

Jūs, iespējams, pamanījāt, ka visi Ziņojums klasei ir JavaBean stila īpašuma piekļuves metodes. Klasei ir arī konstruktors bez parametriem. Neatlaidīgās klases, kuras mēs izmantojam savos piemēros, gandrīz vienmēr izskatīsies apmēram šādi.

Instancēs Ziņojums klasi var pārzināt (padarīt noturīgu) Hibernate, bet viņi to nedara ir būt. Kopš Ziņojums objekts neievieš nevienu hibernācijas režīmu vai saskarni, mēs varam to izmantot tāpat kā jebkuru citu Java klasi:

Ziņojuma ziņojums = new Message ("Sveika pasaule"); System.out.println (message.getText ()); 

Šis koda fragments dara tieši to, ko mēs esam gaidījuši no "Hello World" lietojumprogrammām: tas izdrukā "Sveika pasaule" uz konsoli. Varētu šķist, ka mēs šeit cenšamies būt mīļi; Patiesībā mēs demonstrējam svarīgu iezīmi, kas atšķir hibernāciju no dažiem citiem noturības risinājumiem, piemēram, EJB (Enterprise JavaBean) entītijas pupiņām. Mūsu pastāvīgo klasi var izmantot jebkurā izpildes kontekstā - īpašs konteiners nav vajadzīgs. Protams, jūs ieradāties šeit, lai redzētu pašu hibernāciju, tāpēc saglabāsim jaunu Ziņojums uz datu bāzi:

Sesijas sesija = getSessionFactory (). OpenSession (); Transaction tx = session.beginTransaction (); Ziņojuma ziņojums = new Message ("Sveika pasaule"); session.save (ziņojums); tx.commit (); session.close (); 

Šis kods izsauc hibernātu Sesija un Darījums saskarnes. (Pie tā tiksim getSessionFactory () zvaniet drīz.) Tā rezultātā tiek izpildīts kaut kas līdzīgs šim SQL:

ievietot MESSAGES (MESSAGE_ID, MESSAGE_TEXT, NEXT_MESSAGE_ID) vērtībās (1, “Hello World”, null) 

Turies - MESSAGE_ID kolonna tiek inicializēta dīvainā vērtībā. Mēs nenosakām id īpašums ziņu jebkur, tāpēc mēs sagaidām, ka tā būs nulle, pa labi? Patiesībā id īpašums ir īpašs: tas ir identifikatora rekvizīts- tai ir ģenerēta unikāla vērtība. (Mēs vēlāk apspriedīsim, kā vērtība tiek ģenerēta.) Vērtība tiek piešķirta Ziņojums kad Hibernate kad saglabāt () tiek saukts.

Šajā piemērā mēs pieņemam, ka ZIŅOJUMI tabula jau pastāv. Protams, mēs vēlamies, lai mūsu "Hello World" programma drukātu ziņojumu konsolē. Tagad, kad mums ir ziņojums datu bāzē, mēs esam gatavi to demonstrēt. Nākamais piemērs izgūst visus ziņojumus no datu bāzes alfabētiskā secībā un izdrukā tos:

Sesija newSession = getSessionFactory (). OpenSession (); Darījums newTransaction = newSession.beginTransaction (); Sarakstu ziņojumi = newSession.find ("no Message kā m secībā pēc m.text asc"); System.out.println (messages.size () + "atrasts (-i) ziņojums (-i):"); for (Iterator iter = messages.iterator (); iter.hasNext ();) {Ziņojuma ziņojums = (Ziņojums) iter.next (); System.out.println (message.getText ()); } newTransaction.commit (); newSession.close (); 

Burtiskā virkne "from Message as m order by m.text asc" ir hibernācijas vaicājums, kas izteikts paša hibernāta objektorientētajā hibernāta vaicājumu valodā (HQL). Šis vaicājums tiek iekšēji tulkots šādā SQL, kad atrast () tiek saukts:

atlasiet m.MESSAGE_ID, m.MESSAGE_TEXT, m.NEXT_MESSAGE_ID no MESSAGES m secībā pēc m.MESSAGE_TEXT asc 

Koda fragments tiek izdrukāts:

Atrasti 1 ziņojumi: Hello World 

Ja jūs nekad iepriekš neesat izmantojis tādu ORM rīku kā Hibernate, jūs droši vien gaidījāt redzēt SQL priekšrakstus kaut kur kodā vai metadatos. Viņu tur nav. Visa SQL tiek ģenerēta izpildlaikā (faktiski startējot, visiem atkārtoti lietojamiem SQL priekšrakstiem).

Lai ļautu šai burvībai notikt, hibernātam nepieciešama plašāka informācija par to, kā Ziņojums klasei vajadzētu būt noturīgai. Šī informācija parasti tiek sniegta XML kartēšanas dokuments. Kartēšanas dokumentā cita starpā ir noteikts, kā Ziņojums klases karte ZIŅOJUMI tabula. Apskatīsim kartēšanas dokumentu 2. sarakstā.

Saraksts 2. Vienkārša hibernācijas XML kartēšana

Kartēšanas dokumentā Hibernatei teikts, ka Ziņojums klase ir jāatstāj ZIŅOJUMI tabulu, ka rekvizīts identifikators tiek attēlots kolonnā ar nosaukumu MESSAGE_ID, ka teksta rekvizīts tiek attēlots kolonnā ar nosaukumu MESSAGE_TEXT, un ka īpašums nosaukts nākamaisZiņojums ir asociācija ar daudzu pret vienu daudzveidība kas atbilst kolonnai ar nosaukumu NEXT_MESSAGE_ID. (Pagaidām neuztraucieties par citām detaļām.)

Kā redzat, XML dokumentu nav grūti saprast. Jūs to varat viegli rakstīt un uzturēt ar rokām. Neatkarīgi no izvēlētās metodes, hibernācijas režīmā ir pietiekami daudz informācijas, lai pilnībā izveidotu visus SQL priekšrakstus, kas būtu nepieciešami, lai ievietotu, atjauninātu, dzēstu un izgūtu Ziņojums klasē. Jums vairs nav jāraksta šie SQL priekšraksti ar roku.

Piezīme
Daudzi Java izstrādātāji ir sūdzējušies par "metadatu elli", kas pavada J2EE attīstību. Daži ir ieteikuši pāriet no XML metadatiem atpakaļ uz vienkāršu Java kodu. Lai gan mēs atzinīgi vērtējam šo ieteikumu dažu problēmu gadījumā, ORM ir gadījums, kad uz tekstu balstīti metadati patiešām ir nepieciešami. Hibernācijas režīmā ir saprātīgi noklusējumi, kas samazina drukāšanu, un dokumenta veida definīcija, kuru var izmantot automātiskai aizpildīšanai vai validēšanai redaktoros. Jūs pat varat automātiski ģenerēt metadatus, izmantojot dažādus rīkus.

Tagad mainīsim savu pirmo ziņojumu un, kamēr esam pie tā, izveidosim jaunu ziņojumu, kas saistīts ar pirmo, kā parādīts 3. sarakstā.

Saraksts 3. Ziņojuma atjaunināšana

Sesijas sesija = getSessionFactory (). OpenSession (); Transaction tx = session.beginTransaction (); // 1 ir pirmā ziņojuma ģenerētais ID Message message = (Ziņojums) session.load (Message.class, new Long (1)); message.setText ("Apsveikums zemes iedzīvotājs"); Ziņojums nextMessage = jauns ziņojums ("Aizved mani pie sava vadītāja (lūdzu)"); message.setNextMessage (nextMessage); tx.commit (); session.close (); 

Šis kods vienā darījumā izsauc trīs SQL priekšrakstus:

atlasiet m.MESSAGE_ID, m.MESSAGE_TEXT, m.NEXT_MESSAGE_ID no MESSAGES m, kur m.MESSAGE_ID = 1 ievietot MESSAGES (MESSAGE_ID, MESSAGE_TEXT, NEXT_MESSAGE_ID) vērtībās (2, 'Aizvest mani pie sava vadītāja (lūdzu)', nulles) atjaunināt MESSAGES iestatīt MESSAGE_TEXT = 'Sveicieni, kas ir zemiski', NEXT_MESSAGE_ID = 2 kur MESSAGE_ID = 1 

Ievērojiet, kā hibernāts atklāja modifikāciju tekstu un nākamaisZiņojums pirmā ziņojuma īpašības un automātiski atjaunina datu bāzi. Mēs esam izmantojuši hibernācijas funkcijas priekšrocības automātiska netīras pārbaudes: šī funkcija ļauj mums nepārprotami lūgt hibernāciju atjaunināt datu bāzi, kad mēs mainām objekta stāvokli darījuma ietvaros. Tāpat jūs varat redzēt, ka jaunais ziņojums tika padarīts nemainīgs, kad tika izveidota atsauce no pirmā ziņojuma. Šo funkciju sauc kaskādes saglabāšana: tas ietaupa mums centienus nepārprotami padarīt jauno objektu neatlaidīgu, zvanot saglabāt (), ja vien to var sasniegt jau pastāvīga instance. Ievērojiet arī to, ka SQL priekšrakstu secība nav tāda pati kā secība, kādā mēs iestatām rekvizītu vērtības. Hibernate izmanto sarežģītu algoritmu, lai noteiktu efektīvu pasūtīšanu, kas ļauj izvairīties no datubāzes svešās atslēgas ierobežojuma pārkāpumiem, bet joprojām ir pietiekami paredzama lietotājam. Šo funkciju sauc darījumu norakstīšana.

Ja mēs vēlreiz palaistu "Hello World", tas izdrukā:

Atrasti 2 ziņojumi: Sveicieni, zemnieki, aizved mani pie sava vadītāja (lūdzu) 

Tas ir tik tālu, cik mēs ņemsim lietot "Hello World". Tagad, kad mums beidzot ir kāds kods zem jostas, mēs spersim soli atpakaļ un sniegsim pārskatu par Hibernate galvenajām API.

Izpratne par arhitektūru

Programmēšanas saskarnes ir pirmā lieta, kas jums jāzina par hibernācijas režīmu, lai to izmantotu lietojumprogrammas noturības slānī. Galvenais API dizaina mērķis ir saglabāt programmatūras komponentu saskarnes pēc iespējas šaurākas. Tomēr praksē ORM API nav īpaši maza. Tomēr neuztraucieties; jums nav jāsaprot visas hibernācijas saskarnes vienlaikus. Zemāk redzamais attēls parāda vissvarīgāko hibernācijas saskarņu lomu uzņēmējdarbības un noturības slāņos.

Mēs parādām biznesa slāni virs noturības slāņa, jo biznesa slānis tradicionāli slāņainā lietojumprogrammā darbojas kā noturības slāņa klients. Ņemiet vērā, ka dažas vienkāršas lietojumprogrammas, iespējams, nenodala biznesa loģiku no pastāvības loģikas; tas ir labi - tas tikai vienkāršo diagrammu.

Attēlā parādītās hibernācijas saskarnes var aptuveni klasificēt šādi:

  • Saskarnes, ko lietojumprogrammas izsauc, lai veiktu pamata CRUD (izveidošana / lasīšana / atjaunināšana / dzēšana) un vaicājumu darbības. Šīs saskarnes ir galvenais lietojumprogrammu biznesa / vadības loģikas atkarības punkts no hibernācijas režīma. Tie ietver Sesija, Darījums, un Vaicājums.
  • Saskarnes, ko izsauc lietojumprogrammas infrastruktūras kods, lai konfigurētu hibernācijas režīmu, pats galvenais, Konfigurācija klasē.
  • Atzvani saskarnes, kas ļauj lietojumprogrammai reaģēt uz notikumiem, kas notiek hibernācijas režīmā, piemēram, Pārtvērējs, Dzīves cikls, un Apstiprināms.
  • Saskarnes, kas ļauj paplašināt hibernācijas jaudīgo kartēšanas funkcionalitāti, piemēram, UserType, CompositeUserType, un IdentifierGenerator. Šīs saskarnes tiek ieviestas, izmantojot lietojumprogrammas infrastruktūras kodu (ja nepieciešams).

Hibernate izmanto esošās Java API, tostarp JDBC (Java Database Connectivity), Java Transaction API (JTA) un Java Naming and Directory Interface (JNDI). JDBC nodrošina elementāru funkcionalitātes abstrakcijas līmeni, kas kopīgs relāciju datu bāzēm, ļaujot hibernācijai atbalstīt gandrīz jebkuru datu bāzi ar JDBC draiveri. JNDI un JTA ļauj hibernācijas režīmu integrēt J2EE lietojumprogrammu serveros.

Šajā sadaļā mēs neaptveram detalizētu hibernācijas API metožu semantiku, tikai katras primārās saskarnes lomu. Lielāko daļu šo saskarņu varat atrast iepakojumā net.sf.abernate. Apskatīsim katru saskarni pēc kārtas.

Galvenās saskarnes

Piecas galvenās saskarnes tiek izmantotas gandrīz katrā hibernācijas lietojumprogrammā. Izmantojot šīs saskarnes, varat saglabāt un izgūt pastāvīgus objektus un kontrolēt darījumus.

Sesijas saskarne

$config[zx-auto] not found$config[zx-overlay] not found