Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Zwei generierte Werte in der Lehre

Soweit ich weiß, ist die GeneratedValue-Strategie für den Primärschlüssel reserviert, was bedeutet, dass Sie sie nur einmal pro Entität verwenden können.

Abhängig von Ihren Anforderungen haben Sie jedoch einige Optionen:

  • Sie können immer einen haben prePersist-Lebenszyklusereignis , indem Sie einen beliebigen Wert für den Namen festlegen, bevor Sie ihn das erste Mal speichern.

  • Wenn Sie von der ID abhängig sind, um daraus eine andere eindeutige ID zu generieren, können Sie ein postPersist-Ereignis implementieren, Ihren Namen dort festlegen und sicherstellen, dass Sie zweimal leeren (das erste Mal, um den Primärschlüssel zu generieren, das zweite Mal, um den Namen zu speichern).

  • Wenn es für Sie in Ordnung ist, dass der Name in der Datenbank für einige Zeit leer ist, könnte es in Ordnung sein, ein postLoad-Ereignis zu implementieren, das den Namen füllt, wenn er leer ist. Auf diese Weise sieht Ihre Anwendung immer den Namen (weil er entweder aus der Datenbank geladen oder durch das postLoad-Ereignis gefüllt wird) und wenn Sie nach dem ersten Speichern zum ersten Mal Informationen hinzufügen oder bearbeiten, wird Ihr Name ebenfalls gespeichert

  • Es könnte in Ordnung sein, den Namen nicht zu speichern und ihn von einem Cronjob/Daemon/einer Warteschlange generieren zu lassen, damit Ihre Anwendung nicht damit umgehen muss. Das Einzige, was Sie tun müssten, ist sicherzustellen, dass ein fehlender Name nichts vermasselt.

  • Vielleicht ist es in Ordnung, einen Schlüssel zu generieren, der nicht vom Primärschlüssel abhängt und daher von einem globaler Event-Handler . Sie haben natürlich den Nachteil, dass ein solcher Event-Handler, weil er global ist, für jedes Objekt aufgerufen wird, das Sie persistieren, egal ob es die richtige Entität ist.

  • Zu guter Letzt könnte es in Ordnung sein, auf gespeicherte Prozeduren/Trigger zurückzugreifen, damit die Datenbank dies handhaben kann. Auf diese Weise müssen Sie sich in Ihrer Anwendung nicht damit herumschlagen. Aber Vorsicht, es könnten Fallstricke auf dem Weg sein (wie ein Entwickler dies vergisst, weil es nicht im Code, sondern in der Datenbank ist!).

Es kann andere Wege geben. Was ich sagen wollte, ist:Verwenden Sie den generierten Wert nicht für Nicht-Primärschlüssel-Eigenschaften!