web-dev-qa-db-ja.com

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

@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サービスに挿入しました

20
Moli

これらの注釈は、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;
46
Pascal Thivent
@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;

}
1
Elton Sandré

はい、これは正しいことです。

各テーブルに個別のシーケンスを作成できますが、IMHOは実際のメリットがない追加コードです。

1
Jens Schauder