Secuencia de hibernación en el oracle, @GeneratedValue (strategy = GenerationType.AUTO)

Soy usign @GeneratedValue (strategy = GenerationType.AUTO) para generar el ID en mi entidad.

Ahora no sé cómo funciona, pero en mi tabla secundaria, genera valores de ID, que siguen la secuencia principal.

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

Los valores de ID insertados en el elemento primario actualizan la secuencia. Los valores de ID insertados en el niño actualizan la secuencia. En la siguiente inserción de parent, la secuencia … usa valores actualizados por inserciones de niños …

Estas anotaciones no están creando dos secuencias, solo una. ¿Es esto correcto / esperado?

entityManager.persist(parent); mis entidades con mi servicio DAO solo usando entityManager.persist(parent);

Estas anotaciones no crean dos secuencias, solo una. ¿Es esto correcto / esperado?

Ese es el comportamiento esperado. Al usar @GeneratedValue(strategy = GenerationType.AUTO) , el proveedor de JPA elegirá una estrategia apropiada para la base de datos en particular. En el caso de Oracle, esto será SEQUENCE y, como no especificó nada, Hibernate usará una única secuencia global llamada hibernate_sequence .

¿Es esto correcto? Bueno, no sé, depende de tus necesidades. Por si acaso, el valor máximo predeterminado para una secuencia de Oracle es 1E + 27, o 1,000,000,000,000,000,000,000,000,000. Eso es suficiente para muchos.

Ahora, es posible usar GenerationType.AUTO y aún controlar el nombre de la secuencia cuando la base de datos usa secuencias:

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

Sí, esto es correcto y esperado.

Puede crear secuencias individuales para cada tabla, pero en mi humilde opinión solo es un código extra sin beneficio real.

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