JPA - komponenty ORM

Większość współczesnych aplikacji używa relacyjnych baz danych do przechowywania danych. Ostatnio wielu dostawców przeszło na obiektową bazę danych, aby zmniejszyć obciążenie związane z utrzymaniem danych. Oznacza to, że obiektowe bazy danych lub technologie obiektowo-relacyjne zajmują się przechowywaniem, pobieraniem, aktualizacją i konserwacją. Podstawową częścią technologii relacyjnych obiektów jest mapowanie pliku orm.xml. Ponieważ XML nie wymaga kompilacji, możemy łatwo wprowadzać zmiany w wielu źródłach danych przy mniejszym administrowaniu.

Mapowanie obiektowo-relacyjne

Mapowanie obiektowo-relacyjne (ORM) w skrócie opisuje, czym jest ORM i jak to działa. ORM to umiejętność programowania do ukrywania danych z typu obiektowego na relacyjny i odwrotnie.

Główną cechą ORM jest mapowanie lub wiązanie obiektu z jego danymi w bazie danych. Podczas mapowania musimy wziąć pod uwagę dane, typ danych i ich relacje z własną jednostką lub encją w dowolnej innej tabeli.

Zaawansowane funkcje

  • Idiomatic persistence : Umożliwia pisanie klas trwałości przy użyciu klas obiektowych.

  • High Performance : Ma wiele technik pobierania i obiecujących technik blokowania.

  • Reliable: Jest bardzo stabilny i wybitny. Używany przez wielu programistów przemysłowych.

Architektura ORM

Tutaj postępuj zgodnie z architekturą ORM.

Powyższa architektura wyjaśnia, w jaki sposób dane obiektowe są przechowywane w relacyjnej bazie danych w trzech fazach.

Faza 1

Pierwsza faza, nazwana jako Object datafaza zawiera klasy POJO, interfejsy usług i klasy. Jest to główna warstwa komponentów biznesowych, która zawiera operacje i atrybuty logiki biznesowej.

Na przykład weźmy bazę danych pracowników jako schemat

  • Klasa POJO pracownika zawiera atrybuty, takie jak identyfikator, imię i nazwisko, wynagrodzenie i stanowisko. Oraz metody takie jak setter i getter metody tych atrybutów.

  • Klasy DAO / Service dla pracowników zawierają metody obsługi, takie jak tworzenie pracownika, znajdowanie pracownika i usuwanie pracownika.

Faza 2

Druga faza nazwana jako mapping lub persistence faza, która zawiera dostawcę JPA, plik mapowania (ORM.xml), moduł ładujący JPA i siatkę obiektów.

  • JPA Provider: Produkt dostawcy, który zawiera smak JPA (javax.persistence). Na przykład Eclipselink, Toplink, Hibernate itp.

  • Mapping file : Plik odwzorowania (ORM.xml) zawiera konfigurację odwzorowania między danymi w klasie POJO a danymi w relacyjnej bazie danych.

  • JPA Loader: Moduł ładujący JPA działa jak pamięć podręczna, która może ładować dane siatki relacyjnej. Działa jak kopia bazy danych do interakcji z klasami usług dla danych POJO (atrybuty klasy POJO).

  • Object Grid: Siatka obiektów jest tymczasową lokalizacją, w której można przechowywać kopię danych relacyjnych, np. Pamięć podręczną. Wszystkie zapytania do bazy danych najpierw dotyczą danych w siatce obiektów. Dopiero po zatwierdzeniu wpływa na główną bazę danych.

Faza 3

Trzecia faza to faza danych relacyjnych. Zawiera dane relacyjne, które są logicznie połączone z komponentem biznesowym. Jak wspomniano powyżej, tylko wtedy, gdy komponent biznesowy zatwierdza dane, są one fizycznie przechowywane w bazie danych. Do tego czasu zmodyfikowane dane są przechowywane w pamięci podręcznej w formacie siatki. To samo dotyczy pozyskiwania danych.

Mechanizm programowego współdziałania powyższych trzech faz nazywany jest mapowaniem relacyjno-obiektowym.

Mapping.xml

Plik mapping.xml ma za zadanie poinstruować dostawcę JPA o mapowaniu klas Entity z tabelami bazy danych.

Weźmy na przykład podmiot Pracownik, który zawiera cztery atrybuty. Klasa POJO jednostki Pracownik o nazwieEmployee.java następująco:

public class Employee {

   private int eid;
   private String ename;
   private double salary;
   private String deg;

   public Employee(int eid, String ename, double salary, String deg) {
      super( );
      this.eid = eid;
      this.ename = ename;
      this.salary = salary;
      this.deg = deg;
   }

   public Employee( ) {
      super();
   }

   public int getEid( ) {
      return eid;
   }
   
   public void setEid(int eid) {
      this.eid = eid;
   }
   
   public String getEname( ) {
      return ename;
   }
   
   public void setEname(String ename) {
      this.ename = ename;
   }

   public double getSalary( ) {
      return salary;
   }
   
   public void setSalary(double salary) {
      this.salary = salary;
   }

   public String getDeg( ) {
      return deg;
   }
   
   public void setDeg(String deg) {
      this.deg = deg;
   }
}

Powyższy kod to klasa POJO podmiotu pracowniczego. Zawiera cztery atrybuty: eid, ename, pensja i deg. Weź pod uwagę, że te atrybuty to pola tabeli w bazie danych, a eid to klucz podstawowy tej tabeli. Teraz musimy zaprojektować dla niego plik mapowania hibernacji. Plik odwzorowania o nazwiemapping.xml następująco:

<? xml version="1.0" encoding="UTF-8" ?>

<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm    
   http://java.sun.com/xml/ns/persistence/orm_1_0.xsd"
   version="1.0">
      
   <description> XML Mapping file</description>
      
   <entity class="Employee">        
      <table name="EMPLOYEETABLE"/>
      <attributes>
      
         <id name="eid">
            <generated-value strategy="TABLE"/>
         </id>

         <basic name="ename">
            <column name="EMP_NAME" length="100"/>
         </basic>
         
         <basic name="salary">
         </basic>
         
         <basic name="deg">
         </basic>
         
      </attributes>
   </entity>
   
</entity-mappings>

Powyższy skrypt służący do mapowania klasy encji z tabelą bazy danych. W tym pliku

  • <entity-mappings> : tag definiuje definicję schematu, aby umożliwić umieszczanie znaczników encji w pliku xml.

  • <description> : tag definiuje opis aplikacji.

  • <entity>: tag definiuje klasę jednostki, którą chcesz przekonwertować na tabelę w bazie danych. Klasa atrybutu definiuje nazwę klasy jednostki POJO.

  • <table>: tag definiuje nazwę tabeli. Jeśli chcesz zachować nazwę klasy jako nazwę tabeli, ten znacznik nie jest potrzebny.

  • <attributes> : znacznik definiuje atrybuty (pola w tabeli).

  • <id>: tag definiuje klucz podstawowy tabeli. Plik<generated-value> tag określa, jak przypisać wartość klucza podstawowego, taką jak Automatyczny, Ręczny lub pobrany z Sekwencji.

  • <basic> : tag służy do definiowania pozostałych atrybutów tabeli.

  • <column-name> : tag służy do definiowania nazwy pola tabeli zdefiniowanej przez użytkownika.

Adnotacje

Zwykle pliki Xml są używane do konfigurowania określonego składnika lub mapowania dwóch różnych specyfikacji składników. W naszym przypadku musimy osobno utrzymywać xml we frameworku. Oznacza to, że pisząc plik xml mapowania musimy porównać atrybuty klasy POJO z tagami encji w pliku mapping.xml.

Oto rozwiązanie: w definicji klasy możemy zapisać część konfiguracyjną za pomocą adnotacji. Adnotacje są używane dla klas, właściwości i metod. Adnotacje zaczynają się od symbolu „@”. Adnotacje są deklarowane przed zadeklarowaniem klasy, właściwości lub metody. Wszystkie adnotacje JPA są zdefiniowane w pakiecie javax.persistence.

Poniżej znajduje się lista adnotacji użytych w naszych przykładach

Adnotacja Opis
@Jednostka Ta adnotacja określa, aby zadeklarować klasę jako jednostkę lub tabelę.
@Stół Ta adnotacja określa, aby zadeklarować nazwę tabeli.
@Podstawowy Ta adnotacja jawnie określa pola bez ograniczeń.
@Embedded Ta adnotacja określa właściwości klasy lub jednostki, której wystąpienie wartości klasy osadzalnej.
@ID Ta adnotacja określa właściwość, która służy do identyfikacji (klucz podstawowy tabeli) klasy.
@GeneratedValue Ta adnotacja określa, w jaki sposób można zainicjować atrybut tożsamości, na przykład automatycznie, ręcznie lub wartość pobrana z tabeli sekwencji.
@Przejściowy Ta adnotacja określa właściwość, która nie jest trwała, tj. Wartość nigdy nie jest przechowywana w bazie danych.
@Kolumna Ta adnotacja służy do określania kolumny lub atrybutu właściwości trwałości.
@SequenceGenerator Ta adnotacja służy do definiowania wartości właściwości określonej w adnotacji @GeneratedValue. Tworzy sekwencję.
@TableGenerator Ta adnotacja służy do określania generatora wartości dla właściwości określonej w adnotacji @GeneratedValue. Tworzy tabelę do generowania wartości.
@Typ dostępu Ten typ adnotacji służy do ustawiania typu dostępu. Jeśli ustawisz @AccessType (FIELD), nastąpi dostęp do mądrego pola. Jeśli ustawisz @AccessType (PROPERTY), nastąpi ocena według właściwości.
@JoinColumn Ta adnotacja służy do określenia powiązania jednostek lub kolekcji jednostek. Jest to używane w asocjacjach typu „wiele do jednego” i „jeden do wielu”.
@UniqueConstraint Ta adnotacja służy do określenia pola, unikatowego ograniczenia dla tabeli głównej lub dodatkowej.
@ColumnResult Ta adnotacja odwołuje się do nazwy kolumny w zapytaniu SQL za pomocą klauzuli select.
@ManyToMany Ta adnotacja służy do definiowania relacji wiele do wielu między tabelami łączenia.
@ManyToOne Ta adnotacja służy do definiowania relacji wiele do jednego między tabelami łączenia.
@Jeden za dużo Ta adnotacja służy do definiowania relacji jeden do wielu między tabelami łączenia.
@Jeden na jednego Ta adnotacja służy do definiowania relacji jeden do jednego między tabelami łączenia.
@NamedQueries Ta adnotacja służy do określania listy nazwanych zapytań.
@NamedQuery Ta adnotacja służy do określania zapytania przy użyciu nazwy statycznej.

Java Bean Standard

Klasa Java hermetyzuje wartości i zachowania instancji w pojedynczym wywołanym obiekcie. Java Bean jest składnikiem lub obiektem do tymczasowego przechowywania i wielokrotnego użytku. Jest to klasa możliwa do serializacji, która ma domyślny konstruktor oraz metody pobierające i ustawiające do indywidualnego inicjowania atrybutów instancji.

Konwencje fasoli

  • Bean zawiera domyślny konstruktor lub plik zawierający zserializowane wystąpienie. Dlatego fasola może utworzyć instancję fasoli.

  • Właściwości fasoli można podzielić na właściwości boolowskie i inne niż boolowskie.

  • Właściwość niebędąca wartością logiczną zawiera getter i setter metody.

  • Właściwość logiczna zawiera setter i is metoda.

  • Gettermetoda dowolnej właściwości powinna zaczynać się od małej litery „get” (konwencja metody w języku Java) i być kontynuowana z nazwą pola zaczynającą się od dużej litery. Np. Nazwa pola to „wynagrodzenie”, dlatego metoda pobierania tego pola to „getSalary ()”.

  • Settermetoda dowolnej właściwości powinna zaczynać się od małej litery „zestaw” (konwencja metody java), kontynuowanej nazwą pola zaczynającą się od dużej litery i wartością argumentu do ustawienia na pole. Np. Nazwa pola to „wynagrodzenie”, dlatego metoda ustawiająca to pole to „setSalary (double sal)”.

  • Dla właściwości Boolean jest to metoda sprawdzająca, czy jest prawdziwa, czy fałszywa. Np. Właściwość logiczna „pusta”, metoda is tego pola to „isEmpty ()”.