# EJB @Id @GeneratedValue



## inspector_71 (5. Sep 2007)

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 (5. Sep 2007)

@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 (5. Sep 2007)

@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


----------



## ms (5. Sep 2007)

inspector_71 hat gesagt.:
			
		

> Aber, wie siehts da mit Postgres aus?



Schau mal hier: www.xach.com/aolserver/mysql-to-postgresql.html

ebenfalls grüsse aus Wien

ms


----------



## inspector_71 (5. Sep 2007)

@ms

vielen dank und no sleep till meidling


----------



## ms (5. Sep 2007)

inspector_71 hat gesagt.:
			
		

> @ms
> 
> vielen dank und no sleep till meidling


tschilp tschilp

ms


----------



## fehlerfinder (6. Sep 2007)

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:


```
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 (6. Sep 2007)

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 (6. Sep 2007)

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.


----------



## boxi (6. Sep 2007)

fehlerfinder hat gesagt.:
			
		

> Ging mir nur um die korrekte Darstellung.


 :meld:  

 :wink: dann ist jetzt ja alles richtig  :toll:


----------

