ブートストラップ・データをプリロードするために主キー識別子のセットを予約する方法

StackOverflow https://stackoverflow.com/questions/2606182

質問

私たちは事前にロードされたシステムデータとシステムをブートストラップすることができますので、(例えば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ツールを介して駆動することができます解決策を好むだろう。

は、これは正しいアプローチであれば、私に教えてください。

役に立ちましたか?

解決

あなたは代わりにTABLEIDENTITY戦略を試みることができます。 Hibernateのブックから:

  

Hibernateのhilo戦略のような多く、TABLE   最後に生成さを保持するデータベーステーブルに依存しています   主キー値、および各整数   発電機は、このテーブル内の1つの行にマッピングされます。   pkColumnName:各行は、2つの列を有しています   そしてvalueColumnNamepkColumnValueは、特定の発電機に各行を割り当てます   そして、値の列には、最後を保持しています   主キーを取得しました。永続性プロバイダ   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ずつ増加されます。

我々は多くの問題もなく使用しているものです。

scroll top