Skip to main content

@MapsIdでの@OneToOneの問題と回避方法

このTipは@pmvermaにより提出されました

以下は、@MapsId@OneToOneを使用することに関する既知の問題と、それを回避するためのいくつかのヒントです。

問題

@OneToOne @MapsIdUserに関連付けられたPreferenceクラスがあるとします。

class Preference {
@OneToOne
@MapsId
private User user;
}

通常JHipsterでは、以下のようになります。

  1. ユーザーのpreferenceを追加する場合は、データを入力し、ドロップダウンからユーザーuser01ログインを選択して保存します。
  2. 同じpreferenceを編集する場合でも、ユーザを選択するオプションがあります。今回user02を選択すると、バックエンド側では、リクエストのライフタイム全体にわたってpreferenceオブジェクトにuser02が保持されます。
  3. 再び同じ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以降を使用している場合は、正しい関連値を取得できますが、それはエンティティのマージ操作が完了した後に限られます。したがって、エンティティのマージ操作の前にビジネスロジックが実行される場合は、それを処理する必要があります。そうしないと、誤った結果を取得する可能性があります。