1

Hibernate を使用して ID を自動インクリメントしようとしていますが、重複を避けようとしています。

class Service
{
    Long id; // auto increment
    String name;
    String owner;
    Boolean incremental;


// setter and getter
}

私が達成したいのは、保存したい新しいサービスオブジェクトがデータベース内の既存のものと同じ名前と所有者を持つときはいつでも(データフィールドの増分が同じかどうかに関係なく)、それは重複エントリー。この場合、データベースに別のエントリを追加する必要はもうありません。この問題を回避するために hbm.xml ファイルを修正するにはどうすればよいですか?

4

3 に答える 3

2

注釈を使用して同じことを行うことができます。

エンティティ クラスの上に、次のように記述します。

@Table(uniqueConstraints = @UniqueConstraint(columnNames = { "name","owner"}))
@Entity
class Service
{
    Long id; // auto increment
    String name;
    String owner;

// setter and getter
}

これにより、列の名前と所有者が一緒に一意である必要があることが hibernate に通知されます。

于 2010-03-25T14:54:47.777 に答える
1

id 列が必要な場合は、保持できます。必要なのは * 両方の列のデータベース レベルでの一意の制約です。

(hbmtoddl ツールを使用する場合は、次のようなものが必要になる場合があります。

<properties name="key" unique="true">
    <property name="name" .../>
    <property name="owner" .../>
</properties>

)

このように、重複データを挿入することはできません。

その後、重複を挿入しようとしたときにコードを壊したくない場合は、

  • 名前と所有者によるルックアップ (頻繁に行う場合は、インデックスを使用することをお勧めします)
  • エントリが見つからない場合は、挿入します
  • また、一意の制約違反が発生した場合にスローされた例外をキャッチし (2 つのスレッドが同時にデータを挿入している場合にも発生する可能性があります)、選択を再試行することもできます。
于 2010-03-25T14:34:53.043 に答える
1

いくつかのオプションがあります:

  • 主キーをcomposite-idorとして定義しますnatural-id
  • 保存する前に、クエリを使用して、同じ名前と所有者を持つ別の行があるかどうかを確認し、ある場合はそれを取得します。

hashCode()いずれにせよ、オーバーライドしequals(..)て使用する必要がnameありますowner

于 2010-03-24T22:37:39.137 に答える