1. ホーム
  2. java

[解決済み] アノテーション @Id と @GeneratedValue(strategy = GenerationType.IDENTITY) はどのように使うのですか?なぜGenerationTypeがIDENTITYなのですか?

2022-03-07 05:04:08

質問

@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");
    }
}

*Domain抽象クラスを拡張する必要はありますか?

どのように解決するのですか?

まず、configureメソッドにアノテーションを使うのは、延々とXML設定ファイルをコピーする代わりに便利な方法です。

を使用します。 @Id のアノテーションを継承しています。 javax.persistence.Id 以下のメンバフィールドが現在のエンティティの主キーであることを示します。したがって、Hibernateとspringフレームワークだけでなく、いくつかの reflect は、このアノテーションに基づいて動作します。 IDのjavadoc

@GeneratedValue アノテーションは、指定されたカラム(フィールド)の増加方法を設定するためのものです。たとえば Mysql を指定することができます。 auto_increment テーブルの定義で、自己インクリメントにするために

@GeneratedValue(strategy = GenerationType.IDENTITY)

をJavaコードに追加することで、このデータベースサーバー側の戦略を使用することも認めていることを示します。また、このアノテーションの値は、異なる要件に合うように変更することができます。

1. データベースでのシーケンスの定義

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

create sequence oracle_seq;

2. データベースの配列を参照する

さて、データベースには配列がありますが、JavaとDBの関係を確立する必要があります。 @SequenceGenerator :

@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にある実際のシーケンス名ではなく name フィールドの SequenceGenerator .

4. 完成

つまり、完全版はこのようになるはずです。

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

さて、これらのアノテーションを使って、JavaWebの開発をより簡単にしましょう。