5

バックエンド RDBMS として PostgreSQL で JPA + OpenJPA を使用します。テーブルの主キーは通常、SERIAL/BIGSERIAL列で構成されています。そのため、PostgreSQL は新しいエントリの ID を自動的に生成します ( strategy=GenerationType.IDENTITY)。

ID プロパティの注釈は次のようになります。

@Id
@SequenceGenerator(name="myseq",sequenceName="foobartable_fooid_seq")
@GeneratedValue(generator="myseq",strategy=GenerationType.IDENTITY)

私の質問は:sequenceName値を変更するだけで、この注釈ブロックを複数のエンティティにコピーして貼り付けることはできますか? sequenceNameテーブルごとに違います。しかし、すべてのエンティティの SequenceGenerator に名前を付けることができmyseqますか? または、各エンティティの SequenceGenerator に一意のジェネレータ名を指定する必要がありますか? それぞれの SequenceGenerator 名が永続ユニット内で一意でなければならないということですか?

データベースで sequenceName に使用されているのと同じ値を使用することは、おそらく良い考えでしょうか? だから私は次のようなものを書くだろう

@Id
@SequenceGenerator(name="foobartable_fooid_seq",sequenceName="foobartable_fooid_seq")
@GeneratedValue(generator="foobartable_fooid_seq",strategy=GenerationType.IDENTITY)

SequenceGenerators の命名方法に関する推奨事項はありますか?

ご提案いただきありがとうございます。

さようなら、ミスター・スラブ

4

1 に答える 1

3

JavadocからSequenceGenerator、強調は私のものです:

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

そのため、持続性ユニットで定義された各シーケンスに一意の名前を使用する必要があります。接線GeneratedValue上では、上記のコメントで指摘されているように、戦略は SEQUENCE でなければなりません。

于 2013-02-07T22:52:31.630 に答える