2017-03-10 9 views
0

私はユーザ提供の電子メールアドレスを、自動生成値ではなくプライマリキーとして使用するサブスクライバエンティティを持っています。これは、JpaRepositoryのsaveメソッドが呼び出されたときに、プライマリキーの値がで、NULLがではないことを意味します。SpringデータJPAでは、主キーがnullでない場合にエンティティをペリスト化できません。

春データJPA documentationセクション2.2.1表2.2次の言葉:デフォルト春データJPAことで

は、与えられた のエンティティのID-プロパティを検査します。 Id-Propertyがヌルの場合、エンティティは とみなされ、そうでない場合は新しいものとみなされます。

この動作により、新しいSubscriberエンティティがデータベースに保持されなくなります。

+4

そうではありません。レポは入力エンティティにIDが存在するので、EntityManager.merge()を内部的に呼び出します。これはエンティティを保存する必要があります。あなたは 'repository.save()'の戻り値を管理されたエンティティとして取ることを忘れないでください。 –

+0

@AdrianShumあなたは正しいです。それは今働く。ただし、重複は検出されません。同じエンティティを2回保存しようとすると、2回目に自動生成されたキーで重複した例外が発生しません。むしろ同じエンティティが更新されます。これは私が望むものではありません。 – Amit

答えて

0

The same tableは、その動作をカスタマイズする方法を説明しています。

どちらかは、あなたのエンティティがPersistableを実装してみましょうとisNewを上書き、またはEntityInformationのカスタム実装を提供します。

+0

私はisNew()メソッドを知っています。 findByEmail()を呼び出し、エンティティが存在するかどうかを調べることができます。しかしこれには、私が避けたいと思う追加のデータベース操作が必要です。 – Amit

+0

エンティティが新しいかどうかを判断する方法はわかりませんが、Spring Dataはそれをそのままで実行することを期待していますか?それはあまりにも多くの私が恐れることを求めている。 –

+0

あなたの前のコメントに続いて、電子メールIDをキーとして使用する方法を考え出しました。上記の私のコメントを@AdrianShumに紹介することができます。問題は今、セーブもエンティティを更新するのではなく、重複した例外を与えることです – Amit

0

エンティティの主キーの選択方法を決定する際には、2つの選択肢があります。 1. Spring付属の自動生成キーを使用します。 2.カスタムプライマリキーを使用します。電子メールアドレス。

自動生成されたキーは、使用が簡単です。エンティティを永続化するとき、Springはidフィールドが空であることに気付き、この新しいエンティティが永続化されていると判断します。新しい自動生成値がidフィールドに割り当てられ、エンティティが永続化されます。ただし、同じ電子メールアドレスを持つ2つのエンティティが永続化されないようにするには、電子メールフィールドに@Column(unique="true")という注釈を付けることを忘れないでください。重複を検出することは、電子メールフィールドのユニークな制約のためにも簡単です。

ただし、ユーザー提供のメールアドレスをキーとして使用する場合があるため、自動生成されたキーを使用したくないことがあります。このアプローチに問題はありません。エンティティの電子メールフィールドに@Idを付けます。それで全部です。ただし、重複検出はできません。同じメールアドレスのエンティティを作成するリクエストが複数回受信された場合は、毎回同じエンティティが更新されます。つまり、毎回EntityManager.merge()が実行されます。制約違反例外は発生しません。 Springは、主キーフィールドが空であるかどうかを常にチェックして、新しいエンティティを作成するか既存のエンティティにマージするかを決定します。

関連する問題