エンティティの 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;