sql >> Databáze >  >> RDS >> Mysql

Dvě vygenerované hodnoty v doktríně

Z toho, co vím, je strategie GeneratedValue vyhrazena pro primární klíč, což znamená, že jej můžete použít pouze jednou na entitu.

V závislosti na vašich potřebách však máte několik možností:

  • Vždy můžete mít událost životního cyklu prePersist , nastavte libovolnou hodnotu názvu, než jej poprvé zachováte.

  • Pokud jste odkázáni na to, že z id vygenerujete další jedinečné ID, můžete implementovat událost postPersist, nastavit tam své jméno a ujistit se, že dvakrát vyprázdníte (poprvé pro vygenerování primárního klíče, podruhé pro uložení názvu).

  • Pokud je pro vás v pořádku, že je jméno v databázi nějakou dobu prázdné, mohlo by být v pořádku implementovat událost postLoad, která vyplní název, pokud je prázdný. Tímto způsobem vaše aplikace vždy uvidí název (protože je buď načten z databáze nebo vyplněn událostí postLoad) a když přidáte nebo upravíte informace poprvé po počátečním uložení, uloží se i vaše jméno

  • Mohlo by být v pořádku neukládat jméno a nechat ho vygenerovat nějakým cronjobem/deamonem/frontou, aby se s ním vaše aplikace nemusela zabývat. Jediné, co byste museli udělat, je zajistit, aby chybějící jméno něco nepokazilo.

  • Možná by bylo v pořádku vygenerovat klíč, který nezávisí na primárním klíči, a proto jej lze vygenerovat pomocí obslužný nástroj globální události . Samozřejmě máte tu nevýhodu, že takový ovladač události, protože je globální, je volán pro každý objekt, který přetrváte, bez ohledu na to, zda je to správná entita.

  • V neposlední řadě může být v pořádku vrátit se k uloženým procedurám/spouštěčům, aby to mohla zvládnout databáze. Tímto způsobem se s tím ve své aplikaci nemusíte potýkat. Ale pozor, na cestě mohou být úskalí (jako když na to vývojář zapomene, protože to není v kódu, ale v databázi!).

Mohou existovat i jiné způsoby. To, co jsem se snažil říci, je:Nepoužívejte createdValue pro vlastnosti, které nejsou primárním klíčem!




  1. NHibernate IPreUpdateEventListener, IPreInsertEventListener se neukládá do DB

  2. Vrácení transakce Mysql při selhání aktualizace

  3. Jak funguje OCTET_LENGTH() v MariaDB

  4. MySQL a JSON - transformace pole na řádky