Hallo,
Bei meiner kleinen Anwendung laufen nun Frontend und Backend recht gut.
Ich stoße nach mehreren Inserts in die DB nun auf ein sehr drolliges Hibernate-Problem:
seit dem meine Sequence über die 100 gelangt ist, wiederholt anscheinend Hibernate die Nummern für den PK.
Hier mein Bean:
[CODE lang="java" title="skill.java"]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_skill", allocationSize=10)
@EqualsAndHashCode.Include
@Column(name="skill_id")
private Long id;
private String name;
@Column(name="beschreibung")
private String description;
}[/CODE]
Hier die Sequenz in der Postgres

Hier die auftretene Fehlermeldung als Beispiel.
[CODE lang="java" title="Fehlermeldung"] Detail: Schlüssel »(skill_id)=(94)« existiert bereits.
2022-01-13 10:30:28.119 INFO 9212 --- [nio-8080-exec-8] o.h.e.j.b.internal.AbstractBatchImpl : HHH000010: On release of batch it still contained JDBC statements
2022-01-13 10:30:28.121 DEBUG 9212 --- [nio-8080-exec-8] o.a.c.loader.WebappClassLoaderBase : findClass(jdk.internal.reflect.GeneratedMethodAccessor70)
2022-01-13 10:30:28.121 DEBUG 9212 --- [nio-8080-exec-8] o.a.c.loader.WebappClassLoaderBase : --> Returning ClassNotFoundException
2022-01-13 10:30:28.122 ERROR 9212 --- [nio-8080-exec-8] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement] with root cause
org.postgresql.util.PSQLException: FEHLER: doppelter Schlüsselwert verletzt Unique-Constraint »pk_skill_skill_id«
Detail: Schlüssel »(skill_id)=(94)« existiert bereits.
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2674) ~[postgresql-42.3.1.jar:42.3.1]
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2364) ~[postgresql-42.3.1.jar:42.3.1]
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:354) ~[postgresql-42.3.1.jar:42.3.1]
at org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:484) ~[postgresql-42.3.1.jar:42.3.1]
at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:404) ~[postgresql-42.3.1.jar:42.3.1]
at org.postgresql.jdbc.PgPreparedStatement.executeWithFlags(PgPreparedStatement.java:162) ~[postgresql-42.3.1.jar:42.3.1]
at org.postgresql.jdbc.PgPreparedStatement.executeUpdate(PgPreparedStatement.java:130) ~[postgresql-42.3.1.jar:42.3.1]
at com.zaxxer.hikari.pool.ProxyPreparedStatement.executeUpdate(ProxyPreparedStatement.java:61) ~[HikariCP-4.0.3.jar:na]
at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeUpdate(HikariProxyPreparedStatement.java) ~[HikariCP-4.0.3.jar:na][/CODE]
Wenn man das Spiel oft genug wiederholt und man dann auf einen noch nicht verwendeten PK stößt, funktioniert der Insert,
aber nur für genau einmal!
Danach generiert (vermutlich) Hibernate wieder Nummern im 90'er-Bereich.'
Eigentlich hatte ich irgendwo gelesen, dass, wenn die DB-Sequence vom Cache mit der im @SequenceGenerator identisch definiert wird,
dass die Nummern dann entsprechend richtig gewählt werden. Nun sehe ich aber obiges Problem.
Hat jemand eine Idee?
Mit besten Grüßen und Dank im Voraus
Zonk
Bei meiner kleinen Anwendung laufen nun Frontend und Backend recht gut.
Ich stoße nach mehreren Inserts in die DB nun auf ein sehr drolliges Hibernate-Problem:
seit dem meine Sequence über die 100 gelangt ist, wiederholt anscheinend Hibernate die Nummern für den PK.
Hier mein Bean:
[CODE lang="java" title="skill.java"]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_skill", allocationSize=10)
@EqualsAndHashCode.Include
@Column(name="skill_id")
private Long id;
private String name;
@Column(name="beschreibung")
private String description;
}[/CODE]
Hier die Sequenz in der Postgres

Hier die auftretene Fehlermeldung als Beispiel.
[CODE lang="java" title="Fehlermeldung"] Detail: Schlüssel »(skill_id)=(94)« existiert bereits.
2022-01-13 10:30:28.119 INFO 9212 --- [nio-8080-exec-8] o.h.e.j.b.internal.AbstractBatchImpl : HHH000010: On release of batch it still contained JDBC statements
2022-01-13 10:30:28.121 DEBUG 9212 --- [nio-8080-exec-8] o.a.c.loader.WebappClassLoaderBase : findClass(jdk.internal.reflect.GeneratedMethodAccessor70)
2022-01-13 10:30:28.121 DEBUG 9212 --- [nio-8080-exec-8] o.a.c.loader.WebappClassLoaderBase : --> Returning ClassNotFoundException
2022-01-13 10:30:28.122 ERROR 9212 --- [nio-8080-exec-8] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement] with root cause
org.postgresql.util.PSQLException: FEHLER: doppelter Schlüsselwert verletzt Unique-Constraint »pk_skill_skill_id«
Detail: Schlüssel »(skill_id)=(94)« existiert bereits.
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2674) ~[postgresql-42.3.1.jar:42.3.1]
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2364) ~[postgresql-42.3.1.jar:42.3.1]
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:354) ~[postgresql-42.3.1.jar:42.3.1]
at org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:484) ~[postgresql-42.3.1.jar:42.3.1]
at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:404) ~[postgresql-42.3.1.jar:42.3.1]
at org.postgresql.jdbc.PgPreparedStatement.executeWithFlags(PgPreparedStatement.java:162) ~[postgresql-42.3.1.jar:42.3.1]
at org.postgresql.jdbc.PgPreparedStatement.executeUpdate(PgPreparedStatement.java:130) ~[postgresql-42.3.1.jar:42.3.1]
at com.zaxxer.hikari.pool.ProxyPreparedStatement.executeUpdate(ProxyPreparedStatement.java:61) ~[HikariCP-4.0.3.jar:na]
at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeUpdate(HikariProxyPreparedStatement.java) ~[HikariCP-4.0.3.jar:na][/CODE]
Wenn man das Spiel oft genug wiederholt und man dann auf einen noch nicht verwendeten PK stößt, funktioniert der Insert,
aber nur für genau einmal!
Danach generiert (vermutlich) Hibernate wieder Nummern im 90'er-Bereich.'
Eigentlich hatte ich irgendwo gelesen, dass, wenn die DB-Sequence vom Cache mit der im @SequenceGenerator identisch definiert wird,
dass die Nummern dann entsprechend richtig gewählt werden. Nun sehe ich aber obiges Problem.
Hat jemand eine Idee?
Mit besten Grüßen und Dank im Voraus
Zonk