2

私のアプリには 2 つの永続オブジェクトがあります。モノとモノに添付されたタグです。このアプリは、タグが付けられたもののコレクションを生成できます。タグ オブジェクトには一意の名前があります (同じタグで何かを 2 回タグ付けしても意味がありません)。

Thing を (タグ オブジェクトが添付された状態で) 挿入すると、これらのタグ オブジェクトの一部が同じ名前でデータベースに既に存在している可能性があります。ここで、JPA について思い出せない部分があります。一意の制約に違反している場合、対応するオブジェクトをデータベースに追加しようとしないように JPA に指示する方法はありますか? または、最初にすべてのオブジェクトを取得し、次にコレクションをメモリにマージしてからすべてを書き戻すことなく、これを効率的に行う方法はありますか?

コレクション全体を一度に永続化することが可能かどうか、またはJPAを使用するときにすべてのオブジェクトに対して永続化を呼び出す必要があるかどうかも疑問に思っていますか?

4

1 に答える 1

1

JPAでも、Hibernateでも、他のプロバイダーでも、これを「きれいに」行う方法はわかりません。ただし、カスタム SQL クエリを使用して目的を達成できます (この質問に似ています)。

@Entity
@Table(name="tag")
@SQLInsert( sql="INSERT INTO tag(name, count) VALUES (?, ?)
 ON DUPLICATE KEY UPDATE set count = count + 1")
public class Tag {}

残念ながら、Hibernate と MySQL の両方にバインドされています。他のDBのSQL構文を変更したり、ストアドプロシージャを使用したり、最初に更新を試して失敗時に挿入したりすることができます。それらにはすべて欠点があるため、JPAがこれをサポートすると便利ですが、悲しいかな。

2番目の質問に関して、JPAはコレクションを含むオブジェクトグラフ全体の永続化をサポートしています。

于 2010-07-18T10:29:49.627 に答える