2009-02-24 17 views
18

Ich versuche zu lernen, wie Hibernate funktioniert, und ich renne in eine fast inakzeptable Lernkurve. Ich kann nicht erkennen, wie Hibernate die Richtlinie auto_increment für meine Objekte einhalten kann. Stattdessen wird es Einträge in der Datenbank mit vorhandenen IDs überschrieben wird, beginnend mit 1.Hibernate nicht respektieren MySQL auto_increment Primärschlüssel Feld

Ich habe eine einfache Foo Objekt, durch eine Tabelle wie folgt definiert MySQL unterstützt:

CREATE TABLE `Foo` (
    `fooId` int(11) NOT NULL AUTO_INCREMENT, 
    PRIMARY KEY (`fooId`), 
) 

ich, dass das Einfügen mehrerer bestätigt haben Foo Objekte von Hand mit SQL (insert into Foo values();) macht das Richtige.

Meine Java-Klasse hat die ID mit Anmerkungen wie folgt angegeben:

@Id 
@GeneratedValue(strategy=GenerationType.AUTO) 
@Column(name="fooId") 
private Integer id; 

ich dann einige Test-Code auszuführen, die Foo Objekte einfach instanziert und speichert sie in der Datenbank (mit session.save(obj)). Es scheint, dass es eine eigene Primärschlüsselsequenz verwendet, die mit eins beginnt, und nicht auf die Schlüsselrichtlinie der Tabelle schaut. Es überschreibt was auch immer da war.

Ich habe versucht, Variationen über das @GeneratedValue Bit (unter Verwendung aller möglichen Strategien, die parenthetical Klausel verlassen). Jemand schlug sogar vor, die GeneratedValue ganz wegzulassen. Nichts scheint zu funktionieren.

Verlasse ich etwas? Was vermisse ich? Ist Hibernate wirklich so schwer?

(Wenn jemand eine alternative Java Datenbankpersistenz Option hat, bitte ein vorschlagen. Ich Prototypen mache, nicht dauerhafte mondo-engineered Projekten.)

+9

+1 für "fast inakzeptable Lernkurve" –

+0

Dito. Hibernate ist nicht so flüssig wie EJB2, und viel davon hat mit Entwicklern zu tun, die sich weigern, Sachen zu unterstützen, als technische Gründe. – Zds

+0

Hibernate 5.x verwendet IDENTITY nicht mehr, wenn Sie GenerationType.AUTO angeben. Stattdessen wird nach der Tabelle hibernate_sequence für die nächste ID gesucht. – Mohsen

Antwort

28

Ich glaube, Sie GenerationType.IDENTITY wollen. MySql verwendet keine Tabelle oder Sequenz zum Generieren des ID-Werts.

+0

Hallo Clint, und danke für die Antwort. Du hast recht. Aber das hat mein Problem zunächst nicht gelöst, denn ich hatte ein subtiles, abscheuliches Problem, das allem zugrunde liegt. Ich werde meine Antwort unter meiner ursprünglichen Frage posten. –

+3

Äh, ich habe es mir anders überlegt, ich beantworte es hier. Ich war mit einem hibernate.cfg.xml ein Typ auf der Website abfeilen, und es hatte dies: erstellen Dieses System vorgenommen, um meine neu zu erstellen Tabelle jedes Mal, wenn ich meine App lief. Es zu kommentieren löste das Problem. –

+0

Man hatte genau das gleiche Problem mit create, thx für das finden; p – finpingvin

1

ich folgend mit auto_increment verwenden, funktioniert perfekt:

@Id 
@GeneratedValue(strategy = IDENTITY) 
@Column(name = "db_id", unique = true, nullable = false) 
public Long getDbId() { 
    return this.dbId; 
} 

public void setDbId(Long dbId) { 
    this.dbId = dbId; 
} 
5

ich dies unter der akzeptierten Antwort in einem Kommentar geschrieben, aber die sind nicht dargestellt Standardmäßig poste ich es als Antwort neu. diese

Ich war mit einem hibernate.cfg.xml ein Typ auf der Website abfeilen, und es hatte:

<property name="hibernate.hbm2ddl.auto">create</property> 

Dieses System vorgenommen zu meinem Tisch jedes Mal, wenn ich meine app neu erstellen lief. Es zu kommentieren löste das Problem.

Die anderen zwei Antworten zu den verschiedenen Möglichkeiten zum Erstellen von IDs sind korrekt.Mein ursprüngliches Problem Symptom schien mit ID-Generierung zu tun, aber der eigentliche Grund war Fehlkonfiguration.

+0

Sie können diesen Wert auch auf 'update' setzen, wenn Sie nur wollen, dass die Datenbank automatisch mit Ihren Einstellungen übereinstimmt Löschen der Daten Die Dokumentation: https://docs.jboss.org/hibernate/orm/3.3/reference/en-US/html/session-configuration.html#configuration-misc-properties – rjferguson

0

Sie vielleicht einen Blick auf haben wollen: http://hibernatepojoge.sourceforge.net/

Sie behauptet, eine voll funktionierende Anwendung (Spring, Hibernate, JUnit-Tests, etc.) zu erstellen, indem es auf eine DB zeigen.

Verwandte Themen