Hibernate erzeugt falsches SQL Statement (Hibernate & mySql)

Status
Nicht offen für weitere Antworten.

neonfly

Aktives Mitglied
Guten Tag,

ich habe folgendes JDO:

Java:
package org.pss.jdo;

import java.io.Serializable;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
import javax.persistence.GenerationType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Temporal;

/**
 *
 * @author neonfly
 */

@Entity
@Table(name = "players")
@NamedQueries({
    @NamedQuery(name = "Player.all", query = "from Player order by playerId")
})
public class Player implements Serializable {

    public static String GET_ALL = "Player.all";

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Integer playerId;

    @Column(nullable = false, length = 30)
    private String nick;

//    @Column(nullable = false, length = 100)
//    private String email;
//
//    @Column(nullable = false, length = 40)
//    private String password;
//
//    @Column(nullable = false, length = 255)
//    private String securequestion;
//
//    @Column(nullable = false, length = 255)
//    private String secureanswer;
//
//    @Column(nullable = false, length = 100)
//    private String firstname;
//
//    @Column(nullable = false, length = 100)
//    private String surname;

//    @Column(nullable = false, length = 100)
//    private String street;

//    private Integer streetnumber;
//
//    private Integer postalcode;

//    @Column(nullable = false, length = 100)
//    private String city;
//
//    @Column(nullable = false, length = 100)
//    private String country;
//
//    @Column(nullable = false, length = 100)
//    private String region;

//    private Integer phone;
//
//    private Integer mobilephone;

//    @Column(nullable = false, length = 10)
//    private String gender;
//
//    @Column(nullable = false, length = 10)
//    private String birthday;

//    @Temporal(javax.persistence.TemporalType.DATE)
//    private Date regdate;
//
//    @Column(length=1)
//    private boolean termsaccepted;
//
//    private Integer aiprotection;
    

    public Player() {
        
    }

    public static String getGET_ALL() {
        return GET_ALL;
    }

    public static void setGET_ALL(String GET_ALL) {
        Player.GET_ALL = GET_ALL;
    }

//    public Integer getAiprotection() {
//        return aiprotection;
//    }
//
//    public void setAiprotection(Integer aiprotection) {
//        this.aiprotection = aiprotection;
//    }

//    public String getBirthday() {
//        return birthday;
//    }
//
//    public void setBirthday(String birthday) {
//        this.birthday = birthday;
//    }
//
//    public String getCity() {
//        return city;
//    }
//
//    public void setCity(String city) {
//        this.city = city;
//    }
//
//    public String getCountry() {
//        return country;
//    }
//
//    public void setCountry(String country) {
//        this.country = country;
//    }

//    public String getEmail() {
//        return email;
//    }
//
//    public void setEmail(String email) {
//        this.email = email;
//    }
//
//    public String getFirstname() {
//        return firstname;
//    }
//
//    public void setFirstname(String firstname) {
//        this.firstname = firstname;
//    }
//
//    public String getGender() {
//        return gender;
//    }
//
//    public void setGender(String gender) {
//        this.gender = gender;
//    }

//    public Integer getMobilephone() {
//        return mobilephone;
//    }
//
//    public void setMobilephone(Integer mobilephone) {
//        this.mobilephone = mobilephone;
//    }

    public String getNick() {
        return nick;
    }

    public void setNick(String nick) {
        this.nick = nick;
    }

//    public String getPassword() {
//        return password;
//    }
//
//    public void setPassword(String password) {
//        this.password = password;
//    }

//    public Integer getPhone() {
//        return phone;
//    }
//
//    public void setPhone(Integer phone) {
//        this.phone = phone;
//    }

//    public Integer getPlayerId() {
//        return playerId;
//    }
//
//    public void setPlayerId(Integer playerId) {
//        this.playerId = playerId;
//    }

//    public Integer getPostalcode() {
//        return postalcode;
//    }
//
//    public void setPostalcode(Integer postalcode) {
//        this.postalcode = postalcode;
//    }
//
//    public Date getRegdate() {
//        return regdate;
//    }
//
//    public void setRegdate(Date regdate) {
//        this.regdate = regdate;
//    }

//    public String getSecureanswer() {
//        return secureanswer;
//    }
//
//    public void setSecureanswer(String secureanswer) {
//        this.secureanswer = secureanswer;
//    }
//
//    public String getSecurequestion() {
//        return securequestion;
//    }
//
//    public void setSecurequestion(String securequestion) {
//        this.securequestion = securequestion;
//    }
//
//    public String getRegion() {
//        return region;
//    }
//
//    public void setRegion(String region) {
//        this.region = region;
//    }

//    public String getStreet() {
//        return street;
//    }
//
//    public void setStreet(String street) {
//        this.street = street;
//    }

//    public Integer getStreetnumber() {
//        return streetnumber;
//    }
//
//    public void setStreetnumber(Integer streetnumber) {
//        this.streetnumber = streetnumber;
//    }

//    public String getSurname() {
//        return surname;
//    }
//
//    public void setSurname(String surname) {
//        this.surname = surname;
//    }

//    public Boolean getTermsaccepted() {
//        return termsaccepted;
//    }
//
//    public void setTermsaccepted(Boolean termsaccepted) {
//        this.termsaccepted = termsaccepted;
//    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Player other = (Player) obj;
        if (this.playerId != other.playerId && (this.playerId == null || !this.playerId.equals(other.playerId))) {
            return false;
        }
        return true;
    }

    @Override
    public int hashCode() {
        int hash = 7;
        hash = 53 * hash + (this.playerId != null ? this.playerId.hashCode() : 0);
        return hash;
    }

    
}

Und log4j beschert mir folgende Ausgabe, nachdem ich Hibernate etwas gesprächiger gemacht habe. Wie ihr seht, habe ich bis auf ein Attribut alle anderen auskommentiert, da ich in Betracht gezogen habe, dass die DB (mySql) mit Date vielleicht ein Problem haben könnte. Das Jdo habe ich so herunter getippt, wie alltäglich auf der Arbeit, nur nutze ich da eine MS SQL.

Code:
[SIZE="2"]DEBUG - SchemaUpdate.execute(149) | create table players (playerId int identity not null, nick varchar(30) not null, primary key (playerId))
ERROR - SchemaUpdate.execute(155) | Unsuccessful: create table players (playerId int identity not null, nick varchar(30) not null, primary key (playerId))
ERROR - SchemaUpdate.execute(156) | You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the 
right syntax to use near 'identity not null, nick varchar(30) not null, primary key (playerId))' at line 1[/SIZE]

Wenn ich nun das Statement, was mir Hibernate erzeugt, in den DbVisualizer kopiere, bekomme ich die gleiche Fehlermeldung.
SQL:
create table players (playerId int identity not null, nick varchar(30) not null, primary key (playerId));
Code:
[SIZE="2"][CREATE - 0 row(s), 0.000 secs]  [Error Code: 1064, SQL State: 42000]  You have an error in your SQL syntax; check the manual that corresponds 
to your MySQL server version for the right syntax to use near 'identity not null, nick varchar(30) not null, primary key (playerId))' at line 1
... 1 statement(s) executed, 0 row(s) affected, exec/fetch time: 0.000/0.000 sec  [0 successful, 0 warnings, 1 errors][/SIZE]

Nun ist mir unter mySql kein Schlüsselwort 'identity' bekannt. Entferne ich dies...
SQL:
create table players (playerId int not null, nick varchar(30) not null, primary key (playerId));
...bekomme ich meine neue Tabelle.
Code:
[SIZE="2"] [CREATE - 0 row(s), 0.068 secs]  Command processed. No rows were affected
... 1 statement(s) executed, 0 row(s) affected, exec/fetch time: 0.068/0.000 sec  [0 successful, 1 warnings, 0 errors][/SIZE]

Wie bekomme ich Hibernate nun dazu, mir ein korrektes SQL Statement für eine mySql zu erzeugen?
 

neonfly

Aktives Mitglied
Da ich für diese Tabelle einen zusammen gesetzten Primärschlüssel aus nick und email benötige, habe ich die Struktur eben geändert. Diese Tabelle wird korrekt erzeugt.
Code:
[SIZE="2"]DEBUG - SchemaUpdate.execute(149) | create table players (email varchar(100) not null, nick varchar(30) not null, 
password varchar(40) not null, primary key (email, nick))
INFO - SchemaUpdate.execute(160) | schema update complete[/SIZE]

Nun bleibt weiterhin die Frage wie ich das Problem behebe, wenn ich eine Tabelle mit einem Primärschlüssel, der automatisch inkrementiert werden soll, haben möchte.
 

tfa

Top Contributor
Ein zusammengesetzter Primärschlüssel aus Name und Email ist eine sehr schlechte Idee. Du solltest die Variante mit dem Kunstschlüssel zum laufen kriegen. Wahrscheinlich verwendest du einen falschen DB-Dialect in Hibernate. Für MySQL sollte es org.hibernate.dialect.MySQLDialect sein.
 

tfa

Top Contributor
In der hibernate.cfg.xml stand MySQLDialect, nur habe ich meine eigenen properties, dort stand der SQLServer.
D.h. jetzt funktioniert es?

Das sind Werte die sich ändern könnten. Die PK und alle Fremdverschlüsselungen zu ändern kann sehr aufwendig sein. Alles, was zum Businessmodell gehört (also irgendwie im Programm eingegeben oder auch nur angezeigt wird) hat im PK nichts zu suchen. Am besten lässt du dir immer Kunstschlüssel erzeugen. Hibernate unterstützt das ja ziemlich gut.
 

neonfly

Aktives Mitglied
D.h. jetzt funktioniert es?
Danke, ja! Ich vergass, dass die Einstellungen ausgelagert sind und habe bloss die hibernate.cfg.xml überprüft, wo der MySQLDialect ja eingestellt war.

Das sind Werte die sich ändern könnten. Die PK und alle Fremdverschlüsselungen zu ändern kann sehr aufwendig sein.
Hmm, also die Email hab ich nun heraus genommen, die kann sich zwar ändern, das wird aber für den Benutzer ein ziemlicher Akt->Support höflich darum bitten. :D

Der Nick ändert sich zwar nie, trotzdem bin ich deinem Rat gefolgt und benutze einen Kunstschlüssel. Nick, Email, Anmeldename und Mobiltelefon sind nun einzigartig.

Mehrfachaccounts werden sowieso nie zu verhindern sein.
 
Zuletzt bearbeitet:
M

maki

Gast
Kannst doch die email als Unique spezifizieren.

Nebenbei gesagt, du hast kein JDO, denn das ist Schnee von gestern ;)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Hibernate: Datum 0001-01-01 erzeugt null-Datum Data Tier 4
I Hibernate / JPA: Eine Datenbank und pro User ein Schema Data Tier 9
T Hibernate/Spring JPA: eigene ID generieren Data Tier 5
Avalon @ManyToOne Hibernate oder JPA? Data Tier 5
D Hibernate Hibernate mit MariaDB Data Tier 1
ToBJo Hibernate Glassfish deploy mit Hibernate schlägt fehl Data Tier 1
C JPA Hibernate Map<String,String> richtig mappen Data Tier 2
S JPA Hibernate Search & EclipseLink (oder OpenJPA) Data Tier 0
R JPA Probleme mit Wechsel von EclipseLink auf Hibernate Data Tier 4
ARadauer Hibernate Entität readonly laden... Data Tier 1
G Hibernate SQL in Hibernate: Keine Parameter mit Index? Data Tier 2
P Wildfly + Hibernate + SQL Server Data Tier 0
E JPA Hibernate Query mit Timestamp hat seltsames Verhalten Data Tier 1
M Eclipse 4 RCP Hibernate Problem Data Tier 3
C Hibernate ProgressBar updaten mit Daten aus Hibernate Data Tier 4
B Hibernate und MySQL testen Data Tier 8
I Hibernate HQL: generiertes SQL ausgeben Data Tier 1
R mapping-file für hibernate zum Überschreiben der Annotationen Data Tier 7
R Hibernate Hibernate und Logback Data Tier 2
R Hibernate möchte Schema zwei mal undeployen Data Tier 2
F Hibernate Hibernate / JPA Data Tier 4
E Hibernate: Session vs EntityManager Data Tier 3
C Hibernate Hibernate Code Generation Data Tier 3
S Hibernate Mehrfachverbindung mit Hibernate Data Tier 3
M Hibernate Einstiegsfrage Data Tier 5
M Exception in thread "main" org.hibernate.MappingException: java.lang.ClassNotFoundException: Message Data Tier 4
S Hibernate Einstieg in Hibernate 3.2 sinnvoll? Data Tier 8
P JPA Eigene Vererbungsstrategie mit JPA / Hibernate Data Tier 2
J Hibernate Problem bei Master-Detail-Tabellen Data Tier 5
Y Jboss seam-hibernate-jpa Data Tier 5
RaoulDuke Hibernate Map<String,String> mit Annotations mappen Data Tier 2
M Hibernate Hibernate with GWT Data Tier 4
C Hibernate JPA mysql db erstellen Data Tier 4
M Hibernate Hibernate liest Daten zu oft aus! Data Tier 16
pg1337 Hibernate Fragen Data Tier 11
D Probleme bei Left Joins mit Hibernate createCriterias() Data Tier 2
D Hibernate probleme mit Verlinkungstabelle Data Tier 4
2 Hibernate Annotations Data Tier 7
G Hibernate select update no wait Data Tier 8
Z Hibernate: Many-To-Many nur eine bestimmte Spalte Data Tier 3
K Hibernate - Envers - Erzeugung der SQL Skripte Data Tier 4
G Hibernate 1:n Beziehung mit Vererbung Data Tier 5
D Hibernate-Criteria-API (Projections und MAX-Funktion) Data Tier 6
L Hibernate: failed to lazily initialize a collection of role Data Tier 3
S Hibernate hibernate.cfg.xml Data Tier 14
D JPA vs Hibernate.cfg und Entitymanager Data Tier 6
H Hibernate - Mapping für Enumeration Data Tier 1
R Hibernate Criteria Abfrageproblem Data Tier 2
A Hibernate und jdbc zusammen Data Tier 4
D Mit Hibernate aus JUnit ein DB-Schema erzeugen Data Tier 6
S [Hibernate] No Persistence provider for EntityManager Data Tier 5
B Problem mit org.hibernate.LazyInitializationException Data Tier 11
G Hibernate HQL und Interface Data Tier 4
G JSF Hibernate no session or session was closed Data Tier 12
T JPA2/Hibernate: Many-to-Many-Relation wird u.a. beim löschen nicht aktualisiert Data Tier 14
S (Hibernate) Mapping einer Datenbanktabelle mit mehreren Fremdschlüssel Data Tier 7
X [Hibernate] Zusammengesetzte Entities möglich? Data Tier 7
N Hibernate Fake? Data Tier 2
S Problem beim Insert mit Hibernate Data Tier 9
V Hibernate Projection Data Tier 2
T org.hibernate.impl.SessionFactoryImpl Memory Leak Data Tier 10
G Hibernate Composite key Data Tier 11
X [Hibernate] Connection Pool - MinSize ? Data Tier 2
R Hibernate Criteria OR Data Tier 2
T hibernate/jpa abgefragte Listen immer mit Null-Werten gefüllt Data Tier 8
X [Hibernate] Anderen Connection Pool - Vorschläge? Data Tier 3
ARadauer Hibernate DDL Loggen Data Tier 6
G Hibernate abfrage Collection Data Tier 3
X [Hibernate] ReverseEngineering - Eigene Strategy verwenden? Data Tier 3
R Hibernate Criteria .group größer als Data Tier 5
R Hibernate daten laden Data Tier 7
H [Hibernate]1:1 Beziehung Data Tier 8
H [Hibernate]No CurrentSessionContext configured! Data Tier 6
X [Hibernate] Lässt sich die Dauer eines SELECTs loggen? Data Tier 4
R Hibernate n:n Relationtabelle mit Date Data Tier 3
H [Hibernate] Unknown Entity Data Tier 3
H [Hibernate] Configuration Data Tier 3
C [Hibernate] Generierung von hbm.xml to Java Data Tier 4
lumo Eclipse & JPA & Hibernate & Derby Data Tier 5
J Zufallsauswahl aus ResultList bei JPA(Hibernate) / Performance Data Tier 3
G Datenbankzugriff mit Hibernate Data Tier 7
Y Hibernate - Angabe des Schemas Data Tier 6
LadyMilka (Hibernate) in Criteria implizierter Join durch Subquery's Data Tier 8
M Hibernate Mehr als 1 Object speichern? Data Tier 18
M Unerklärliche Hibernate Exception Data Tier 20
LadyMilka (Hibernate) subquery in FROM-Clause Data Tier 9
haemi Viele DTOs in hibernate IdentityMap Data Tier 3
LadyMilka (hibernate) UNION dem Dialekt hinzufügen Data Tier 3
M Hibernate + Oracle 10g XE Data Tier 3
lumo Hibernate - entity class not found Data Tier 5
P SQL PRoblem Hibernate? Data Tier 8
J Vererbung mit JPA / Hibernate - pro/contra Data Tier 3
T JBoss/Hibernate: Abfrage dauert lang + hohe CPU? Data Tier 19
7 Hibernate-Abfrage (SubSelect im FROM) Data Tier 2
G Hibernate: many-to-one - Verwaiste Datensätze löschen Data Tier 2
G Layer für Datenbankzugriff Hibernate Data Tier 5
G Hibernate Zwischentabelle Data Tier 2
Java.getSkill() Hibernate und Spalte vom Typ xml Data Tier 6
G Hibernate 0...1 : 1 Beziehung Data Tier 6
G Hibernate mehrere @oneToone Data Tier 2

Ähnliche Java Themen


Oben