Konfigurieren Sie JPA, damit PostgreSQL den Primärschlüsselwert generiert
Also unser Projekt verwenden Sie die PostgreSQL-Datenbank, und wir verwenden JPA zur Bedienung der Datenbank.
Wir haben die Entitäten aus der Datenbank mit automatischer Schöpfer in Netbeans 7.1.2.
Nach kleinen änderungen unsere Primärschlüssel-Werte werden wie folgt beschrieben:
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Basic(optional = false)
@NotNull
@Column(name = "idwebuser", nullable = false)
private Integer idwebuser;
Das problem ist, dass jetzt die Anwendung nicht flexibel, denn wenn wir ändern Sie die Datenbank direkt mit SQL oder einem anderen tool) statt, der durch das Java-app - der Generierte Wert ist niedriger als die tatsächlichen Datenbank-ID-Wert - und so hat man Fehler bei der Erstellung neuer Entitäten.
Gibt es eine Möglichkeit, dass der PPV konnte nur lassen Sie die Datenbank generiert die ID automatisch zu, und dann erhalten Sie es nach dem Prozess?
Oder was wäre eine bessere Lösung?
Danke.
BEARBEITEN
Genauer gesagt:
Wir haben eine Tabelle der Benutzer und mein problem ist, dass mit jeder Art von Strategie generationtype, der PPV ist das einfügen einer neuen Entität mit einer bestimmten durch den generator id. Das ist für mich falsch, denn wenn ich änderungen an der Tabelle auf meine eigene, neue Einträge hinzufügen, die GeneratedValue für die Anwendung ist niedriger als die aktuelle ID - was führt uns zu der Ausnahme mit dupliziert-ID.
Können wir es beheben ;)?
einen kurzen Hinweis auf die Antwort
Es war eine kleine Lüge von meiner Seite, da haben wir einen PG-Admin -> Ansicht den ersten 100 Zeilen und Zeilen bearbeitet von dort statt mit select. SOWIESO, es stellt sich heraus, dass dieser editor irgendwie überspringt der Prozess der Aktualisierung der ID und so auch in der DB, wenn wir schreiben eine ordnungsgemäße FÜGEN Sie es AUSGEFÜHRT wird, mit falschen ID! So war es im Grunde mehr ein problem des Editors, die wir verwendet als die Datenbank und die Anwendung...
nun funktioniert es sogar mit @GeneratedValue(strategy=GenerationType.IDENTITY)
serial
oder einfach nur ein `integer @SequenceGenerator(name="pk_sequence",sequenceName="entity_id_seq") @GeneratedValue(strategy=GenerationType.SEQUENCE,generator="pk_sequence")
Und wir haben gerade einen Fehler Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.2.0.v20110202-r8913): org.eclipse.die Persistenz.Ausnahmen.DatabaseException Internal Exception: org.postgresql.util.PSQLException: FEHLER: doppelter Schlüsselwert verletzt unique-constraint "webuser_idwebuser_pk" Detail: Schlüssel (idwebuser)=(14) existiert bereits.
zu, So scheint es, etwas ist immer noch falsch. InformationsquelleAutor der Frage Atais | 2012-08-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gegeben, die definition der Tabelle:
Nutzung der mapping:
Die Benennung
tablename_columname_seq
ist die PostgreSQL-Standard-Sequenz Namensgebung fürSERIAL
und ich empfehle, dass Sie bleiben.Den
allocationSize=1
ist wichtig, wenn Sie brauchen, Hibernate, um die Zusammenarbeit mit anderen clients an die Datenbank.Beachten Sie, dass diese Sequenz haben "Lücken", wenn Transaktionen zurückgesetzt werden. Transaktionen können ein Rollback für alle Arten von Gründen. Ihre Bewerbung sollte so gestaltet werden, um damit umzugehen.
n
es ist eine id, dien-1
odern+1
n
Hinzugefügt wurde oder begangen, bevor eine id weniger alsn
oder nach einer id größer alsn
. Wenn Sie wirklich vorsichtig sein mit, wie Sie Folgen, die Sie dies tun können, aber Sie sollten nie versuchen; - Datensatz einen timestamp in der Tabelle statt.Sehen die PostgreSQL-Dokumentation für Sequenzen und die serielle Daten-Typen.
Erklären Sie, dass die definition der Tabelle oben ist im Grunde eine Abkürzung für:
... das sollte helfen, erklären, warum wir Hinzugefügt haben, eine
@SequenceGenerator
annotation zu beschreiben, die Abfolge.Wenn Sie wirklich müssen haben eine Lücke-weniger-Sequenz (zum Beispiel Scheck oder Rechnung Nummerierung) siehe lückenlose Sequenzen aber im ernst, vermeiden Sie diese design und nie Verwendung für einen Primärschlüssel.
Hinweis: Wenn Ihre Tabelle-definition sieht wie folgt statt:
und du bist einsetzen in es mit die (unsicher, nicht verwenden):
oder (unsicher ist, wird dies nie tun):
dann du machst es falsch und wechseln sollten, um eine Sequenz (wie oben gezeigt) oder zu einem richtige lückenlose Sequenz-Implementierung mit einem gesperrten Zähler-Tabelle (wieder, siehe oben unter "die lückenlose Abfolge postgresql" in Google). Beide oben das falsche tun, wenn es jemals mehr als eine Verbindung auf die Datenbank.
InformationsquelleAutor der Antwort Craig Ringer
Bitte, versuchen, Sie zu nutzen
GenerationType.TABLE
stattGenerationType.IDENTITY
. Datenbank erstellen Sie separate Tabelle, die verwendet werden zum generieren von eindeutigen Primärschlüsseln, es wird auch zum speichern von zuletzt verwendeten id-Nummer.InformationsquelleAutor der Antwort Leszek
Es scheint, Sie haben die Verwendung der Sequenz-generator wie:
InformationsquelleAutor der Antwort Denis Zevakhin
Können Sie auch sparen Sie sich einige Mühe, durch das schreiben eines Skripts, führen Sie eine Massen-Konvertierung des generischen
GenerationType.IDENTITY
zu der vorgeschlagenen Lösung durch die ausgewählte Antwort. Die unten Drehbuch hat einige leichte Abhängigkeiten auf, wie die Java-Quellcode-Datei ist formatiert und wird änderungen vornehmen, ohne sicherungen. Caveat emptor!Nachdem das script ausgeführt wurde:
import javax.persistence.Table;
mitimport javax.persistence.Table; import javax.persistence.SequenceGenerator;
.Speichern Sie das folgende Skript als
update-sequences.sh
oder ähnliches:Beim generieren des CRUD-Anwendung mit NetBeans, die ID-Attribute nicht editierbare Eingabefelder.
InformationsquelleAutor der Antwort Dave Jarvis