web-dev-qa-db-de.com

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

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

* Muss die abstrakte Klasse der Domain erweitert werden? Wozu dient dies?

64
Lijo

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

Das @Idannotation ist vererbt von javax.persistence.Id , Gibt an, dass das Elementfeld unten der Primärschlüssel der aktuellen Entität ist. Daher können Ihr Hibernate- und Spring-Framework sowie Sie einige reflect Arbeiten basierend auf dieser Annotation ausführen. Für Details überprüfen Sie bitte Javadoc für Id

Das @GeneratedValue Annotation dient zum Konfigurieren der Inkrementierungsmethode für die angegebene Spalte (Feld). Wenn Sie beispielsweise Mysql verwenden, können Sie auto_increment in der Definition der Tabelle, um sie selbst inkrementell zu machen, und verwenden Sie dann

@GeneratedValue(strategy = GenerationType.IDENTITY)

im Code Java, der angibt, dass Sie auch die Verwendung dieser Datenbankserverseitenstrategie bestätigt haben. Außerdem können Sie den Wert in dieser Anmerkung ändern, um ihn an andere Anforderungen anzupassen.

1. Definieren Sie die Reihenfolge in der Datenbank

Beispielsweise muss Oracle sequence als Inkrementierungsmethode verwenden. Angenommen, wir erstellen eine Sequenz in Oracle:

create sequence Oracle_seq;

2. Beziehen Sie sich auf die Datenbanksequenz

Jetzt haben wir die Sequenz in der Datenbank, aber wir müssen die Beziehung zwischen Java und DB herstellen, indem wir @SequenceGenerator :

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

sequenceName ist der echte Name einer Sequenz in Oracle, name ist das, was Sie in Java nennen möchten. Sie müssen sequenceName angeben, wenn es sich von name unterscheidet, 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 an der Zeit, diese Sequenz in Java zu verwenden. Einfach hinzufügen @GeneratedValue :

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

Das Feld generator gibt an, welchen Sequenzgenerator Sie verwenden möchten. Beachten Sie, dass es sich nicht um den tatsächlichen Sequenznamen in DB handelt, sondern um den Namen, den Sie im Feld name von SequenceGenerator angegeben haben.

4. Vervollständigen

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

Beginnen Sie jetzt damit, diese Anmerkungen zu verwenden, um Ihre JavaWeb-Entwicklung zu vereinfachen.

97
Rugal

In einem objektrelationalen Zuordnungskontext muss jedes Objekt eine eindeutige Kennung haben. Sie verwenden die @Id Annotation zur Angabe des Primärschlüssels einer Entität.

Das @GeneratedValue annotation wird verwendet, um anzugeben, wie der Primärschlüssel generiert werden soll. In Ihrem Beispiel verwenden Sie eine Identity Strategie, die

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

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

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. 

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

6
SumiSujith