Mysql
 sql >> база данни >  >> RDS >> Mysql

Две генерирани ценности в доктрината

Доколкото знам, стратегията GeneratedValue е запазена за първичен ключ, което означава, че можете да я използвате само веднъж на обект.

В зависимост от вашите нужди обаче имате няколко опции:

  • Винаги можете да имате събитие от жизнения цикъл prePersist , като зададете стойност, която желаете за името, преди да го запазите за първи път.

  • Ако разчитате на идентификатора да генерира друг уникален идентификатор от него, можете да приложите събитие postPersist, да зададете името си там и да се уверите, че сте изчистили два пъти (първия път за генериране на първичния ключ, втория път за запазване на името).

  • Ако за вас е добре името да е празно в базата данни за известно време, може да е добре да приложите събитие postLoad, което запълва името, ако е празно. По този начин приложението ви винаги вижда името (тъй като то се зарежда от базата данни или се попълва от събитието postLoad) и когато добавите или редактирате информация за първи път след първоначалното записване, вашето име също ще бъде запазено

  • Може да е добре да не запазвате името и да го генерирате от някакъв cronjob/deamon/queue, така че приложението ви да не се занимава с него. Единственото нещо, което трябва да направите, е да се уверите, че липсващото име не прецака нещо.

  • Може би е добре да генерирате ключ, който не зависи от първичния ключ и по този начин може да бъде генериран от глобален манипулатор на събития . Разбира се, имате недостатъка, че такъв манипулатор на събития, тъй като е глобален, се извиква за всеки обект, който запазвате, без значение дали е правилният обект.

  • И накрая, но не на последно място, може да е добре да се върнете към съхранени процедури/тригери, за да позволите на базата данни да се справи с това. По този начин не е нужно да се забърквате с това във вашето приложение. Но внимавайте, може да има клопки по пътя (като разработчик да забрави за това, защото не е в кода, а в базата данни!).

Може да има и други начини. Това, което се опитвах да кажа е:Не използвайте generatedValue за свойства, които не са първични ключове!




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Нуждаете се от MySQL заявка за избор от таблица, съхраняваща двойки ключови стойности

  2. Неизвестна колона в „имаща клауза“

  3. DATEDIFF() Примери – MySQL

  4. Бягство на MySQL заместващи карти

  5. MySQL 8.0 - Клиентът не поддържа протокол за удостоверяване, поискан от сървъра; помислете за надграждане на MySQL клиента