データベースに関してREFRESHとMERGEはどういう意味ですか?


94

私は好奇心が強いので、この答えをすばやく見つける必要があります。Googleはあまり役に立ちません。

Java Persistence APIには、関連するエンティティで操作をカスケードするようにフレームワークに指示する次のプロパティがあります。

CascadeType.PERSIST
CascadeType.DELETE
CascadeType.MERGE
CascadeType.REFRESH

最初の2つの意味はわかっています。Bを持つオブジェクトAを永続化すると、Bも永続化され、Aを削除すると、Bも削除されます。

しかし、私は他の2人が何を成し遂げているのか理解できません。助けて?

回答:


80

REFRESHは、「データベースから状態の変更をプルして私の表現に入れる」ことを意味します。これをカスケードするのは簡単です。これは、関連するすべてのエンティティが更新されることを意味します。

MERGEは、「保存」に近い複雑なものを意味しますが、「この切り離されたエンティティを管理状態に戻し、その状態変更を保存する」ようなものです。カスケードとは、関連付けられているすべてのエンティティが同じ方法でプッシュバックされ、元に戻す管理対象エンティティハンドル.merge()にすべての管理対象エンティティが関連付けられていることを意味します。

関連ドキュメントの1つのインスタンスへのリンク


1
デフォルトは何ですか(CascadeTypeを設定しなかった場合)、最も適切で一般的な設定は何ですか?
Rosdi Kasim 2010

@Rosdi Kasim:CascadeTypeデフォルトは空の配列です。
user1438038

@chaos so refreshは、親が更新/更新されたときに、データベースの内容と一致するように子を更新します。Mergeは基本的に、データベース内の子の更新されたフィールドを上書きして、子エンティティを親に反映します。両方を使用するとどうなりますか?私はこれを誤解していると思います。
ジョーダンマッキー

87

多対多の関係に対するJPAアノテーションの意味

  • ALL-ソースエンティティで実行される可能性のあるすべてのカスケード操作は、関連付けのターゲットにカスケードされます。
  • MERGE-ソースエンティティがマージされると、マージは関連付けのターゲットにカスケードされます。
  • PERSIST-ソースエンティティが永続化されている場合、永続化は関連付けのターゲットにカスケードされます。
  • REFRESH-ソースエンティティが更新されると、更新は関連付けのターゲットにカスケードされます。
  • REMOVE-ソースエンティティが削除されると、関連付けのターゲットも削除されます。

私自身はこれらをこのように見ています(もっと読みやすい):

  • MERGE-既存のオブジェクトの場合、テーブル内の既存のデータをオブジェクト内のデータとマージします。(データベースに同期)
  • PERSIST-データベースのオブジェクトから新しいレコードを作成します。
  • REFRESH-オブジェクトのデータを更新します。おそらく、同期する必要があるデータベースに変更がありました。(データベースから同期)
  • REMOVE-削除します。

1
注釈のJavadocは私にとって何も解決しませんでした。答えてくれてありがとう!
アンドレ・Chalella
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.