Séquence Hibernate sur oracle, @GeneratedValue (strategy = GenerationType.AUTO)

Je suis usign @GeneratedValue (strategy = GenerationType.AUTO) pour générer l’ID sur mon entité.

Je ne comprends pas maintenant comment cela fonctionne, mais sur ma table enfant, génère des ID, qui suivent la séquence parent.

//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 table @Entity @Table (name = "child") public class Child { @Id @GeneratedValue (strategy = GenerationType.AUTO) @Column (name = "id") private long id; } 

Les valeurs d’identification insérées sur le parent mettent à jour la séquence. Les valeurs d’ID insérées sur l’enfant mettent à jour la séquence. Lors de l’insertion suivante du parent, la séquence … utilise les valeurs mises à jour par les insertions enfants …

Ces annotations ne créent pas deux séquences, mais une seule. Est-ce correct / attendu?

J’ai inséré mes entités avec mon service DAO uniquement à l’aide de entityManager.persist(parent);

Ces annotations ne créent pas deux séquences, mais une seule. Est-ce correct / attendu?

C’est le comportement attendu. Lorsqu’il utilise @GeneratedValue(strategy = GenerationType.AUTO) , le fournisseur JPA choisit une stratégie appropriée pour la firebase database particulière. Dans le cas d’Oracle, il s’agira de SEQUENCE et, comme vous n’avez rien spécifié, Hibernate utilisera une seule séquence globale appelée hibernate_sequence .

Est-ce correct? Eh bien, je ne sais pas, cela dépend de vos besoins. Juste au cas où, la valeur maximale par défaut pour une séquence Oracle est 1E + 27, ou 1 000 000 000 000 000 000 000 000 000 000. C’est assez pour beaucoup.

Il est maintenant possible d’utiliser GenerationType.AUTO et de contrôler le nom de la séquence lorsque la firebase database utilise des séquences:

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

Oui c’est correct et prévu.

Vous pouvez créer des séquences individuelles pour chaque table, mais IMHO est simplement du code supplémentaire sans aucun avantage réel.

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