@GeneratedValue(strategy = GenerationType.AUTO)を使用して、エンティティにIDを生成します。
私は今ではそれがどのように機能するかはわかりませんが、私の子テーブルで、親シーケンスに従う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つだけを作成します。これは正しいですか?
entityManager.persist(parent);
のみを使用して、エンティティをDAOサービスに挿入しました
これらの注釈は、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;
@Entity
@Table(name = "table_seq")
@SequenceGenerator(name= "NAME_SEQUENCE", sequenceName = "SEQ_ID", initialValue=1, allocationSize = 1)
public class SeqEntity implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="NAME_SEQUENCE")
private Long id;
}
はい、これは正しいことです。
各テーブルに個別のシーケンスを作成できますが、IMHOは実際のメリットがない追加コードです。