Java >> Java tutorial >  >> Java

Kom godt i gang med JDO

Lær, hvad transparent persistens handler om, og hvad det betyder, når en Java-klasse er persistens-kapabel. I dette kapitel fra Core Java Data Objects , vil du se, hvordan du opretter, læser, opdaterer og sletter vedvarende objekter, og udforsker, hvordan JDO understøtter den fulde Java-objektmodel:grundlæggende typer, referencer, samlingsklasser og arv.

"Eksperten til hvad som helst var engang en begynder."

Hayes

Bruger JDO at bygge et program, der opretter, læser, opdaterer og sletter vedvarende forekomster af Java-klasser, er nemt og kræver kun en vis grundlæggende viden om, hvordan JDO virker og hvordan man bruger det. Bevæbnet med denne viden kan du udvikle din første JDO applikation og vedvarende forekomster af Java-klasser gennemsigtigt i et datalager. Dette kapitel er en guide til at komme i gang med JDO , hvilket giver en forståelse af, hvordan JDO virker og hvordan man bruger de grundlæggende API'er, og udforsker nogle af de mere avancerede koncepter relateret til brug af JDO .

Dette kapitel dækker disse emner:

  • Hvordan JDO er i stand til gennemsigtigt at fortsætte forekomster af Java-klasser.

  • Den grundlæggende JDO grænseflader og hvordan de hænger sammen.

  • Sådan defineres en Java-klasse, der kan bruges med en JDO implementering.

  • Sådan opretter du forbindelse til et datalager.

  • Hvordan man opretter, læser, opdaterer og sletter vedvarende objekter.

  • Typerne af felter, systemklasser, samlingsklasser og arv understøttet af JDO .

  • Sådan håndterer du undtagelser i en applikation.

  • Begrebet objektidentitet.

  • De forskellige typer identitet, der kan bruges.

  • Hvordan samtidighedskontrol håndhæves mellem flere applikationer.

Eksemplerne til dette kapitel kan downloades fra internettet på www.corejdo.com og findes i com.corejdo.examples.chapter3 pakke. I mange tilfælde er de viste kodestykker forenklede versioner af de faktiske klasser, så eksemplerne kun fokuserer på de relevante begreber.

3.1 Hvordan virker JDO Arbejde?

Målet med JDO er at tillade en Java-applikation transparent at gemme forekomster af enhver brugerdefineret Java-klasse i et datalager og hente dem igen med så få begrænsninger som muligt. Denne bog henviser til de tilfælde, der JDO gemmer og henter som vedvarende objekter. Fra et applikationsperspektiv fremstår disse vedvarende objekter som almindelige Java-objekter i hukommelsen. Men felterne for disse forekomster gemmes faktisk konstant i et underliggende datalageralt sammen uden nogen eksplicit handling på vegne af applikationen.

JDO har intet at gøre med, hvor metoder udføres; det giver ikke et middel til fjernmetodekald à la RMI og EJB , og det gemmer og udfører heller ikke metoder i nogle datalager. JDO specificerer blot, hvordan felterne i et persistent objekt skal administreres i hukommelsen, idet de på en transparent måde gemmes til og hentes fra et underliggende datalager. Med JDO , fremkaldes metoder på et vedvarende objekt af en applikation i henhold til ethvert almindeligt Java-objekt i hukommelsen. Figur 3-1 giver et skematisk billede af, hvordan JDO virker.

Figur 3-1. JDO runtime miljø.




JDO implementering og applikation kører sammen i samme JVM. Ansøgningen delegerer til JDO implementering for at hente felterne af vedvarende objekter efter behov. JDO implementering sporer ændringer af felterne og skriver disse ændringer tilbage til datalageret ved afslutningen af ​​transaktionen. JDO implementering er ansvarlig for at kortlægge felterne for de vedvarende objekter til og fra hukommelsen og det underliggende datalager.

JDO opnår gennemsigtighed i adgangen ved at definere en kontrakt, som en klasse skal overholde. Enhver klasse, der implementerer denne kontrakt, kan derefter bruges med enhver JDO implementering. JDO kræver, at en JDO implementering sikre, at enhver klasse, der overholder JDO vedholdenhed-kapabel kontrakt kan bruges med enhver JDO implementering uden genkompilering.

Evnen til at køre en JDO applikation med en hvilken som helst JDO implementering er beslægtet med at bruge JDBC , en JDBC applikationen kan køres "som den er" ved hjælp af JDBC drivere fra forskellige leverandører og endda ved hjælp af forskellige relationelle databaser. Faktisk JDO er noget bedre end dette, fordi med JDBC et program er stadig udsat for forskelle i SQL support på tværs af forskellige databaser. Med JDO , SQL er ikke direkte eksponeret. Selvom en JDO runtime kan selv bruge JDBC at få adgang til en relationsdatabase som dens datalager, er det JDOs ansvar implementering for at løse forskellene i SQL understøttelse på tværs af databaser.

Endnu bedre, i modsætning til SQL , en JDO applikationen kan fungere "som den er" på tværs af forskellige typer databaser, ikke kun relationelle:objektdatabaser, flade filer og så videre. Alt, der kræves, er en JDO implementering, der understøtter datalageret.

JDO specifikation definerer den persistence-kompatible kontrakt som en Java-grænseflade, kaldet PersistenceCapable , og en programmeringsstil, som klasseimplementeringen skal følge. En klasse, der overholder denne kontrakt, omtales som værende "vedholdenhedsdygtig."

En klasse siges at være persistens-kapabel, hvis dens forekomster kan lagres i et datalager af en JDO implementering. Men bare fordi en klasse er persistent-stand, betyder det ikke, at alle dens forekomster skal være persistente; det betyder bare, at muligheden er der. Hvorvidt en bestemt instans er vedvarende afhænger af applikationen. Det ligner Java-serialisering. Bare fordi en klasse implementerer Serialiserbar grænseflade betyder ikke, at alle dens forekomster skal serialiseres.

Men hensigten med JDO er ikke at forvente, at udvikleren bekymrer sig om at gøre en klasse persistens-stand; det er et kedeligt arbejde, der skal overlades til værktøj.

Du kan oprette en vedholdenheds-kapabel klasse på tre hovedmåder:

  • Kildekodegenerering :Med denne metode genereres kildekoden for en klasse fra bunden. Denne tilgang fungerer godt, hvis objektmodellen er defineret i et modelleringsværktøj og genereres automatisk, eller datalagerskemaet allerede eksisterer, og objektmodellen kan genereres ud fra det. Værktøjer leveret af JDO implementering vil blive brugt til at generere kildekode, der overholder den vedholdende kontrakt. Ulempen ved denne tilgang er, at den ikke virker for eksisterende klasser og ikke appellerer til dem, der kan lide at skrive deres egen kode.

  • Kildekodeforbehandling :Med denne metode forbehandles og opdateres eksisterende kildekode. Denne tilgang fungerer godt, hvis kildekoden til en klasse er tilgængelig. Værktøjer leveret af JDO implementering ville blive brugt til at læse den originale kildekode og opdatere den, så den overholder den vedholdende kontrakt. Ulempen ved denne tilgang er, at den ikke virker, medmindre den originale kildekode er tilgængelig, men den har den fordel, at en udvikler kan skrive sin egen kildekode. Typisk er forbehandlingen et prækompileringstrin i byggeprocessen, og den genererede kode kan opbevares for at hjælpe med fejlfinding.

  • Forbedring af bytekode :Med denne metode forbedres den kompilerede Java-bytekode for en klasse direkte. Denne tilgang fungerer godt, selvom kildekoden ikke er tilgængelig. Værktøjer leveret af JDO implementering ville blive brugt til at læse en klassefil og indsætte yderligere bytekode direkte for at få klassen til at overholde den persistens-kompatible kontrakt. Denne tilgang har den fordel, at den er fuldstændig gennemsigtig for udvikleren, og forbedringen er simpelthen et efterkompileringstrin i byggeprocessen. Selvom JDO specifikationen kræver, at en forbedret klasse stadig fungerer korrekt, når den fejlsøges mod den originale kildekode, nogle udviklere kan være mistroiske, hvis de ikke kan se den faktiske kode for det, der er blevet ændret (selvom de selvfølgelig altid kunne dekompilere den forbedrede klassefil bagefter).

Bytekodeforbedring er den tilgang, der bruges af JDO referenceimplementering tilgængelig fra SUN Microsystems, og forbedringsværktøjet er tilgængeligt for enhver udvikler at bruge. Nogle JDO implementeringer kan også give deres egne forbedringsværktøjer. Figur 3-2 giver et skematisk billede af, hvordan bytekodeforbedringsprocessen fungerer.

Figur 3-2. Bytekodeforbedringsprocessen.




Java-klasserne kompileres ved hjælp af en Java-kompiler til at generere klassefiler. Bytekodeforbedringsværktøjet læser klassefilerne sammen med JDO metadata for klasserne (disse metadata er forklaret i afsnit 3.3.1) og enten opdaterer de eksisterende klassefiler eller opretter nye. De "forbedrede" klassefiler indlæses derefter af en JVM sammen med JDO implementering og anvendelse. Applikationen kan derefter bruge JDO at gemme forekomster af de persistens-kompatible klasser i datalageret.


Java tag