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!