Entity Beans GeneratedValue -> GenerationType

inspector_71

Mitglied
Hi Leute!

Also, per Entity Bean mappe ich auf eine Postgres Datenbank.
Aber beim generieren vom Primärschlüssel hab ich so meine Probleme.

GenerationType:AUTO hat nicht funktioniert, also nehme ich .TABLE

Trotzdem passt das nie
Es wird nie nachgesehen welcher der momentan höchste ist, sondern einfach mit 1 mal probiert, dann bekomm ich einen Fehler, da ja schon 300 Datensätze vorhanden sind. Irgendwann versucht er einen anderen, auf einmal 32768 und immer höhere zahlen....

Ist irgendwie mühsam das Ganze...

Hat jemand Erfahrung damit?

Danke
 
1. EntityBeans gibt es seit JavaEE nicht mehr ;)
2. Warum tut GenerationType.Auto nicht? (Exception?)
3. Wenn du den GenerationType änderst solltest du zwischendurch mal deine Datenbank plätten. Wenn du da mit einem Typ schon X Entities angelegt hast und dann plötzlich auf Table wechselst, wird die Sequence Tabelle neu angelegt und beginnt von 0 an zu zählen. Das es dann kracht, sollte klar sein.

GenerationType.AUTO ist eigentlich schon der günstigste Weg erstmal. Ich würd versuchen herauszubekommen, warum das nicht tut.

REINHAUN!

PS: JPA ist nur oberflächlich Spass: http://groups.google.com/group/sugg/msg/4539128073922c70 ;)
 
Guten Morgen Oliver!

Hmmm, naja, wie darf ich das verstehen, ein Teil von J2EE sind doch die EJBs, die als Session, Message-Driven oder eben Entity-Beans daherkommen... :confused:

Bei GenerationType.AUTO bekomm ich die Exception, dass der Primärschlüssel, welcher ja generiert werden sollte, nicht null sein darf, also funktioniert da etwas nicht, bei TABLE funktioniert es, allerdings mit den schon erwähnten Einschränkungen. Falls die Datenbank leer ist dann passts, ich meine, ist doch nicht so schwierig, ein select (max) und dann ++ für den nächsten freien Schlüssel... Falls bereits Einträge drinnen sind gibts Probleme, wie gesagt, irgendwann dann versucht er es mit hohen Werten, jenseits der 100.000 zum Teil, dann funktionierts auch wieder...

Danke für deine Antwort!

Habe es auch mit

@Id
@Column(name = "personid", unique = true, nullable = false)
@SequenceGenerator(name="identifier", sequenceName="t_person_personid_seq", allocationSize=1)
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="identifier")
@NotNull
public int getPersonid()

versucht, wobei t_person_personid_seq eine sequence ist, welche von Postgres angelegt wurde, beim Datentyp serial, aber da kommt die Meldung could'nt get next sequence value, GenerationType.IDENTITY liefert wieder personid null...
:-(
 
Zuletzt bearbeitet:
EntityBeans gabs nur bis Spec Version 2.X. Seit Version 3 ersetzt JPA die EntityBeans.

Lässt du dir das DB Schema durch den JPA Provider generieren, oder ist das "selbstkreirt"? Ist das ein bestehendes SChema, oder "grüne Wiese"?

Ich würde nicht gleich mit dem vollen Annotationswust anfangen. Umso mehr du dran nagelst, umso mehr Fehler können passieren und du weißt nicht mehr, was von welcher Annotation kommt.

@NotNull ist zum beispiel äquivalent zu nullable=false in @Column. Und ich würde nicht unbedingt drauf wetten, dass jeder JPA Provider mit solcherlei Redundanzen korrekt umgeht.

Versuch doch mal:

Java:
@Id
@GeneratedValue(strategy=GenerationType.AUTO)

und lass dir das Schema generieren (frag mich nicht, wie man das genau in der persistence.xml konfiguriert. Es gibt irgendeine property mit der man das aktivieren kann, Google sollte da weiterhelfen). Welchen JPA Provider nutzt du?

Gruß
Ollie
 
Tja, @Id@GeneratedValue(strategy=GenerationType.AUTO) hatte ich zuerst ja auch, hat aber nie funktioniert. Des Weiteren hab ich in der persistence.xml keinen expliziten Provider angegeben, ich verwende ausschließlich Annotations und JDK 1.5.

Grundsätzlich funktioniert es ja auch, würde bloß gerne das mit den Primärschlüsseln hinbekommen, so dass immer der nächste genommen wird.

Das Datenbankschema wurde bereits im Vorfeld erstellt, per JPA wird jedoch das Schema erweitert, wenn ich das jetzt mal richtig formuliert habe...

Danke jedenfalls für eine Hilfe!
 
Tja, @Id@GeneratedValue(strategy=GenerationType.AUTO) hatte ich zuerst ja auch, hat aber nie funktioniert. Des Weiteren hab ich in der persistence.xml keinen expliziten Provider angegeben, ich verwende ausschließlich Annotations und JDK 1.5.
Nochmal, wie sieht denn die genaue Exception aus? Gibt es für die Spalte, die "autoincrement" sein soll, eine Sequence in der Datenbank? Wie, du kennst den provider nicht? Wenn deine Anwendung auf SE läuft musst du einen Explizit angeben. Im EE Umfeld liefern ApplicationServer meistens eine Implementierung mit.

Grundsätzlich solltest du dich schlau machen, was da genau dahinter läuft. Die Spec wäre keine Spec, wenn es nicht stellen gäbe, die eben nicht spezifiziert sind und so gut wie von jedem Provider anders implementiert werden. ToplinkEssentials kann zum Beispiel keine TABLE_PER_CLASS Inheritance Strategie OBWOHL in der Spec definiert. Und Toplink ist die Referenzimplementierung... *hust*

Das Datenbankschema wurde bereits im Vorfeld erstellt, per JPA wird jedoch das Schema erweitert, wenn ich das jetzt mal richtig formuliert habe...
Was heißt das jetzt genau? Was kommt da dazu? Wie ist das mit den Primärschlüsseln bisher gelöst?

Gruß
Ollie
 
Danke für deine Hilfe, du hattest wohl recht mit dem JPA Provider, hatte in der persistence.xml class org.hibernate.dialect.HSQLDialect eingetragen, jetzt umgeändert auf class org.hibernate.dialect.PostgreSQLDialect und scheint zu funktionieren wenn ich die sequence angebe, die Postgres automatisch bei einem Datentyp serial erstellt!

Habe jetzt schon mehrere Personen angelegt und er hat immer den nächsten freien Schlüssel genommen und die sequence inkrementiert...
 

Neue Beiträge

Zurück