Mysql
 sql >> Database >  >> RDS >> Mysql

Due valori generati in dottrina

Da quello che so la strategia GeneratedValue è riservata alla chiave primaria, il che significa che puoi usarla solo una volta per Entità.

A seconda delle tue esigenze hai però alcune opzioni:

  • Puoi sempre avere un evento del ciclo di vita prePersist , impostando qualsiasi valore che ti piace per il nome prima di mantenerlo la prima volta.

  • Se dipendi dall'id per generare un altro ID univoco da esso, potresti implementare un evento postPersist, impostare il tuo nome lì e assicurarti di svuotare due volte (la prima volta per generare la chiave primaria, la seconda volta per salvare il nome).

  • Se per te va bene che il nome sia vuoto nel database per un po' di tempo, potrebbe essere opportuno implementare un evento postLoad, che riempie il nome se è vuoto. In questo modo la tua applicazione vede sempre il nome (perché è caricato dal database o riempito dall'evento postLoad) e quando aggiungi o modifichi le informazioni la prima volta dopo il salvataggio iniziale, verrà salvato anche il tuo nome

  • Potrebbe andare bene non salvare il nome e averlo generato da alcuni cronjob/deamon/queue in modo che la tua applicazione non debba occuparsene. L'unica cosa che dovresti fare è assicurarti che un nome mancante non rovini qualcosa.

  • Forse potrebbe essere corretto generare una chiave che non dipende dalla chiave primaria e quindi può essere generata da un gestore di eventi globale . Ovviamente hai lo svantaggio che un tale gestore di eventi, poiché è globale, viene chiamato per ogni oggetto che persisti, non importa se è l'entità corretta.

  • Ultimo, ma non meno importante, potrebbe essere opportuno eseguire il fallback su Stored procedure/Trigger per consentire al database di gestirlo. In questo modo non devi pasticciare con questo all'interno della tua applicazione. Ma attenzione, potrebbero esserci delle insidie ​​lungo la strada (come uno sviluppatore che se ne dimentica perché non è nel codice ma nel database!).

Potrebbero esserci altri modi. Quello che stavo cercando di dire è:non utilizzare generatedValue per le proprietà della chiave non primaria!