¿Cuál es el uso de las anotaciones @Id y @GeneratedValue (estrategia = GenerationType.IDENTITY)? ¿Por qué el tipo de generación es identidad?

83
@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY)

¿Por qué usamos estas anotaciones? Necesito saber si este autoincremento mis valores de identificación de tabla. (GenerationType.IDENTITY) ¿hay algún otro tipo que esté sucediendo realmente cuando usamos esta anotación?

public class Author extends Domain
{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "id") 
    private Integer id;

    @Basic(optional = false)
    @Column(name = "name") 
    private String name;

    @Column(name = "address") 
    private String address; 

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "authorId")
    private List<Book>
    bookList;

    public Author()
    { 
        setServiceClassName("wawo.tutorial.service.admin.AuthorService");
    }
}

* ¿Es necesario extender la clase abstracta de dominio ?, ¿para qué sirve?

Lijo
fuente

Respuestas:

122

Permítanme responder a esta pregunta: en
primer lugar, usar anotaciones como nuestro método de configuración es solo un método conveniente en lugar de hacer frente al archivo de configuración XML sin fin.

La @Idanotación se hereda de javax.persistence.Id, lo que indica que el campo de miembro a continuación es la clave principal de la entidad actual. Por lo tanto, su marco de Hibernate y Spring, así como también puede hacer algunos reflecttrabajos basados ​​en esta anotación. para obtener más información, compruebe javadoc para la identificación

La @GeneratedValueanotación es para configurar la forma de incremento de la columna (campo) especificada. Por ejemplo, al usar Mysql, puede especificar auto_incrementen la definición de tabla para que sea auto incremental y luego usar

@GeneratedValue(strategy = GenerationType.IDENTITY)

en el código Java para indicar que también reconoció utilizar esta estrategia del lado del servidor de base de datos. Además, puede cambiar el valor en esta anotación para adaptarse a diferentes requisitos.

1. Definir secuencia en la base de datos

Por ejemplo, Oracle tiene que usar sequencecomo método de incremento, digamos que creamos una secuencia en Oracle:

create sequence oracle_seq;

2. Consulte la secuencia de la base de datos

Ahora que tenemos la secuencia en la base de datos, pero necesitamos establecer la relación entre Java y DB, usando @SequenceGenerator:

@SequenceGenerator(name="seq",sequenceName="oracle_seq")

sequenceNamees el nombre real de una secuencia en Oracle, namees como quiere llamarlo en Java. Debe especificar sequenceNamesi es diferente de name, de lo contrario, simplemente use name. Normalmente lo ignoro sequenceNamepara ahorrar tiempo.

3. Usar secuencia en Java

Finalmente, es hora de hacer uso de esta secuencia en Java. Solo agrega @GeneratedValue:

@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="seq")

El generatorcampo se refiere al generador de secuencias que desea utilizar. Observe que no es el nombre de secuencia real en DB, sino el nombre que especificó en el namecampo de SequenceGenerator.

4. Completa

Entonces, la versión completa debería ser así:

public class MyTable
{
    @Id
    @SequenceGenerator(name="seq",sequenceName="oracle_seq")        
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="seq")               
    private Integer pid;
}

Ahora comience a usar estas anotaciones para facilitar su desarrollo JavaWeb.

Rugal
fuente
La sintaxis adecuada de la anotación SequenceGenerator para Oracle 11.2 es @SequenceGenerator (name = "seq", sequenceName = "ORACLE_SEQ", deploymentSize = 1). De lo contrario, sin el parámetro assignSize, da resultados generados muy extraños (en mi caso negativos).
hariprasad
@hariprasad En mi caso, si no lo configuro, el incremento es 10. Pero aún así, este es un parámetro opcional.
Rugal
Uno de mis amigos dijo que @Id es para identificar de forma única. Si sigue el primer enfoque del código, entonces será la clave principal otra diferencia. ¿Puede explicar la frase anterior?
P Satish Patro
@PSatishPatro Correcto, Id es para un registro único, por supuesto. Pero siempre tendremos este tipo de cosas en la definición de la tabla, incluso para NoSQL
Rugal
23

En un contexto de asignación relacional de objetos, cada objeto debe tener un identificador único. Utiliza la @Idanotación para especificar la clave principal de una entidad.

La @GeneratedValueanotación se utiliza para especificar cómo se debe generar la clave principal. En su ejemplo, está utilizando una Identityestrategia que

Indica que el proveedor de persistencia debe asignar claves primarias para la entidad mediante una columna de identidad de base de datos.

Hay otras estrategias, puedes ver más aquí .

Sotirios Delimanolis
fuente
8
"Indica que el proveedor de persistencia debe asignar claves primarias para la entidad mediante una columna de identidad de la base de datos". ¿Puede explicar esto
Lijo
2
@ 404 Una estrategia que utilizan las bases de datos para generar sus claves primarias es mantener una tabla con una columna (YMMV) donde solo almacenan los identificadores asignados. Cuando se debe ingresar una nueva fila, se generará y usará una nueva identificación que no estaba originalmente en la tabla.
Sotirios Delimanolis
1
Entonces, ¿es el incremento automático de la identificación?
Lijo
1
@ 404 Creo que depende de la base de datos. Con MySQL eso es lo que parece, pero podría ser diferente con otras bases de datos.
Sotirios Delimanolis
11
Simply, @Id: This annotation specifies the primary key of the entity. 

@GeneratedValue: This annotation is used to specify the primary key generation strategy to use. i.e Instructs database to generate a value for this field automatically. If the strategy is not specified by default AUTO will be used. 

GenerationType enum defines four strategies: 
1. Generation Type . TABLE, 
2. Generation Type. SEQUENCE,
3. Generation Type. IDENTITY   
4. Generation Type. AUTO

GenerationType.SEQUENCE

With this strategy, underlying persistence provider must use a database sequence to get the next unique primary key for the entities. 

GenerationType.TABLE

With this strategy, underlying persistence provider must use a database table to generate/keep the next unique primary key for the entities. 

GenerationType.IDENTITY
This GenerationType indicates that the persistence provider must assign primary keys for the entity using a database identity column. IDENTITY column is typically used in SQL Server. This special type column is populated internally by the table itself without using a separate sequence. If underlying database doesn't support IDENTITY column or some similar variant then the persistence provider can choose an alternative appropriate strategy. In this examples we are using H2 database which doesn't support IDENTITY column.

GenerationType.AUTO
This GenerationType indicates that the persistence provider should automatically pick an appropriate strategy for the particular database. This is the default GenerationType, i.e. if we just use @GeneratedValue annotation then this value of GenerationType will be used. 

Referencia: - https://www.logicbig.com/tutorials/java-ee-tutorial/jpa/jpa-primary-key.html

SumiSujith
fuente