ブートストラップ・データをプリロードするために主キー識別子のセットを予約する方法
質問
私たちは事前にロードされたシステムデータとシステムをブートストラップすることができますので、(例えば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
)をサポートし、私は、HibernateのJPAとリバースエンジニアリングのDDLツールを介して駆動することができます解決策を好むだろう。
は、これは正しいアプローチであれば、私に教えてください。
解決
あなたは代わりにTABLE
のIDENTITY
戦略を試みることができます。 Hibernateのブックから:
Hibernateの
hilo
戦略のような多く、TABLE
最後に生成さを保持するデータベーステーブルに依存しています 主キー値、および各整数 発電機は、このテーブル内の1つの行にマッピングされます。pkColumnName
:各行は、2つの列を有しています そしてvalueColumnName
。pkColumnValue
は、特定の発電機に各行を割り当てます そして、値の列には、最後を保持しています 主キーを取得しました。永続性プロバイダallocationSize
整数までの割り当て 各ターンインチ
ここで例があります以上説明と。そして、初期値を設定するためのより複雑な例。
また、このように、あなたのorm.xml
で定義されたカスタム・シーケンス発生器を使用してみてください可能性があります:
<sequence-generator name="mySequenceGenerator"
sequence-name="MY_SEQUENCE"
initial-value="123"
allocation-size="20"/>
これは、データベースのシーケンスが初期値と
MY_SEQUENCE
という名前のことを宣言します 123のデータベース識別子生成のソースとして使用することができ、その永続 エンジンは20個の値それが識別子を必要とするたびに取得する必要があります。 (注意、 しかし、Hibernateは注釈こと、執筆の時点で、initialValue
の設定を無視します。)は、特定のエンティティの識別子ジェネレータを適用するには、その名前を使用します:
@Entity
class name MyEntity {
@Id @GeneratedValue(generator = "mySequenceGenerator")
String id;
}
他のヒント
他のすべてが失敗した場合は、常に独自のカスタムIDジェネレータを書いて、あなたのDAOのcreate(Entity entity)
方法でそれを使用することができます。 IDシーケンステーブルのようなものかもしれない。
-------------------------------------------------------------
| sequence_name | initial_value | current_value | increment |
-------------------------------------------------------------
| foo | 1001 | 2000 | 100 |
(新しい各テーブルの挿入のためのDBを呼び出す必要はありませんので)これは1001年で、テーブルfoo
開始のためにそのIDを意味するかもしれないし、100ずつ増加されます。
我々は多くの問題もなく使用しているものです。