Das Problem besteht darin, den Objektoperator in MySQL DB zu speichern. Vor dem Speichern versuche ich, aus dieser Tabelle auszuwählen, und es funktioniert, ebenso wie die Verbindung zu db.
Hier ist mein Operator-Objekt:
@Entity
public class Operator{
@Id
@GeneratedValue
private Long id;
private String username;
private String password;
private Integer active;
//Getters and setters...
}
So speichern ich PPV EntityManager
‚s - persist
Methode.
Hier ist ein Protokoll:
Hibernate: insert into Operator (active, password, username, id) values (?, ?, ?, ?)
com.mysql.jdbc.JDBC4PreparedStatement@15724a0: insert into Operator (active,password, username, id) values (0, 'pass', 'user', ** NOT SPECIFIED **)
So wie ich es sehe, ist das Problem die Konfiguration mit automatischer Inkrementierung, aber ich kann nicht herausfinden, wo.
Ich habe einige Tricks ausprobiert, die ich hier gesehen habe: Ruhezustand ohne Berücksichtigung des MySQL-Primärschlüsselfelds auto_increment Aber nichts davon hat funktioniert
Wenn andere Konfigurationsdateien benötigt werden, werde ich diese bereitstellen.
DDL:
CREATE TABLE `operator` (
`id` INT(10) NOT NULL AUTO_INCREMENT,
`first_name` VARCHAR(40) NOT NULL,
`last_name` VARCHAR(40) NOT NULL,
`username` VARCHAR(50) NOT NULL,
`password` VARCHAR(50) NOT NULL,
`active` INT(1) NOT NULL,
PRIMARY KEY (`id`)
)
Antworten:
Um eine MySQL-
AUTO_INCREMENT
Spalte zu verwenden, müssen Sie eineIDENTITY
Strategie verwenden:Welches ist, was Sie erhalten würden, wenn Sie
AUTO
mit MySQL verwenden:Welches ist eigentlich gleichbedeutend mit
Mit anderen Worten, Ihr Mapping sollte funktionieren. Im Ruhezustand sollte die
id
Spalte in der SQL-Anweisung insert jedoch weggelassen werden. Irgendwo muss es eine Art Missverhältnis geben.Haben Sie in Ihrer Hibernate-Konfiguration einen MySQL-Dialekt angegeben (wahrscheinlich
MySQL5InnoDBDialect
oderMySQL5Dialect
abhängig von der verwendeten Engine)?Wer hat die Tabelle erstellt? Können Sie die entsprechende DDL anzeigen?
Follow-up: Ich kann Ihr Problem nicht reproduzieren. Mit dem Code Ihrer Entität und Ihrer DDL generiert Hibernate mit MySQL das folgende (erwartete) SQL:
Beachten Sie, dass die
id
Spalte in der obigen Anweisung erwartungsgemäß fehlt.Zusammenfassend lässt sich sagen, dass Ihr Code, die Tabellendefinition und der Dialekt korrekt und kohärent sind. Es sollte funktionieren. Wenn dies nicht der Fall ist, ist möglicherweise etwas nicht synchron (führen Sie einen sauberen Build durch, überprüfen Sie das Build-Verzeichnis noch einmal usw.) oder etwas anderes stimmt einfach nicht (überprüfen Sie die Protokolle auf verdächtige Daten).
In Bezug auf den Dialekt besteht der einzige Unterschied zwischen
MySQL5Dialect
oderMySQL5InnoDBDialect
darin, dass der letztereENGINE=InnoDB
beim Generieren der DDL zu den Tabellenobjekten hinzugefügt wird. Die Verwendung des einen oder anderen ändert nichts an der generierten SQL.quelle
@GeneratedValue(strategy=GenerationType.IDENTITY)
wenn Sie schreiben@GeneratedValue(strategy=GenerationType.AUTO)
und@GeneratedValue
. Sei also vorsichtig und versuche wortreich zu sein.Mit MySQL funktionierte nur dieser Ansatz für mich:
Die anderen beiden Ansätze, die Pascal in seiner Antwort angegeben hat, haben bei mir nicht funktioniert.
quelle
JPA
mitspring-boot
undMySQL
.Für alle, die dies lesen und EclipseLink für JPA 2.0 verwenden, sind hier die beiden Anmerkungen, die ich verwenden musste, damit JPA Daten beibehält. Dabei ist "MySequenceGenerator" der Name, den Sie dem Generator geben möchten. "Myschema" ist der Name des Schema in Ihrer Datenbank, das das Sequenzobjekt enthält, und "mysequence" ist der Name des Sequenzobjekts in der Datenbank.
Für Benutzer von EclipseLink (und möglicherweise anderer JPA-Anbieter) ist es KRITISCH, dass Sie das Attribut assignSize so einstellen, dass es mit dem für Ihre Sequenz in der Datenbank definierten INCREMENT-Wert übereinstimmt. Wenn Sie dies nicht tun, erhalten Sie einen generischen Persistenzfehler und verschwenden viel Zeit damit, ihn aufzuspüren, wie ich es getan habe. Hier ist die Referenzseite, die mir geholfen hat, diese Herausforderung zu meistern:
http://wiki.eclipse.org/EclipseLink/Examples/JPA/PrimaryKey#Using_Sequence_Objects
Um den Kontext zu verdeutlichen, verwenden wir Folgendes:
Java 7 Glassfish 3.1 PostgreSQL 9.1 PrimeFaces 3.2 / JSF 2.1
Aus Gründen der Faulheit habe ich dies in Netbeans mit den Assistenten zum Generieren von Entitäten aus DB, Controllern aus Entitäten und JSF aus Entitäten erstellt, und die Assistenten wissen (offensichtlich) nicht, wie sie mit sequenzbasierten ID-Spalten umgehen sollen Sie müssen diese Anmerkungen manuell hinzufügen.
quelle
Wenn Sie MySQL mit Hibernate v3 verwenden, ist es in Ordnung, es zu verwenden,
GenerationType.AUTO
da es intern verwendet wirdGenerationType.IDENTITY
, was für MySQL am optimalsten ist.In Hibernate v5 hat sich dies jedoch geändert.
GenerationType.AUTO
wird verwendet,GenerationType.TABLE
was zu viele Abfragen für das Einfügen generiert.Sie können dies vermeiden,
GenerationType.IDENTITY
wenn Sie (wenn MySQL die einzige Datenbank ist, die Sie verwenden) oder mit diesen Notationen (wenn Sie mehrere Datenbanken haben):quelle
quelle
Ich habe alles versucht, aber ich konnte das immer noch nicht. Ich verwende MySQL, JPA mit Ruhezustand. Ich habe mein Problem behoben, indem ich im Konstruktor den Wert ID 0 zugewiesen habe. Nachfolgend ist mein ID-Deklarationscode aufgeführt
quelle
Da Sie bei der Datenbankerstellung die ID im Typ int definiert haben, müssen Sie denselben Datentyp auch in der Modellklasse verwenden. Und da Sie die ID für das automatische Inkrementieren in der Datenbank definiert haben, müssen Sie sie in der Modellklasse erwähnen, indem Sie den Wert 'GenerationType.AUTO' an das Attribut 'Strategie' in der Annotation @GeneratedValue übergeben. Dann wird der Code wie folgt.
quelle
Wie Pascal geantwortet, müssen Sie nur, wenn Sie aus irgendeinem Grund .AUTO verwenden müssen, nur Ihre Anwendungseigenschaften hinzufügen:
quelle
Können Sie überprüfen, ob Sie eine Verbindung zur richtigen Datenbank hergestellt haben? Als ich vor dem gleichen Problem stand, stellte ich schließlich fest, dass ich mich mit einer anderen Datenbank verbunden hatte.
Identität unterstützt Identitätsspalten in DB2, MySQL, MS SQL Server, Sybase und HypersonicSQL. Der zurückgegebene Bezeichner ist vom Typ long, short oder int.
Weitere Informationen: http://docs.jboss.org/hibernate/orm/3.5/reference/en/html/mapping.html#mapping-declaration-id
quelle