9

私はhbm2ddl休止状態ベースのアプリケーションでdbスキーマを生成するために使用しています。hibernate.hbm2ddl.autoプロパティの値はですcreate-drop

@EntityPOJOクラスにアノテーションを使用しています。

@Entity 
public class testTable1 {
     @Id     
     @GeneratedValue(strategy = GenerationType.SEQUENCE)
     Long id; 
}

@Entity 
public class testTable2 {
     @Id     
     @GeneratedValue(strategy = GenerationType.SEQUENCE)
     Long id; 
}

ただし、コードを実行すると、継続的に増分ID値を取得し続けます。たとえば、2つのテーブルの場合、ID(つまり、プリムキー)はそれぞれ1で始まる必要があります。ただし、にレコードを挿入した後Table 1、シーケンスは。の次の値から始まりますTable 2GenerationType.SEQUENCE表2の1から再開する必要があります。 &を試しGenerationType.AUTOました。何も機能しません:-(

4

3 に答える 3

9

JPA仕様で指定されているようにジェネレーターが提供されていない場合、hibernateがデフォルトで提供するグローバルシーケンスジェネレーターを使用しています。プライベート ジェネレーターを使用するには、アノテーションを使用してプライベート ジェネレーターを宣言し、アノテーションの属性を@SequenceGenerator設定する必要があります。generator@GeneratedValue

javadoc から抽出

@GeneratedValue
(オプション) SequenceGenerator または TableGenerator アノテーションで指定された、使用する主キー ジェネレーターの名前。

デフォルトは、持続性プロバイダーによって提供される ID ジェネレーターです。

SequenceGenerator
このアノテーションは、GeneratedValue アノテーションにジェネレーター要素が指定されている場合に、名前で参照できる主キー ジェネレーターを定義します。シーケンス ジェネレーターは、エンティティ クラスまたは主キー フィールドまたはプロパティで指定できます。ジェネレーター名のスコープは、永続化ユニットに対してグローバルです (すべてのジェネレーター タイプにわたって)。

例:

@SequenceGenerator(name="EMP_SEQ", sequenceName="private_sequence")

新しいジェネレーターはより効率的で、JPA 2 仕様のセマンティックに近いため、Hibernate は新しいプロジェクトで hibernate.id.new_generator_mappings=true を使用することをお勧めします。

セクション 1.3。プロパティ
2.2.3. 識別子プロパティのマッピング

完全な例

@Entity
@SequenceGenerator(name="PRIVATE_SEQ", sequenceName="private_sequence")
public class test {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator="PRIVATE_SEQ")
    Long id;
}
于 2011-07-31T15:12:02.787 に答える
0

Hibernate 5.2では、

Joel Hudon の答えを試してみましたが、なぜうまくいかないのかわかりません。

それを解決するための短いコードをいくつか見つけました。

3.2. アノテーション付きエンティティ Java クラス

@Id
@GeneratedValue(generator="increment")
@GenericGenerator(name="increment", strategy = "increment")
public int id;

一意のシーケンス番号を発行できます。

それが役に立てば幸い。

于 2016-11-25T10:41:29.923 に答える