režim Spánku: uložit, přetrvávají, update, sloučení, saveOrUpdate

Úvod

V tomto článku se budeme diskutovat rozdíly mezi několika metod Zasedání rozhraní: uložit, přetrvávají, update, sloučení, saveOrUpdate.

toto není úvod do režimu spánku a měli byste již znát základy konfigurace, objektově relačního mapování a práce s instancemi entit. Pro úvodní článek k hibernaci navštivte náš tutoriál o hibernaci 4 s jarem.

další čtení:

odstranění objektů pomocí režimu hibernace

Rychlý průvodce odstraněním entity v režimu hibernace.
Číst více →

Uložené Procedury s Hibernate

Tento článek krátce popisuje, jak volat obchod postupy z Hibernace.
Číst více →

Přehled Identifikátorů v Hibernate/JPA

Naučte se, jak zmapovat subjektu identifikátory s Hibernate.
Číst více →

Relace jako Vytrvalost Rámci Realizace

Relace rozhraní má několik metod, které nakonec za následek ukládání dat do databáze: přetrvávají, ukládat, aktualizovat, sloučení, saveOrUpdate. Pochopit rozdíl mezi těmito metodami, musíme nejprve diskutovat o účelu Relaci jako vytrvalost kontextu a rozdíl mezi státy entity, instance ve vztahu k Sezení.

měli bychom také pochopit historii vývoje hibernace, která vedla k některým částečně duplikovaným metodám API.

2.1. Správa instancí entit

kromě samotného objektově relačního mapování je jedním z problémů, které měl hibernace vyřešit, problém správy entit za běhu. Pojem „kontext persistence“ je řešením tohoto problému hibernace. Kontext Persistence lze považovat za kontejner nebo mezipaměť první úrovně pro všechny objekty, které jste během relace načetli nebo uložili do databáze.

relace je logická transakce, jejíž hranice jsou definovány obchodní logikou vaší aplikace. Při práci s databází prostřednictvím vytrvalost kontextu, a všechny vaše bytosti instance jsou připojeny k této souvislosti, vždy byste měli mít jednu instanci entity pro každý záznam v databázi, že jste komunikovali během zasedání.

v režimu hibernace je kontext persistence reprezentován org.spánek.Instance relace. Pro JPA je to javax.vytrvalost.EntityManager. Když použijeme hibernace jako poskytovatele JPA a pracujeme přes rozhraní EntityManager, implementace tohoto rozhraní v podstatě zabalí základní objekt relace. Nicméně, Hibernate Session poskytuje bohatší rozhraní s více možnostmi, takže někdy je užitečné pracovat s relací přímo.

2.2. Státy Entity, Instance

Jakýkoli subjekt, například v aplikaci se objeví v jednom ze tří hlavních států ve vztahu k Session persistence kontext:

  • přechodné — tato instance není, a nikdy nebyl, připojené k Sezení; tato instance má žádné odpovídající řádky v databázi; to je obvykle jen nový objekt, který jste vytvořili pro uložení do databáze;
  • trvalé — tato instance je spojena s unikátním objektu Session, na splachování Session do databáze, je tento subjekt je zaručeno, že mají odpovídající konzistentní záznam v databázi;
  • samostatně stojící — například byl jednou připojen k Sezení (v trvalém stavu), ale teď to není; instance přejde do tohoto stavu, pokud se vám vypudit ji z kontextu, vymazat nebo zavřít Relaci, nebo dát například prostřednictvím serializace/deserializace proces.

Tady je zjednodušený stavový diagram s připomínky na Zasedání metody, které státní přechody stát.

2016-07-11_13-38-11

pokud je instance entity v trvalém stavu, budou všechny změny, které provedete v mapovaných polích této instance, aplikovány na odpovídající záznamy a pole databáze po propláchnutí relace. Trvalou instanci lze považovat za „online“, zatímco oddělená instance je „offline“ a není sledována kvůli změnám.

To znamená, že když změníte pole perzistentní objekt, nemusíš volat, uložit, aktualizovat nebo některou z těchto metod, aby se tyto změny do databáze: vše, co potřebujete, je potvrzení transakce, nebo flush nebo zavřít relaci, když jste s ním udělal.

2.3. Shoda se specifikací JPA

Hibernate byla nejúspěšnější implementací Java ORM. Není divu, že specifikace pro Java persistence API (JPA) byla silně ovlivněna Hibernate API. Bohužel, tam bylo také mnoho rozdílů: některé hlavní, některé jemnější.

aby fungoval jako implementace standardu JPA, muselo být přepracováno rozhraní API hibernace. Do rozhraní relace bylo přidáno několik metod, které odpovídaly rozhraní EntityManager. Tyto metody slouží stejnému účelu jako „původní“ metody, ale odpovídají specifikaci a mají tedy určité rozdíly.

Rozdíly Mezi Operací

je důležité pochopit, od začátku, že všechny metody (přetrvávají, ukládat, aktualizovat, sloučení, saveOrUpdate) ne okamžitě výsledek v odpovídající SQL AKTUALIZACE nebo-li VLOŽIT prohlášení. Skutečné ukládání dat do databáze nastane při spáchání transakce nebo propláchnutí relace.

uvedené metody v podstatě řídí stav instancí entity jejich přechodem mezi různými stavy v průběhu životního cyklu.

jako příklad entity použijeme jednoduchou entitu zmapovanou anotací:

@Entitypublic class Person { @Id @GeneratedValue private Long id; private String name; // ... getters and setters}

3.1. Přetrvávají

přetrvávají metoda je určena pro přidání nové účetní jednotky stupně vytrvalosti kontextu, tj. přechod instance z přechodné, trvalé státu.

obvykle tomu říkáme, když chceme přidat záznam do databáze (přetrvávají účetní jednotka stupně):

Person person = new Person();person.setName("John");session.persist(person);

Co se stane po přetrvávat metoda se nazývá? Objekt osoby přešel z přechodného do trvalého stavu. Objekt je nyní v kontextu persistence, ale dosud nebyl uložen do databáze. Generování příkazů INSERT nastane až po odevzdání transakce, propláchnutí nebo uzavření relace.

Všimněte si, že metoda persist má typ návratu void. Pracuje na předaném objektu „na místě“ a mění jeho stav. Proměnná osoba odkazuje na skutečný přetrvávající objekt.

tato metoda je pozdějším doplňkem rozhraní relace. Hlavním rozlišovacím znakem této metody je, že odpovídá specifikaci JSR-220 (EJB persistence). Sémantika této metody je striktně definována ve specifikaci, která v podstatě uvádí, že:

  • přechodné stupně se stává perzistentní (a provoz kaskády na všechny jeho vztahy s cascade=PŘETRVÁVAJÍ nebo kaskády=VŠECHNY),
  • pokud instance je již trvalé, pak toto volání nemá žádný vliv na tento konkrétní případ (ale to ještě kaskád, aby se jeho vztahy s cascade=PŘETRVÁVAJÍ nebo kaskády=VŠECHNY),
  • pokud instance je samostatně stojící, měli byste očekávat, že výjimka, a to buď při volání této metody, nebo při spáchání nebo splachování zasedání.

Všimněte si, že zde není nic, co by se týkalo identifikátoru instance. SPECIFIKACE neuvádí, že id bude generováno okamžitě, bez ohledu na strategii generování id. SPECIFIKACE metody persist umožňuje implementaci vydávat příkazy pro generování id při odevzdání nebo flush a není zaručeno, že id bude po volání této metody nenulové, takže byste se na ni neměli spoléhat.

tuto metodu můžete volat na již přetrvávající instanci a nic se nestane. Ale pokud se pokusíte přetrvávat oddělenou instanci, implementace je povinna hodit výjimku. V následujícím příkladu entitu přetrváváme, vystěhujeme ji z kontextu, aby se oddělila,a pak se pokusíme znovu přetrvávat. Druhá výzva k sezení.persist() způsobí výjimku, takže následující kód nebude fungovat:

Person person = new Person();person.setName("John");session.persist(person);session.evict(person);session.persist(person); // PersistenceException!

3.2. Uložit

metoda uložení je „původní“ metoda hibernace, která neodpovídá specifikaci JPA.

jeho účel je v podstatě stejný jako persist, ale má různé implementační detaily. Dokumentace pro tuto metodu striktně uvádí, že instance přetrvává, „nejprve přiřazení vygenerovaného identifikátoru“. Metoda je zaručena, že vrátí Serializovatelnou hodnotu tohoto identifikátoru.

Person person = new Person();person.setName("John");Long id = (Long) session.save(person);

účinek uložení již přetrvávající instance je stejný jako u persist. Rozdíl nastane, když se pokusíte uložit oddělenou instanci:

Person person = new Person();person.setName("John");Long id1 = (Long) session.save(person);session.evict(person);Long id2 = (Long) session.save(person);

proměnná id2 se bude lišit od id1. Volání uložit na oddělené instanci vytvoří novou trvalou instanci a přiřadí jí nový identifikátor, což má za následek duplicitní záznam v databázi po spáchání nebo proplachování.

3.3. Sloučení

hlavním záměrem metody sloučení je aktualizace trvalé instance entity novými hodnotami polí z oddělené instance entity.

například, předpokládejme, že máte Klidný rozhraní s metodou pro načítání JSON-serializovaný objekt pomocí jeho id volajícího a metodu, která přijímá aktualizovanou verzi tohoto objektu od volajícího. Entita, která prošla takovou serializací/deserializací, se objeví v odděleném stavu.

po deserializaci této instance entity musíte získat instanci persistentní entity z kontextu persistence a aktualizovat její pole novými hodnotami z této oddělené instance. Takže sloučit metoda dělá přesně to:

  • zjistí účetní jednotka například podle id převzaty z předán objekt (buď existující entita, instance od vytrvalost souvislosti je citováno, nebo novou instanci načten z databáze);
  • kopie pole z předán objekt k této instanci;
  • vrací nově aktualizovány instance.

V následujícím příkladu jsme se vystěhovat (odpojit) uložené entity z kontextu, změnit název pole, a pak sloučit oddělenou entitu.

Person person = new Person(); person.setName("John"); session.save(person);session.evict(person);person.setName("Mary");Person mergedPerson = (Person) session.merge(person);

Všimněte si, že sloučení metoda vrací objekt — to je mergedPerson objektu, který byl načten do persistence kontext a aktualizován, není osoba, objekt, který prošel jako argument. Jedná se o dva různé objekty a objekt osoby obvykle musí být zlikvidován (každopádně nepočítejte s tím, že bude připojen k kontextu persistence).

Jako s přetrvávat metody slučovací metody je podle JSR-220 mít určité sémantiky, že se můžete spolehnout na:

  • pokud účetní jednotka je samostatně stojící, je zkopírován na již existující perzistentní jednotka;
  • pokud subjekt je přechodné, je zkopírován na nově vytvořené trvalé subjektu;
  • tato operace kaskády pro všechny vztahy s cascade=SLOUČIT nebo kaskády=VŠECH mapování;
  • pokud subjekt je vytrvalý, pak se tato metoda volání nemá vliv na to (ale kaskádové stále probíhá).

3.4. Aktualizace

stejně jako u přetrvávat a uložit, metoda aktualizace je „původní“ metoda hibernace, která byla přítomna dlouho před přidáním metody sloučení. Jeho sémantika se liší v několika klíčových bodů:

  • působí na objekt prošel (jeho návratový typ je void); metody update přechody prošel objekt samostatně stojící na přetrvávající státu;
  • tato metoda vyvolá výjimku, pokud jste projít to přechodný subjekt.

V následujícím příkladu jsme se uložit objekt, pak vystěhovat (odpojit) je to z kontextu, pak změnit její název a zavolat update. Všimněte si, že výsledek operace aktualizace nedáváme do samostatné proměnné, protože aktualizace probíhá na samotném objektu osoby. V podstatě znovu připojujeme existující instanci entity k kontextu persistence-něco, co nám SPECIFIKACE JPA neumožňuje.

Person person = new Person();person.setName("John");session.save(person);session.evict(person);person.setName("Mary");session.update(person);

Pokus o volání aktualizace na přechodné instanci bude mít za následek výjimku. Následující nebude fungovat:

Person person = new Person();person.setName("John");session.update(person); // PersistenceException!

3.5. SaveOrUpdate

tato metoda se objevuje pouze v rozhraní Hibernate API a nemá svůj standardizovaný protějšek. Podobně jako aktualizace, může být také použit pro opětovné připojení instancí.

ve Skutečnosti, vnitřní DefaultUpdateEventListener třída, která zpracovává aktualizace metoda je podtřídou DefaultSaveOrUpdateListener, jen přepsání některé funkce. Hlavní rozdíl metody saveOrUpdate spočívá v tom, že při aplikaci na přechodnou instanci nevyhodí výjimku; místo toho činí tuto přechodnou instanci trvalou. Následující kód bude přetrvávat nově vytvořenou instanci osoby:

Person person = new Person();person.setName("John");session.saveOrUpdate(person);

tuto metodu můžete považovat za univerzální nástroj pro vytvoření trvalého objektu bez ohledu na jeho stav, zda je přechodný nebo oddělený.

co používat?

pokud nemáte žádné zvláštní požadavky, měli byste se zpravidla držet metod persist a merge, protože jsou standardizované a zaručeně odpovídají specifikaci JPA.

Oni jsou také přenosné v případě, že se rozhodnete přejít k jinému vytrvalost poskytovatele, ale mohou se občas objeví, není tak užitečné jako „původní“ Hibernace metody, uložit, aktualizovat a saveOrUpdate.

závěr

diskutovali jsme o účelu různých metod relace hibernace ve vztahu ke správě perzistentních entit za běhu. Naučili jsme se, jak tyto metody transist subjekt případech prostřednictvím jejich životních cyklů a proč některé z těchto metod mají zdvojené funkce.



+