web-dev-qa-db-ja.com

アノテーション@Idおよび@GeneratedValue(strategy = GenerationType.IDENTITY)の使用は何ですか?世代タイプがアイデンティティである理由

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY)

なぜこのアノテーションを使用するのですか?これがテーブルID値を自動インクリメントするかどうかを知る必要があります。 (GenerationType.IDENTITY)この注釈を使用するときに実際に起こっている他のタイプがあります

public class Author extends Domain
{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "id") 
    private Integer id;

    @Basic(optional = false)
    @Column(name = "name") 
    private String name;

    @Column(name = "address") 
    private String address; 

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "authorId")
    private List<Book>
    bookList;

    public Author()
    { 
        setServiceClassName("wawo.tutorial.service.admin.AuthorService");
    }
}

*ドメイン抽象クラスを拡張する必要がありますか?

64
Lijo

この質問に答えさせてください:
まず、configureメソッドとしてアノテーションを使用することは、無限のXML設定ファイルに対処するのではなく、単に便利なメソッドです。

@Idannotationはjavax.persistence.Idから継承され、下のメンバーフィールドが現在のエンティティの主キーであることを示します。したがって、HibernateおよびSpringフレームワークは、このアノテーションに基づいていくつかのreflect作業を実行できます。詳細については、 Idのjavadoc を確認してください。

@GeneratedValueアノテーションは、指定されたcolumn(field)のインクリメント方法を設定することです。たとえば、Mysqlを使用する場合、テーブルの定義でauto_incrementを指定して自己増分型にし、次に

@GeneratedValue(strategy = GenerationType.IDENTITY)

Javaコードで、このデータベースサーバー側の戦略を使用することにも同意したことを示します。また、さまざまな要件に合うようにこのアノテーションの値を変更できます。

1.データベースでシーケンスを定義する

たとえば、Oracleはインクリメントメソッドとしてsequenceを使用する必要があります。Oracleでシーケンスを作成するとします。

create sequence Oracle_seq;

2.データベースシーケンスを参照する

データベースにはシーケンスがありますが、 @SequenceGenerator を使用して、JavaとDBの関係を確立する必要があります。

@SequenceGenerator(name="seq",sequenceName="Oracle_seq")

sequenceNameはOracleのシーケンスの実際の名前です。nameはJavaでそれを呼び出したいものです。 sequenceNameと異なる場合はnameを指定する必要があり、そうでない場合はnameを使用します。私は通常、sequenceNameを無視して時間を節約します。

3. Javaでシーケンスを使用する

最後に、このシーケンスをJavaで使用します。 @GeneratedValue を追加するだけです:

@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="seq")

generatorフィールドは、使用するシーケンスジェネレーターを示します。 DBの実際のシーケンス名ではなく、nameSequenceGeneratorフィールドで指定した名前です。

4.完了

したがって、完全なバージョンは次のようになります。

public class MyTable
{
    @Id
    @SequenceGenerator(name="seq",sequenceName="Oracle_seq")        
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="seq")               
    private Integer pid;
}

JavaWeb開発を簡単にするために、これらの注釈を使用し始めてください。

97
Rugal

オブジェクトリレーショナルマッピングコンテキストでは、すべてのオブジェクトに一意の識別子が必要です。 @Id 注釈を使用して、エンティティの主キーを指定します。

@GeneratedValue 注釈は、主キーの生成方法を指定するために使用されます。あなたの例では、 Identity 戦略を使用しています

永続性プロバイダーが、データベースID列を使用してエンティティの主キーを割り当てる必要があることを示します。

他の戦略があります、あなたはもっと見ることができます こちら

21
Simply, @Id: This annotation specifies the primary key of the entity. 

@GeneratedValue: This annotation is used to specify the primary key generation strategy to use. i.e Instructs database to generate a value for this field automatically. If the strategy is not specified by default AUTO will be used. 

GenerationType enum defines four strategies: 
1. Generation Type . TABLE, 
2. Generation Type. SEQUENCE,
3. Generation Type. IDENTITY   
4. Generation Type. AUTO

GenerationType.SEQUENCE

With this strategy, underlying persistence provider must use a database sequence to get the next unique primary key for the entities. 

GenerationType.TABLE

With this strategy, underlying persistence provider must use a database table to generate/keep the next unique primary key for the entities. 

GenerationType.IDENTITY
This GenerationType indicates that the persistence provider must assign primary keys for the entity using a database identity column. IDENTITY column is typically used in SQL Server. This special type column is populated internally by the table itself without using a separate sequence. If underlying database doesn't support IDENTITY column or some similar variant then the persistence provider can choose an alternative appropriate strategy. In this examples we are using H2 database which doesn't support IDENTITY column.

GenerationType.AUTO
This GenerationType indicates that the persistence provider should automatically pick an appropriate strategy for the particular database. This is the default GenerationType, i.e. if we just use @GeneratedValue annotation then this value of GenerationType will be used. 

参照: https://www.logicbig.com/tutorials/Java-ee-tutorial/jpa/jpa-primary-key.html

6
SumiSujith