1

プリロードされたシステムデータでシステムをブートストラップできるように、すべてのテーブル(1〜1000など)の主キー識別子のセットを予約したいと思います。

すべてのJPAエンティティクラスには、主キーに対して次の定義があります。

@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "id", unique = true, nullable = false, insertable = false, updatable = false)
private Integer id;

増分が1000から開始する必要があることをデータベースに通知する方法はありますか(つまり、顧客固有のデータは1000から開始します)。私たちの環境では()をサポートh2, mysql, postgresしており、JPAおよびHibernateのリバースエンジニアリングDDLツールを介して駆動できるソリューションを希望します。

これが正しいアプローチかどうか教えてください

4

2 に答える 2

1

他のすべてが失敗した場合は、いつでも独自のカスタム ID ジェネレーターを作成し、DAO のcreate(Entity entity)メソッドで使用できます。IDシーケンステーブルは次のようになります

-------------------------------------------------------------
| sequence_name | initial_value | current_value | increment |
-------------------------------------------------------------
|           foo |          1001 |          2000 |       100 |

これは、テーブルの ID がfoo1001 から始まり、100 ずつ増加することを意味します (したがって、新しいテーブルを挿入するたびに DB を呼び出す必要はありません)。

それは私たちが問題なく使用しているものです。

于 2010-04-09T09:33:54.003 に答える
1

TABLEの代わりに戦略を試すことができIDENTITYます。休止状態の本から:

Hibernate のhilo戦略と同様TABLE に、最後に生成された整数の主キー値を保持するデータベース テーブルに依存し、各ジェネレーターはこのテーブルの 1 つの行にマップされます。各行には と の 2 つの列がpkColumnName ありvalueColumnNameます。はpkColumnValue各行を特定のジェネレータに割り当て、値列には最後に取得された主キーが保持されます。持続性プロバイダーallocationSizeは、各ターンに最大で整数を割り当てます。

これは、より多くの説明を含む例です。そして、初期値を設定するためのより複雑な例。

orm.xml次のように、 で定義されたカスタム シーケンス ジェネレータを使用することもできます。

<sequence-generator name="mySequenceGenerator"
  sequence-name="MY_SEQUENCE"
  initial-value="123"
  allocation-size="20"/>

これは、初期値 123 で指定されたデータベース シーケンスMY_SEQUENCEをデータベース識別子生成のソースとして使用できること、および永続化エンジンが識別子が必要になるたびに 20 個の値を取得する必要があることを宣言します。(ただし、執筆時点では、Hibernate Annotations はinitialValue設定を無視することに注意してください。)

この識別子ジェネレータを特定のエンティティに適用するには、その名前を使用します。

@Entity
class name MyEntity {
  @Id @GeneratedValue(generator = "mySequenceGenerator")
  String id;
}
于 2010-04-09T09:30:20.373 に答える