web-dev-qa-db-fra.com

à quoi servent les annotations @Id et @GeneratedValue (strategy = GenerationType.IDENTITY)? Pourquoi le type de génération est identité?

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY)

Pourquoi utilisons-nous ces annotations? J'ai besoin de savoir si cela auto-incrémente mes valeurs d'identifiant de table. (GenerationType.IDENTITY) existe-t-il d'autres types de ce qui se passe réellement lorsque nous utilisons cette annotation?

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");
    }
}

* Est-il nécessaire d'étendre la classe abstraite de domaine? À quoi sert-elle?

64
Lijo

Permettez-moi de répondre à cette question:
Tout d’abord, utiliser des annotations comme méthode de configuration n’est qu’une méthode pratique au lieu de traiter le fichier de configuration XML sans fin.

L'annotation _@Id_ est héritée de _javax.persistence.Id_ ,, indiquant que le champ de membre ci-dessous est la clé primaire de l'entité actuelle. Par conséquent, votre framework Hibernate et spring ainsi que vous pouvez faire quelques travaux reflect basés sur cette annotation. pour plus de détails s'il vous plaît vérifier javadoc pour Id

L'annotation _@GeneratedValue_ permet de configurer le mode d'incrémentation de la colonne (champ) spécifiée. Par exemple, lorsque vous utilisez Mysql, vous pouvez spécifier _auto_increment_ dans la définition de table pour le rendre auto-incrémental, puis utiliser

_@GeneratedValue(strategy = GenerationType.IDENTITY)
_

dans le code Java pour indiquer que vous avez également reconnu utiliser cette stratégie côté serveur de base de données. Vous pouvez également modifier la valeur de cette annotation pour l'adapter à différentes exigences.

1. Définir la séquence dans la base de données

Par exemple, Oracle doit utiliser sequence comme méthode d'incrémentation, par exemple, nous créons une séquence dans Oracle:

_create sequence Oracle_seq;
_

2. Référer la séquence de base de données

Maintenant que nous avons la séquence dans la base de données, mais que nous devons établir la relation entre Java et DB, en utilisant @SequenceGenerator :

_@SequenceGenerator(name="seq",sequenceName="Oracle_seq")
_

sequenceName est le vrai nom d'une séquence dans Oracle, name est ce que vous voulez appeler en Java. Vous devez spécifier sequenceName s'il est différent de name, sinon, utilisez simplement name. J'ignore généralement sequenceName pour gagner du temps.

3. Utiliser la séquence en Java

Enfin, il est temps d'utiliser cette séquence en Java. Ajoutez simplement @GeneratedValue :

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

Le champ generator fait référence au générateur de séquence que vous souhaitez utiliser. Notez que ce n'est pas le vrai nom de séquence dans la BD, mais le nom que vous avez spécifié dans le champ name de SequenceGenerator.

4. complète

Donc la version complète devrait ressembler à ceci:

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

Maintenant, commencez à utiliser ces annotations pour faciliter votre développement JavaWeb.

97
Rugal

Dans un contexte de mappage relationnel d'objet, chaque objet doit avoir un identifiant unique. Vous utilisez l'annotation @Id pour spécifier la clé primaire d'une entité.

L'annotation @GeneratedValue est utilisée pour spécifier comment la clé primaire doit être générée. Dans votre exemple, vous utilisez une stratégie Identity qui

Indique que le fournisseur de persistance doit affecter des clés primaires pour l'entité à l'aide d'une colonne d'identité de base de données.

Il y a d'autres stratégies, vous pouvez en voir plus ici .

21
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. 

Référence: - https://www.logicbig.com/tutorials/Java-ee-tutorial/jpa/jpa-primary-key.html

6
SumiSujith