@MapsIdでの@OneToOneの問題と回避方法
このTipは@pmvermaにより提出されました
以下は、@MapsId
で@OneToOne
を使用することに関する既知の問題と、それを回避するためのいくつかのヒントです。
問題
@OneToOne @MapsId
でUser
に関連付けられたPreference
クラスがあるとします。
class Preference {
@OneToOne
@MapsId
private User user;
}
通常JHipsterでは、以下のようになります。
- ユーザーの
preference
を追加する場合は、データを入力し、ドロップダウンからユーザーuser01
ログインを選択して保存します。 - 同じ
preference
を編集する場合でも、ユーザを選択するオプションがあります。今回user02
を選択すると、バックエンド側では、リクエストのライフタイム全体にわたってpreference
オブジェクトにuser02
が保持されます。 - 再び同じ
preference
をリロードすると、user02
ではなくuser01
が存在することがわかります。
この間違った部分は、
no.2 ステップのpreference
オブジェクトのuser02
です。preference
ユーザーオブジェクトは、常にuser01
を参照する必要があります。
詳細については、https://github.com/jhipster/generator-jhipster/issues/9100を参照してください。
回避するためのヒント
- ドロップダウンを非表示にして、現在のユーザを
preference
に クライアント側で プログラム的に設定します(改めて、この種の解決策は、ユーザを選択するためのドロップダウンが意味をなさない、プリファレンス、設定、ユーザプロファイルなどのエンティティに対してのみ有効です)。 - ドロップダウンを非表示にして、現在のユーザを
preference
に サーバ側で プログラム的に設定します(改めて、この種の解決策は、ユーザを選択するためのドロップダウンが意味をなさない、プリファレンス、設定、ユーザプロファイルなどのエンティティに対してのみ有効です。JHipsterはすでに現在のユーザを取得するメソッドを提供しています)。 - そのユーザーに対してビジネスロジックを実行する前に、正しい関連付けの値を検証してロードします(改めて、ロジックが
preference.getUser()
に依存する場合にのみ必要です)。 - Hibernate 5.4.2以降を使用している場合は、正しい関連値を取得 できますが、それはエンティティのマージ操作が完了した後に限られます。したがって、エンティティのマージ操作の前にビジネスロジックが実行される場合は、それを処理する必要があります。そうしないと、誤った結果を取得する可能性があります。