EJB @Id @GeneratedValue

Status
Nicht offen für weitere Antworten.

inspector_71

Mitglied
Hi Leute, ich versuche für die MySQL DB den Primärschlüssel automatisch generieren zu lassen, aber scheinbar funktioniert das nicht.

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "personid", nullable = false)
public Integer getPersonid() {
return personid;
}

public void setPerson_id(Integer personid) {
this.personid = personid;
}



Jetzt habe ich eine Frage:
Wann wird der Primärschlüssel generell erzeugt?
Wenn ich ein neues Objekt instanziiere mit new Person()?
Muss ich da einen speziellen Konstruktor anlegen?

Bei entitymanager.persist(person),

bekomme ich:

Column 'personid' cannot be null


Also funktioniert das nicht wirklich, vielleicht kennt jemand das Problem, vielen Dank
 

boxi

Mitglied
@GeneratedValue(strategy = GenerationType.AUTO) Dürfte das Problem lösen. MySQL arbeitet ja mit AutoIncrement für PKs. Und das Muss der JPA mitgeteilt werden. Die ID's werden dann mit entitymanager.persist(person) in MySQL erstellt. JPA schreibt die erzeugte ID dann in die Person.
 

inspector_71

Mitglied
@boxi

Vielen Dank, dein Posting hat mich darauf gebracht auto_increment in der MySQL DB zu aktivieren, jetzt funktioniert es tatsächlich mit @GeneratedValue(strategy = GenerationType.AUTO)!

:)

Aber, wie siehts da mit Postgres aus?

Danke und liebe Grüße aus Wien,
John
 

fehlerfinder

Bekanntes Mitglied
Auch wenn dein Posting geholfen hat ;-) und dies hier ein wenig off-topic ist:

boxi hat gesagt.:
MySQL arbeitet ja mit AutoIncrement für PKs
Das stimmt so nicht. Denn auto_increment ist ein Attribut, welches nur für Integer Datentypen vergeben werden kann. Siehe MySQL-Doku

Auf der anderen Seite funktioniert aber das folgende Statement einwandfrei:

Code:
mysql> alter table t2 add id varchar(10) primary key;
Query OK, 0 rows affected (0.00 sec)

mysql> desc t2;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| nr    | int(11)     | YES  |     | NULL    |       | 
| id    | varchar(10) | NO   | PRI |         |       | 
+-------+-------------+------+-----+---------+-------+

Zur eigentlichen Frage kann ich leider nichts beitragen... :(
 

boxi

Mitglied
Das ist richtig. Nun unterschtützt JPA aber genau dieses Verfahren ausgesprochen gut. Darum ist es sinnvoll diesen Weg zu nehmen. Zudem sind Integer Keys schneller als ein varchar(10) und ob Surogatschlüssel (Schlüssel mit inhaltlichem Bezug zu den Daten) gut sind oder nicht, darüber kann man lang diskutieren. Meiner Meinung sollte man die Finger davon lassen.

Aber zurück zum Thema. Ich weiss nicht wie man die Schlüsselgenerierung mit MySQL sonst machen soll. Da MySQL leider noch keine Sequencen Unterstützt. Aber auch da kann ich mich irren. Ich habe schon länger nicht mehr mit MySQL gearbeitet. Ich glaube ich habe mal etwas von einer KeyTable gehört, Aber da weiss ich zuwenig wie man diese in JPA einbindet.
 

fehlerfinder

Bekanntes Mitglied
boxi hat gesagt.:
Da MySQL leider noch keine Sequencen Unterstützt
Naja, eigentlich hast du's ja schon genannt: einfach eine auto_increment-Spalte definieren. Dann hast du eine "amtliche" ;-) ID und einen primary key. Und letztlich ist solch ein auto_increment genau das, was (z.B.) bei Oracle mit einer Sequence erreicht wird - zumindest, was die Verwendung als PK angeht.

Ich wollte überhaupt nichts gegen auto_increment-s sagen - im Gegenteil. Ging mir nur um die korrekte Darstellung.
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben