[解決済み] Spring-data-jpaを使用してエンティティを更新するにはどうすればよいですか?
質問
さて、この質問がすべてを物語っています。JPARepositoryを使用して、どのようにエンティティを更新するのですか?
JPARepositoryには
保存
メソッドで、それが実際に作成なのか更新なのかがわかりません。例えば、3つのフィールドを持つ単純なオブジェクトをUserデータベースに挿入してみます。
firstname
,
lastname
と
age
:
@Entity
public class User {
private String firstname;
private String lastname;
//Setters and getters for age omitted, but they are the same as with firstname and lastname.
private int age;
@Column
public String getFirstname() {
return firstname;
}
public void setFirstname(String firstname) {
this.firstname = firstname;
}
@Column
public String getLastname() {
return lastname;
}
public void setLastname(String lastname) {
this.lastname = lastname;
}
private long userId;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
public long getUserId(){
return this.userId;
}
public void setUserId(long userId){
this.userId = userId;
}
}
そして、単純に
save()
この時点で、実際にはデータベースへの挿入が行われています。
User user1 = new User();
user1.setFirstname("john"); user1.setLastname("dew");
user1.setAge(16);
userService.saveUser(user1);// This call is actually using the JPARepository: userRepository.save(user);
ここまでは順調です。さて、このユーザーを更新したい、例えば年齢を変更したい。この目的のために、私はQueryDSLやNamedQueryなどのクエリを使用することができます。しかし、私はspring-data-jpaとJPARepositoryを使いたいだけだと考えると、挿入の代わりに更新を行いたいことをどのように伝えればいいのでしょうか?
具体的には、spring-data-jpaに、ユーザー名とfirstnameが同じユーザーは実際にはequalであり、既存のエンティティは更新されるはずであると、どのように伝えればいいのでしょうか。equalsをオーバーライドしても、この問題は解決されませんでした。
どのように解決するのですか?
エンティティのアイデンティティは、プライマリキーによって定義されます。そのため
firstname
と
lastname
が主キーの一部でない場合、JPAに対して
User
と同じ
firstname
と
lastname
が異なる場合は、同等として扱われます。
userId
s.
ですから、もしあなたが
User
で識別される。
firstname
と
lastname
を見つける必要があります。
User
をクエリで実行し、見つかったオブジェクトの適切なフィールドを変更します。これらの変更は、トランザクションの終了時に自動的にデータベースに反映されるので、明示的に変更を保存する必要はありません。
EDITです。
JPAの全体的なセマンティクスについて詳しく説明すべきかもしれません。永続化APIの設計には、主に2つのアプローチがあります。
-
挿入/更新の方法 . データベースを変更する必要がある場合、永続化APIのメソッドを明示的に呼び出す必要があります。
insert
でオブジェクトを挿入したりupdate
で、オブジェクトの新しい状態をデータベースに保存します。 -
ユニット・オブ・ワークの考え方 . この場合、オブジェクトのセットを持っています。 マネージド 永続化ライブラリによって これらのオブジェクトに加えたすべての変更は、作業単位の終了時(つまり、典型的なケースでは現在のトランザクションの終了時)に自動的にデータベースにフラッシュされます。データベースに新しいレコードを挿入する必要がある場合、対応するオブジェクトを作成します マネージド . マネージド オブジェクトは主キーで識別されるので、主キーがあらかじめ定義されたオブジェクトを作ると マネージド このオブジェクトは、同じIDのデータベースレコードと関連付けられ、このオブジェクトの状態が自動的にそのレコードに伝搬されます。
JPAでは後者のアプローチをとっています。
save()
は、Spring Data JPA のバックグランドを
merge()
は、プレーンなJPAでは、エンティティが
マネージド
というように つまり
save()
は、定義済みの ID を持つオブジェクトに対して、 新しいレコードを挿入するのではなく、対応するデータベースのレコードを更新します。
save()
とは呼ばれません。
create()
.
関連
-
[解決済み] Spring Data JPAにおけるCrudRepositoryとJpaRepositoryのインターフェースの違いは何ですか?
-
[解決済み] maven. -source 1.5ではラムダ式がサポートされていません。
-
[解決済み] publicId と systemId の間に空白が必要です。
-
[解決済み] SubclipseとJavaHLのインストールで頭を悩ます
-
[解決済み] Mavenを使用して、依存関係を持つ実行可能なJARを作成するにはどうすればよいですか?
-
[解決済み】JSP 2を使用して、JSPファイル内のJavaコードを回避するにはどうすればよいですか?
-
[解決済み】HibernateとSpring Data JPAの違いは何ですか?
-
[解決済み】Spring JPAで特定のカラムを選択する方法
-
[解決済み] JPAとSpring Data JPAの違いは何ですか?
-
[解決済み] Spring Data JPAでgetOneとfindOneメソッドを使用する場合
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] java.sql.SQLException: ORA-00933: SQL コマンドが正しく終了していません。
-
[解決済み] Java の substring() の時間複雑性
-
[解決済み] 環境変数JAVA_OPTSの使い方を教えてください。
-
[解決済み] Java Genericメソッドをstaticにするには?
-
[解決済み] Oracle DB : java.sql.SQLException: 閉じた接続
-
[解決済み] Javaでのスキャナが動作しない
-
[解決済み] raw 型のメンバへのアンチェックの呼び出し
-
[解決済み] Apache Camelのログに簡単なテキストを記録する
-
[解決済み] IntegerからBigIntegerへの変換
-
[解決済み] Java - JPA - @Version アノテーション