Доколкото знам, стратегията GeneratedValue е запазена за първичен ключ, което означава, че можете да я използвате само веднъж на обект.
В зависимост от вашите нужди обаче имате няколко опции:
-
Винаги можете да имате събитие от жизнения цикъл prePersist , като зададете стойност, която желаете за името, преди да го запазите за първи път.
-
Ако разчитате на идентификатора да генерира друг уникален идентификатор от него, можете да приложите събитие postPersist, да зададете името си там и да се уверите, че сте изчистили два пъти (първия път за генериране на първичния ключ, втория път за запазване на името).
-
Ако за вас е добре името да е празно в базата данни за известно време, може да е добре да приложите събитие postLoad, което запълва името, ако е празно. По този начин приложението ви винаги вижда името (тъй като то се зарежда от базата данни или се попълва от събитието postLoad) и когато добавите или редактирате информация за първи път след първоначалното записване, вашето име също ще бъде запазено
-
Може да е добре да не запазвате името и да го генерирате от някакъв cronjob/deamon/queue, така че приложението ви да не се занимава с него. Единственото нещо, което трябва да направите, е да се уверите, че липсващото име не прецака нещо.
-
Може би е добре да генерирате ключ, който не зависи от първичния ключ и по този начин може да бъде генериран от глобален манипулатор на събития . Разбира се, имате недостатъка, че такъв манипулатор на събития, тъй като е глобален, се извиква за всеки обект, който запазвате, без значение дали е правилният обект.
-
И накрая, но не на последно място, може да е добре да се върнете към съхранени процедури/тригери, за да позволите на базата данни да се справи с това. По този начин не е нужно да се забърквате с това във вашето приложение. Но внимавайте, може да има клопки по пътя (като разработчик да забрави за това, защото не е в кода, а в базата данни!).
Може да има и други начини. Това, което се опитвах да кажа е:Не използвайте generatedValue за свойства, които не са първични ключове!