Pohranjeni postupci s hibernacijom
1. Pregled
Pohranjene procedure su skupovi prevedenih SQL izraza koji borave u bazi podataka. Koriste se za inkapsuliranje i dijeljenje logike s drugim programima, a imaju koristi od značajki specifičnih za bazu podataka, poput savjeta za indeks ili određenih ključnih riječi.
Ovaj članak pokazuje kako se koristi Hibernate nazvati a pohranjeni postupak u MySQL baza podataka.
2. Pohranjene procedure u MySQL-u
Prije nego što razgovaramo o tome kako nazvati pohranjenu proceduru iz hibernacije, moramo je stvoriti.
Za ovaj brzi MySQL primjer stvorit ćemo pohranjenu proceduru za dobivanje svih zapisa iz a foo stol.
Da bismo stvorili pohranjenu proceduru, koristimo IZRADI POSTUPAK izjava:
DELIMITER // STVORI POSTUPAK GetAllFoos () JEZIK SQL DETERMINISTIČKI DEFINER SIGURNOSTI SQL POČNI ODABRATI * IZ foo; KRAJ // DELIMITER;
Prije POČETI Izjava, možemo definirati neobavezne izjave Pojedinosti ovih izjava možete detaljno proučiti slijedeći službenu vezu s dokumentacijom MySQL.
Možemo koristiti POZIV izjava kako bismo bili sigurni da se naš postupak ponaša na željeni način:
POZOVITE GetAllFoos ();
Sad kad imamo pokrenutu pohranjenu proceduru, krenimo odmah kako je nazvati iz hibernacije.
3. Nazovite pohranjeni postupak s hibernacijom
Počevši od Hibernate 3, imamo mogućnost korištenja sirovog SQL izraza, uključujući pohranjene procedure, za postavljanje upita u bazu podataka.
U ovom ćemo odjeljku proći kroz naizgled osnovni primjer koji će ilustrirati kako nazvati GetAllFoos () postupak pomoću hibernacije.
3.1. Konfiguracija
Prije nego što započnemo s pisanjem koda koji se može pokrenuti, u našem projektu moramo konfigurirati Hibernate.
I naravno za sve to - Mavenove ovisnosti, MySQL konfiguracija, Hibernate konfiguracija i SjednicaTvornica instancija - možete pogledati članak Hibernate.
3.2. Nazovite pohranjenu proceduru koristeći CreateNativeSQL Metoda
Hibernate omogućuje izražavanje upita u izvorni SQL formatirati izravno. Stoga možemo izravno stvoriti izvorni SQL upit i koristiti POZIV izjava za poziv getAllFoos () pohranjeni postupak:
Upit upita = session.createSQLQuery ("CALL GetAllFoos ()"). AddEntity (Foo.class); Navedi allFoos = query.list ();
Gornji upit vraća popis gdje je svaki element a Foo objekt.
Koristimo addEntity () metoda za dobivanje entitetnih objekata iz nativnog SQL upit, inače, a ClassCastException bacit će se kad god pohranjena procedura vrati ne-sirovu vrijednost.
3.3. Nazovite pohranjenu proceduru koristeći @NamedNativeQueries
Drugi način pozivanja pohranjene procedure je upotreba datoteke @NamedNativeQueries bilješka.
@NamedNativeQueries koristi se za specificiranje niza izvornih SQL imenovani upiti obuhvaćeno jedinicom postojanosti:
@NamedNativeQueries ({@NamedNativeQuery (name = "callGetAllFoos", query = "CALL GetAllFoos ()", resultClass = Foo.class)}) @Entity javna klasa Foo implementira serializiranje {// Definicija modela}
Svaki imenovani upit očito ima Ime atribut, stvarni SQL upit, i resultClasskoji se odnosi na Foo mapirani entitet.
Upit upita = session.getNamedQuery ("callGetAllFoos"); Navedi allFoos = query.list ();
The resultClassatribut igra istu ulogu kao i addEntity () metoda u našem prethodnom primjeru.
Oba ova pristupa mogu se koristiti naizmjenično, jer između njih nema stvarnih razlika kada su u pitanju performanse ili produktivnost.
3.4. Nazovite pohranjenu proceduru koristeći @NamedStoredProcedureQuery
Ako koristite JPA 2.1 i Hibernate provedba EntityManagerFactoryi EntityManager.
The @NamedStoredProcedureQuery napomena se može koristiti za deklariranje pohranjene procedure:
@NamedStoredProcedureQuery (name = "GetAllFoos", procedureName = "GetAllFoos", resultClasses = {Foo.class}) @Entity javna klasa Foo implementira Serializable {// Definicija modela}
Da bismo pozvali naš imenovani upit pohranjene procedure, moramo imati instancu EntityManager, a zatim nazovite createNamedStoredProcedureQuery () metoda za stvaranje postupka:
StoredProcedureQuery spQuery = entityManager.createNamedStoredProcedureQuery ("getAllFoos");
Možemo izravno dobiti popis Fooentiteta pozivanjem izvršiti() metoda na StoredProcedureQueryobjekt.
4. Pohranjeni postupci s parametrima
Gotovo svi naši pohranjeni postupci zahtijevat će parametre. U ovom ćemo odjeljku pokazati kako pozvati pohranjenu proceduru s parametrima iz Hibernate.
Stvorimo a getFoosByName () pohranjeni postupak u MySQL.
Ovaj postupak vraća popis Foo objekti u kojima se atribut name podudara s fooName parametar:
DELIMITER // STVORI POSTUPAK GetFoosByName (U fooName VARCHAR (255)) JEZIK SQL DETERMINISTIČKI DEFINER SIGURNOSTI SQL POČINI ODABERITI * IZ foo GDJE name = fooName; KRAJ // DELIMITER;
Nazvati GetFoosByName ()U postupku ćemo koristiti imenovane parametre:
Upit upita = session.createSQLQuery ("CALL GetFoosByName (: fooName)") .addEntity (Foo.class) .setParameter ("fooName", "New Foo");
Slično tome, imenovani parametar : fooName može se koristiti s @NamedNativeQuery napomena:
@NamedNativeQuery (name = "callGetFoosByName", query = "CALL GetFoosByName (: fooName)", resultClass = Foo.class)
Imenovani upit nazvao bi se kako slijedi:
Upit upita = session.getNamedQuery ("callGetFoosByName") .setParameter ("fooName", "New Foo");
Kada koristite @NamedStoredProcedureQuery napomena, parametre možemo odrediti pomoću @StoredProcedureParameter bilješka:
@NamedStoredProcedureQuery (name = "GetFoosByName", procedureName = "GetFoosByName", resultClasses = {Foo.class}, parametri = {@StoredProcedureParameter (name = "fooName", type = String.class, mode = ParameterMode.IN)})
Možemo se poslužiti registerStoredProcedureParameter () metoda za pozivanje naše pohranjene procedure s fooName parametar:
StoredProcedureQuery spQuery = entityManager. createNamedStoredProcedureQuery ("GetFoosByName") .registerStoredProcedureParameter ("New Foo", String.class, ParameterMode.IN);
5. Zaključak
Ovaj je članak pokazao kako koristiti Hibernate za pozivanje pohranjene procedure u MySQL bazu podataka koristeći različite pristupe.
Vrijedno je to spomenuti ne podržavaju svi RDBMS pohranjene procedure.
Možete pogledati primjere iz ovog članka u povezanom projektu GitHub.