2017-01-30 4 views
0

JPAとHibernateを使用してテーブルに接続し、データを挿入しています。私はテーブルがあると言う:ID、名前と住所の3つの列を持つユーザー。私は同じもののためのエンティティクラスを持って、私は単にEntityManagerのオブジェクトを使用し、私のための魅力のように動作するデータベース内のデータを保持するデータを挿入します。ローを挿入する前にPostgresテーブルの既存の値を確認する

ここでは、私が永続化している値がすでに存在するかどうかを確認するシナリオがあります。その場合、エラーを記録する必要があります。現在私がやっていることは、手動でテーブルから行をロードし、同じ値が存在するかどうかを手動でチェックすることです。これは、3つの列しか持たないサンプル表(User)ではかなり簡単です。しかし、もし私が30列のテーブルを持っていたら?

1つの条件に基づいて手動でデータをロードし、他の列をチェックするか、それを行うためのより簡単な方法がありますか?

+2

、オブジェクトが存在する場所にチェックするために、専用のSQLを記述します重複行を許可しないようにテーブル制約を使用してください。 – Kayaman

+0

+1に@Kayaman、Db制約を使用します。 else SQL/hqlクエリが唯一のオプションです。 –

+0

テーブルの一意の列のサブセットを検索し、それぞれの制約を適用します。 - あなたの例にとどまるために、たくさんの列を持つ 'users'テーブルがあるとしましょう。 'email'カラムが同じである2つの別々の行を許可することはほとんどありませんが、' favourite_color'が違うとしましょう。 – pozs

答えて

0

30カラムは、主キーは?重複をチェックしているデータがプライマリキーまたはユニーク制約の場合、保存する前にHibnerateを使用してオブジェクトをフェッチし、存在する場合はレポートし直すことができます。 30列がキーの一部でない場合は、equalsメソッドを使用し、すべての行をフェッチします。そこに多くの行があると、これが遅くなる場合は、その後私はおそらく、すなわち

UserDao public boolean rowExists(User user) { ... }

+0

残念ながら、チェックする必要がある30個の列はキーの一部ではなく、それは扱いにくいものです。あなたの解決策では、問題は30列すべてではなく、おそらく25列を確認することです。 –

+0

これは非常に貧弱な一般的な解決策です。テーブルの制約がない場合、シリアライズされたトランザクションを頻繁に使用していない限り、単純なマルチスレッドコードで重複を挿入できます。 – Kayaman

+1

@AnkushBhan:これらの列には常に一意のインデックスを作成できますが、奇妙な要求のようなユニークな音でなければならない30列の列があります。 –

関連する問題