Was ist die Verwendung von Annotationen @Id und @GeneratedValue (Strategie = GenerationType.IDENTITY)? Warum ist der Generationentyp Identität?

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

Warum verwenden wir diese Anmerkungen? Ich muss wissen, ob dies meine Tabellen-ID-Werte automatisch erhöht. (GenerationType.IDENTITY) gibt es andere Typen, die tatsächlich passieren, wenn wir diese Annotation verwenden

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

* Ist es notwendig, die abstrakte Domain-Klasse zu erweitern? Was nützt das?

Lijo
quelle

Antworten:

122

Lassen Sie mich diese Frage beantworten:
Zunächst einmal ist die Verwendung von Anmerkungen als Konfigurationsmethode nur eine bequeme Methode, anstatt die endlose XML-Konfigurationsdatei zu kopieren.

Die @IdAnmerkung wird von javax.persistence.Id,geerbt, wobei angegeben wird , dass das unten stehende Elementfeld der Primärschlüssel der aktuellen Entität ist. Daher können Sie im Ruhezustand und im Frühjahr einige reflectArbeiten ausführen, die auf dieser Anmerkung basieren. Für Details überprüfen Sie bitte javadoc für Id

Die @GeneratedValueAnmerkung dient zum Konfigurieren der Inkrementierungsart der angegebenen Spalte (Feld). Beispielsweise können Sie bei der Verwendung in der Definition der Tabelle Mysqlangeben auto_increment, dass sie selbst inkrementell sein soll, und dann verwenden

@GeneratedValue(strategy = GenerationType.IDENTITY)

im Java-Code, um anzuzeigen, dass Sie auch die Verwendung dieser datenbankserverseitigen Strategie bestätigt haben. Sie können den Wert in dieser Anmerkung auch ändern, um ihn an unterschiedliche Anforderungen anzupassen.

1. Definieren Sie die Reihenfolge in der Datenbank

Zum Beispiel muss Oracle sequenceals Inkrementierungsmethode verwenden, sagen wir, wir erstellen eine Sequenz in Oracle:

create sequence oracle_seq;

2. Beziehen Sie sich auf die Datenbanksequenz

Nachdem wir die Sequenz in der Datenbank haben, müssen wir jedoch die Beziehung zwischen Java und DB mithilfe von Folgendem herstellen @SequenceGenerator:

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

sequenceNameist der wirkliche Name einer Sequenz in Oracle, namewie Sie ihn in Java nennen möchten. Sie müssen angeben, sequenceNameob es sich von unterscheidet name, andernfalls verwenden Sie einfach name. Normalerweise ignoriere ich sequenceName, um meine Zeit zu sparen.

3. Verwenden Sie die Sequenz in Java

Schließlich ist es Zeit, diese Sequenz in Java zu verwenden. Fügen Sie einfach hinzu @GeneratedValue:

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

Das generatorFeld bezieht sich darauf, welchen Sequenzgenerator Sie verwenden möchten. Beachten Sie, dass es sich nicht um den tatsächlichen Sequenznamen in der Datenbank handelt, sondern um den Namen, den Sie im nameFeld von angegeben haben SequenceGenerator.

4. Vervollständigen Sie

Die vollständige Version sollte also so aussehen:

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

Verwenden Sie nun diese Anmerkungen, um Ihre JavaWeb-Entwicklung zu vereinfachen.

Rugal
quelle
Die richtige Syntax für die Annotation SequenceGenerator für Oracle 11.2 lautet @SequenceGenerator (name = "seq", sequenceName = "ORACLE_SEQ", assignSize = 1). Andernfalls werden ohne Zuweisungsgrößenparameter sehr seltsam generierte Ergebnisse erzielt (in meinem Fall negativ).
Hariprasad
@hariprasad In meinem Fall ist das Inkrement 10, wenn ich es nicht einstelle. Dies ist jedoch ein optionaler Parameter.
Rugal
Einer meiner Freunde sagte, @Id sei für eine eindeutige Identität. Wenn Sie zuerst dem Code-Ansatz folgen, ist dies der Unterschied zwischen Primärschlüssel und sonst. Kannst du den oben genannten Satz erklären?
P Satish Patro
@PSatishPatro Richtig, ID ist natürlich für eine eindeutige Aufzeichnung. Aber wir werden immer solche Sachen in der Tabellendefinition haben, auch für NoSQL
Rugal
23

In einem objektrelationalen Zuordnungskontext muss jedes Objekt eine eindeutige Kennung haben. Mit der @IdAnnotation geben Sie den Primärschlüssel einer Entität an.

Die @GeneratedValueAnmerkung wird verwendet, um anzugeben, wie der Primärschlüssel generiert werden soll. In Ihrem Beispiel verwenden Sie eine IdentityStrategie, die

Gibt an, dass der Persistenzanbieter der Entität mithilfe einer Datenbankidentitätsspalte Primärschlüssel zuweisen muss.

Es gibt andere Strategien, mehr können Sie hier sehen .

Sotirios Delimanolis
quelle
8
"Gibt an, dass der Persistenzanbieter Primärschlüssel für die Entität mithilfe einer Datenbankidentitätsspalte zuweisen muss." Können Sie dies erläutern
Lijo
2
@ 404 Eine Strategie, die Datenbanken zum Generieren ihrer Primärschlüssel verwenden, besteht darin, eine Tabelle mit einer Spalte (YMMV) zu führen, in der nur zugewiesene IDs gespeichert werden. Wenn eine neue Zeile eingegeben werden muss, wird eine neue ID generiert und verwendet, die ursprünglich nicht in der Tabelle enthalten war.
Sotirios Delimanolis
1
Also automatische Inkrementierung der ID ist es?
Lijo
1
@ 404 Ich denke, es hängt von der Datenbank ab. Mit MySQL sieht es so aus, aber mit anderen DBs kann es anders sein.
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. 

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

SumiSujith
quelle