私が知っていることから、GeneratedValue戦略は主キー用に予約されています。つまり、エンティティごとに1回しか使用できません。
ただし、ニーズに応じて、いくつかのオプションがあります。
-
いつでも
prePersistライフサイクルイベント 、名前を最初に永続化する前に、名前に任意の値を設定します。 -
IDに依存して別の一意のIDを生成する場合は、postPersistイベントを実装し、そこに名前を設定して、必ず2回フラッシュすることができます(1回目は主キーを生成し、2回目は名前を保存します)。
-
データベースで名前がしばらくの間空であることが問題ない場合は、postLoadイベントを実装しても問題がない可能性があります。このイベントは、名前が空の場合に名前を埋めます。このように、アプリケーションは常に名前を認識し(データベースからロードされるか、postLoadイベントによって入力されるため)、最初の保存後に初めて情報を追加または編集するときに、名前も保存されます
-
名前を保存せず、アプリケーションがそれを処理する必要がないように、名前をcronjob / daemon/queueで生成してもかまいません。あなたがする必要がある唯一のことは、欠けている名前が何かを台無しにしないことを確認することです。
-
主キーに依存しないキーを生成しても問題ない可能性があるため、グローバルイベントハンドラー 。もちろん、このようなイベントハンドラーはグローバルであるため、正しいエンティティであるかどうかに関係なく、永続化するすべてのオブジェクトに対して呼び出されるという欠点があります。
-
最後になりましたが、データベースにこれを処理させるために、ストアドプロシージャ/トリガーにフォールバックしても問題ない場合があります。このようにして、アプリケーション内でこれをいじる必要はありません。ただし、途中で落とし穴がある可能性があることに注意してください(コードではなくデータベースにあるため、開発者がこれを忘れるなど)。
他の方法があるかもしれません。私が言おうとしていたのは、主キー以外のプロパティにgeneratedValueを使用しないでください!