JPA, Hibernate, Postgres und Sequence-Nummern

Zongatel

Mitglied
Hallo,
Meine Noobi-Anwendung scheint ein Stück vorangekommen zu sein.
Nun erlebe ich folgende Situation beim Insert in die Postgres-DB:
Der Insert funktioniert, die ID wird auch vergeben, aber es scheint so, dass das dafür definierte Sequence-Objekt nicht wirklich berührt wird.
Ich habe dazu mal aus Spaß auch eine andere noch nicht von mir auf nextval abgefragten Sequence verwendet, um erstaunliches zu sehen...
Zuvor hatte ich es mit der vorgesehenen seq_skill versucht bekam anfangs als IDs drolligerweise negative Zahlen. die seq_skill wurde aber scheinbar nicht von der Anwendung berührt, denn die Nummern erhöhten sich nur bei meinen manuellen Nextval-Aufrufen und waren noch dazu positiv!
Als ich dann auf einer glücklichen Seite nachlas, was ich offenbar machen muss, verwendete ich dann den Parameter allocationSize identisch mit der Definition für den SEQ-Cashe. Zwar waren es nun wieder ganz andere Zahlen für die IDs aber dafür positiv.
Dann machte ich die Probe auf Example ...
Hier habe ich vor als auch nach dem Versuch die noch jungfräuliche seq_mitarbeiter verwendet und stellte nach dem Insert weiterhin Jungfräulichkeit fest
1641942144532.png

[CODE lang="java" title="Hier wieder mein aktueller Skill-Bean" highlight="30"]package de.cmk.todo.restservices.skillmanager;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;



@Data
@EqualsAndHashCode(onlyExplicitlyIncluded = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name= "\"skill\"", schema = "\"projekt-skill-verwalter\"")
public class Skill {

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "skill_generator")
@SequenceGenerator(name="skill_generator", sequenceName = "projekt-skill-verwalter.seq_mitarbeiter", allocationSize=10)
@EqualsAndHashCode.Include
@Column(name="skill_id")
private Long id;
private String name;
@Column(name="beschreibung")
private String description;

}[/CODE]
Warum sind eigentlich DB-SEQs tatsächlich zu definieren, wenn sie anscheinend nicht ernsthaft verwendet werden?
Was übersehe ich hier?
 
Nun, currval liefert den in der aktuellen Postgres-Session zuletzt per nextval generierten Wert der Sequenz. Da Du in Deiner Sitzung keinen Wert generiert hast, bekommst Du den Fehler angezeigt (s. Doku)

Du willst den zuletzt generierten Wert der Sequenz - unabhängig von der Session - sehen:
SQL:
SELECT last_value FROM seq_mitarbeiter;
-- oder statt last_value natürlich per * alle Werte
 
Ahh danke, ich hatte das Konzept Sequenzen bisher immer unabhängig von Sessions gedacht wegen der Eindeutigkeit. Nun verstehe ich, dass offenbar die jeweilige Cache-Menge an Nummern der Session offenbar zugeordnet wird und die Eindeutigkeit nicht verletzt wird.
Hatte schon bedenken. Hatte ich das Konzept immer nur falsch verstanden, oder ist das eine Besonderheit von Postgres?
 

Neue Themen


Zurück
Oben