2

JPA 仕様では、アノテーションについて次のように説明されています@GeneratedValue(strategy=TABLE)

ジェネレータ タイプのTABLE値は、固有性を確保するために、永続化プロバイダが基になるデータベース テーブルを使用してエンティティに主キーを割り当てる必要があることを示します。

しかし、「基礎となるデータベース テーブルを使用する」とは、実際には何を意味するのでしょうか。補助テーブルを使うということですか?または、エンティティ テーブルをスキャンして、使用されていない ID を見つけますか? または、他の何か?

4

2 に答える 2

8

JavaDoc for をTableGeneratorチェックしてください。それがどのように機能するかの良い例があります:

例 1:

@Entity public class Employee {
    ...
    @TableGenerator(
        name="empGen", 
        table="ID_GEN", 
        pkColumnName="GEN_KEY", 
        valueColumnName="GEN_VALUE", 
        pkColumnValue="EMP_ID", 
        allocationSize=1)
    @Id
    @GeneratedValue(strategy=TABLE, generator="empGen")
    int id;
    ...
}

例 2:

@Entity public class Address {
    ...
    @TableGenerator(
        name="addressGen", 
        table="ID_GEN", 
        pkColumnName="GEN_KEY", 
        valueColumnName="GEN_VALUE", 
        pkColumnValue="ADDR_ID")
    @Id
    @GeneratedValue(strategy=TABLE, generator="addressGen")
    int id;
    ...
}

基本的ID_GENには、キーと値のペアの内部 (非ビジネス) テーブルです。JPA が ID を生成するたびに、そのデータベースにクエリを実行します。

SELECT GEN_VALUE
FROM ID_GEN
WHERE GEN_KEY = ...

列をインクリメントしGEN_VALUEます。このメカニズムを使用して、シーケンスをエミュレートしたり、生成された ID をさらに制御したりできます。

于 2012-08-25T12:22:14.713 に答える
0

EclipseLink の場合、補助テーブルを使用します。ドキュメントによると

デフォルトでは、EclipseLink は という名前のテーブルを使用して戦略TABLEを選択SEQUENCEします。SEQ_NAMESEQ_COUNT

于 2012-08-25T12:20:31.360 に答える