2010-06-18 37 views
18

Me llamo @GeneratedValue (strategy = GenerationType.AUTO) para generar la ID en mi entidad.Secuencia de hibernación en Oracle, @GeneratedValue (strategy = GenerationType.AUTO)

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; 

} 

//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 elemento secundario actualizan la secuencia. En la siguiente inserción del elemento principal, la secuencia ... usa valores actualizados por inserciones secundarias ...

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

He introducido entidades con mi servicio DAO utilizando sólo entityManager.persist(parent);

Respuesta

1

Si 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 ningún beneficio real.

+0

No si el usuario final ve que las llaves y se engañados por que ser " asustadizo". Y no me diga que la clave necesita estar oculta para el usuario, eso no siempre es posible ... – Monoman

+1

No hay forma de mantener los identificadores constantes a tiempo y monótonos y sin agujeros en la secuencia, eso no mata escalabilidad. Tampoco he visto una definición útil de 'jumpy' y por qué los usuarios necesitan IDs sin saltos. –

44

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, dado que 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 el uso de GenerationType.AUTO y todavía controlar el nombre de la secuencia cuando la base de datos utiliza secuencias:

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

Pascal, pero si quiere usar GenerationType.AUTO para permitir que otras bases de datos como MySQL usen Identity Insert esto no funcionará, ¿no? Porque usted especifica manualmente un generador – lujop

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

} 
Cuestiones relacionadas