Auto Increment ID im Ruhezustand


85

Ich habe eine j2ee-Anwendung, die den Ruhezustand mit Anmerkungen verwendet. Wie kommentiere ich das ID-Feld in meiner Pojo-Klasse, um es als automatisch inkrementiert oder automatisch generiert festzulegen? und lasse ich beim Hinzufügen der Bean dieses Feld in meiner Bean null?

Antworten:


159
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;

und du lässt es null( 0), wenn du fortbestehst. ( nullwenn Sie die Integer/ Longwrapper verwenden)

In einigen Fällen wird die AUTOStrategie auf SEQUENCErathen als auf IDENTITYoder aufgelöst. Daher TABLEmöchten Sie sie möglicherweise manuell auf IDENTITYoder einstellen TABLE(abhängig von der zugrunde liegenden Datenbank).

Es scheint, SEQUENCE+ den Sequenznamen anzugeben, der für Sie gearbeitet hat.


Meine ID ist vom Typ Zeichenfolge. Was werde ich darauf einstellen? Weil ich diesen Fehler bekomme. Auslöser: javax.el.ELException: org.hibernate.exception.SQLGrammarException: Der nächste Sequenzwert konnte nicht
abgerufen

4
Autoincrement bedeutet, dass es sich um eine Zahl handelt, die inkrementiert wird. Ein String kann nicht inkrementiert werden. Machen Sie die Spalte int
Bozho

Die myid-Spalte in der Datenbank hat die Typennummer. Und ich habe meine ID in meinem Pojo bereits in int geändert. Ich bekomme die Fehlerfolge existiert nicht
Cedric

2
Für Oracle ist SEQUENCE der automatischen Inkrementierung am nächsten. Sie müssen die Sequenz im Voraus erstellen, es sei denn, Sie lassen Hibernate Ihr Schema generieren. Wenn Sie glauben, dass Sie irgendwann mehrere Datenbanken unterstützen könnten, verwenden Sie TABLE.
Brian Deterling

2
Verwenden Sie keine Identität, Oracle unterstützt keine Identität, es unterstützt die Sequenz.
JuanZe

32

Gehen Sie wie folgt vor: -

@Id
@GenericGenerator(name="kaugen" , strategy="increment")
@GeneratedValue(generator="kaugen")
@Column(name="proj_id")
  public Integer getId() {
    return id;
 }

Sie können anstelle von kaugen einen beliebigen Namen verwenden. Es hat gut funktioniert, ich konnte unten Abfragen auf der Konsole sehen

Hibernate: select max(proj_id) from javaproj
Hibernate: insert into javaproj (AUTH_email, AUTH_firstName, AUTH_lastName, projname,         proj_id) values (?, ?, ?, ?, ?)

Dieser arbeitet für mich. Aber ich kann den ID-Wert nicht festlegen. Ich habe versucht, ID mit Ganzzahlen oder int zu setzen, aber es wird jederzeit max verwendet. Was soll ich machen?
Desudesudesu

Verwenden Sie @GenericGenerator (Name = "InkrementId", Strategie = "zugewiesen") @GeneratedValue (Generator = "InkrementId"). Sie können die ID selbst festlegen. Wenn Sie die ID nicht übergeben, ist sie 0.
Ravi Kant

@Kaushik Lele Ist die Strategie = "Inkrement" im Ruhezustand der eingebauten Inkrement-Strategie? Kommt es unter welche dieser SEQUENZ, IDENTITÄT, AUTO, TABELLE?
Wohlfühlen und Programmieren

Wie wäre es mit 700 Millionen Datensätzen in der Tabelle? Dies könnte das Problem ohne Index sein, denke ich
user2171669

9

Zu Ihrer Information

Wenn Sie netbeans New Entity Classes aus der Datenbank mit einer mysql * auto_increment * -Spalte verwenden, erstellen Sie ein Attribut mit den folgenden Anmerkungen:

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id")
@NotNull
private Integer id;

Dies brachte mir den gleichen Fehler, dass die Spalte nicht null sein darf, also habe ich einfach die @ NotNull-Anotation entfernt, wobei das Attribut null belassen wurde, und es funktioniert!


7

Der Ruhezustand definiert fünf Arten von Strategien zur Generierung von Kennungen:

AUTO - entweder Identitätsspalte, Sequenz oder Tabelle, abhängig von der zugrunde liegenden Datenbank

TABELLE - Tabelle mit der ID

IDENTITY - Identitätsspalte

SEQUENZ - Sequenz

Identitätskopie - Die Identität wird von einer anderen Entität kopiert

Beispiel mit Tabelle

@Id
@GeneratedValue(strategy=GenerationType.TABLE , generator="employee_generator")
@TableGenerator(name="employee_generator", 
                table="pk_table", 
                pkColumnName="name", 
                valueColumnName="value",                            
                allocationSize=100) 
@Column(name="employee_id")
private Long employeeId;

Weitere Informationen finden Sie unter dem Link .


4

Wenn Sie eine numerische Spalte haben, die Sie automatisch inkrementieren möchten, können Sie diese möglicherweise columnDefinitiondirekt festlegen . Dies hat den Vorteil, dass das Schema den Wert automatisch generiert, auch wenn er ohne Ruhezustand verwendet wird. Dies könnte Ihren Code jedoch db-spezifisch machen:

import javax.persistence.Column;
@Column(columnDefinition = "serial") // postgresql

MySQL ist @Column (columnDefinition = "integer auto_increment")
yeralin

1

Für den Fall, dass jemand in dieser SO-Frage auf der Suche nach Strategien für die Informix- Tabelle "stößt", wenn PK vom Typ Seriell ist .

Ich habe festgestellt, dass dies funktioniert ... als Beispiel.

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name = "special_serial_pk")
private Integer special_serial_pk;

Damit dies funktioniert, stellen Sie sicher, dass Sie beim Ausführen von session.SaveOrUpdate den Wert für die Spalte special_serial_pk NULL übergeben .

In meinem Fall mache ich einen HTML POST mit JSON wie folgt ...

{
"special_serial_pk": null, //<-- Field to be incremented
"specialcolumn1": 1,
"specialcolumn2": "I love to code",
"specialcolumn3": true
}

0

Verwenden von NetBeans Neue Entitätsklassen aus der Datenbank mit einer MySQL mysql- Spalte auto_increment verwenden , wird ein Attribut mit der folgenden Datei hibernate.hbm.xml erstellt: id ist das automatische Inkrementieren

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.