Oracle の Hibernate シーケンス、@GeneratedValue(strategy = GenerationType.AUTO) 質問する

Oracle の Hibernate シーケンス、@GeneratedValue(strategy = GenerationType.AUTO) 質問する

エンティティの ID を生成するために、@GeneratedValue(strategy = GenerationType.AUTO) を使用しています。

どのように動作するかはわかりませんが、子テーブルでは、親シーケンスに従う ID 値が生成されます。

//parent table
@Entity
@Table (name = "parent")
public class Parent {

    @Id
    @GeneratedValue (strategy = GenerationType.AUTO)
    @Column (name = "id")
    private long id;


    @OneToMany (cascade = {CascadeType.ALL}, fetch = FetchType.LAZY)
    @JoinColumn (name = "parentId")
    @ForeignKey (name = "FKparent")
    private List<child> child;

}

//child table
@Entity
@Table (name = "child")
public class Child {

    @Id
    @GeneratedValue (strategy = GenerationType.AUTO)
    @Column (name = "id")
    private long id;
}

親に挿入された ID 値により、シーケンスが更新されます。子に挿入された ID 値により、シーケンスが更新されます。親の次の挿入時に、シーケンスは... 子の挿入によって更新された値を使用します...

この注釈は、2 つのシーケンスを作成するのではなく、1 つのシーケンスのみを作成します。これは正しいですか、または予想どおりですか?

私はDAOサービスを使用してエンティティを挿入しましたentityManager.persist(parent);

ベストアンサー1

これらの注釈は 2 つのシーケンスを作成するのではなく、1 つのシーケンスのみを作成します。これは正しいですか、または予想どおりですか?

これは予想される動作です。 を使用する場合@GeneratedValue(strategy = GenerationType.AUTO)、JPA プロバイダーは特定のデータベースに適した戦略を選択します。 Oracle の場合、これは SEQUENCE になりますが、何も指定していないため、Hibernate は と呼ばれる単一のグローバル シーケンスを使用しますhibernate_sequence

これは正しいでしょうか? わかりません。それはあなたのニーズ次第です。念のため、Oracle シーケンスのデフォルトの最大値は 1E+27、つまり 1,000,000,000,000,000,000,000,000,000 です。多くの場合、これで十分です。

GenerationType.AUTOこれで、データベースがシーケンスを使用するときに、シーケンスの名前を使用し、制御することが可能になりました。

@Id
@GeneratedValue(strategy=GenerationType.AUTO, generator="my_entity_seq_gen")
@SequenceGenerator(name="my_entity_seq_gen", sequenceName="MY_ENTITY_SEQ")
private Long id;

おすすめ記事