Basert på innspill og observasjoner fra Thomas etter at jeg oppdaget problemer med DELETE i runtest mot UiOs PostgreSQL-baserte instans, så har jeg nettopp testet følgende endring og kan bekrefte at det løste problemet.
diff --git a/src/main/java/app/service/noark5/NoarkService.java b/src/main/java/app/service/noark5/NoarkService.java index 7bbc53e45..37df092e7 100644 --- a/src/main/java/app/service/noark5/NoarkService.java +++ b/src/main/java/app/service/noark5/NoarkService.java @@ -157,7 +157,7 @@ public class NoarkService protected void disassociateForeignKeys( SystemIdEntity entity, String deleteString) { Query query = entityManager.createNativeQuery(deleteString); - query.setParameter(ID, entity.getSystemIdAsString()); + query.setParameter(ID, entity.getSystemId()); query.executeUpdate(); }
Hvis det i tillegg er riktig løsning, så foreslår jeg at den tas inn i master.
Jeg forstår riktignok ikke helt hvorfor PostgreSQL ikke liker en UUID som string, og hvorfor dette løser noe, da min forståelse er at SQL-en er lik og burde tolkes på samme vis, så lenge strengen faktisk representerer en UUID.
Hei,
Problemet her er egentlig ikke relatert til SQL, men til HQL (Hibernate Query Language). Hibernate bryr seg om datatyper, men SQL gjør ikke det på samme måte.
Egentlig er det slik at det er riktig at feilen oppstår, slik den gjør med PostgreSQL. Det at det ikke skjer i H2 er det som er rart. Det kan være at H2 og hibernate gjør noe galt som PostgreSQL og hibernate ikke gjør galt. Det er også grunnen at dette ikke er blitt oppdaget, da CI benytter seg utelukkende av H2.
Grunnen dette oppsto er at vi byttet fra datatype varchar(32) på systemID feltet til datatype UUID. Da må vi sørge for at alle spørringer bruker samme datatype. Det er også mulige å _caste_ i HQL.
Det som forvirrer meg litt her er at H2 støtter UUID datatypen også (https://www.h2database.com/html/datatypes.html#uuid_type). Feilen burde oppstått uansett.
Thomas ________________________________ Fra: Petter Reinholdtsen pere@hungry.com Sendt: fredag 25. april 2025 11:26 Til: nikita-noark@nuug.no nikita-noark@nuug.no Emne: [patch] Fiks DELETE med PostgreSQL som database
Basert på innspill og observasjoner fra Thomas etter at jeg oppdaget problemer med DELETE i runtest mot UiOs PostgreSQL-baserte instans, så har jeg nettopp testet følgende endring og kan bekrefte at det løste problemet.
diff --git a/src/main/java/app/service/noark5/NoarkService.java b/src/main/java/app/service/noark5/NoarkService.java index 7bbc53e45..37df092e7 100644 --- a/src/main/java/app/service/noark5/NoarkService.java +++ b/src/main/java/app/service/noark5/NoarkService.java @@ -157,7 +157,7 @@ public class NoarkService protected void disassociateForeignKeys( SystemIdEntity entity, String deleteString) { Query query = entityManager.createNativeQuery(deleteString); - query.setParameter(ID, entity.getSystemIdAsString()); + query.setParameter(ID, entity.getSystemId()); query.executeUpdate(); }
Hvis det i tillegg er riktig løsning, så foreslår jeg at den tas inn i master.
Jeg forstår riktignok ikke helt hvorfor PostgreSQL ikke liker en UUID som string, og hvorfor dette løser noe, da min forståelse er at SQL-en er lik og burde tolkes på samme vis, så lenge strengen faktisk representerer en UUID.
-- Vennlig hilsen Petter Reinholdtsen _______________________________________________ nikita-noark mailing list -- nikita-noark@nuug.no To unsubscribe send an email to nikita-noark-leave@nuug.no
[Thomas John Sødring]
Problemet her er egentlig ikke relatert til SQL, men til HQL (Hibernate Query Language). Hibernate bryr seg om datatyper, men SQL gjør ikke det på samme måte.
Aha.
Egentlig er det slik at det er riktig at feilen oppstår, slik den gjør med PostgreSQL. Det at det ikke skjer i H2 er det som er rart. Det kan være at H2 og hibernate gjør noe galt som PostgreSQL og hibernate ikke gjør galt. Det er også grunnen at dette ikke er blitt oppdaget, da CI benytter seg utelukkende av H2.
Joda, hvis feilen skal rapporteres, så er jeg enig i at H2 også burde trigget den. Trodde feilen oppsti på SQL-niva, på grunn av at Nikita-loggmeldingen snakket om 'DELETE FROM as_fonds_fonds_creator WHERE f_pk_fonds_id = ? ;', hvilket så ut som SQL for meg. )
Det som forvirrer meg litt her er at H2 støtter UUID datatypen også (https://www.h2database.com/html/datatypes.html#uuid_type). Feilen burde oppstått uansett.
Det jeg lurer mest på er kanskje om endringen er korrekt?
Fra erfaring med å jobbe med HQL så har jeg vært borti datatype som problem, men jeg kan ikke huske å ha vært borti datatype som problem med SQL. Om jeg husker rett så kan SQL være grei på akkurat det.
Jeg ser nå at det du referer til her er faktisk SQL:
DELETE FROM as_fonds_fonds_creator WHERE f_pk_fonds_id = ? '
Det som gjorde at jeg tolket det i retning av HQL var "= ?", der du angir verdien til en parameter som brukes i query.
Om du ser på koden er det en _nativeQuery_ som genereres:
Query query = entityManager.createNativeQuery(deleteString); query.setParameter(ID, entity.getSystemIdAsString()); query.executeUpdate();
Da er det ikke HQL som er en del av situasjonen! Jeg har opplevd en del ClassCastExcptions under utviklingsarbeidet av OData til HQL. Så det er lett å tenke at det er det som er problemet.
Kanskje ikke akkurat relevant, men her er et eksempel som snakker om behovet å caste i en nativeQuery() [1]
Endringen er etter min mening korrekt. Jeg har ikke fått testet den, men det gir mening at du må bruke riktig datatype når du utfører en spørring. Det burde uansett være en variabel av type UUID som gis, da kolonnen er av datatypen UUID.
Thomas
[1] https://vladmihalcea.com/how-do-solve-the-postgresql-cast-operator-issue-wit...
________________________________ Fra: Petter Reinholdtsen pere@hungry.com Sendt: fredag 25. april 2025 13:59 Til: nikita-noark@nuug.no nikita-noark@nuug.no Emne: Re: [patch] Fiks DELETE med PostgreSQL som database
[Thomas John Sødring]
Problemet her er egentlig ikke relatert til SQL, men til HQL (Hibernate Query Language). Hibernate bryr seg om datatyper, men SQL gjør ikke det på samme måte.
Aha.
Egentlig er det slik at det er riktig at feilen oppstår, slik den gjør med PostgreSQL. Det at det ikke skjer i H2 er det som er rart. Det kan være at H2 og hibernate gjør noe galt som PostgreSQL og hibernate ikke gjør galt. Det er også grunnen at dette ikke er blitt oppdaget, da CI benytter seg utelukkende av H2.
Joda, hvis feilen skal rapporteres, så er jeg enig i at H2 også burde trigget den. Trodde feilen oppsti på SQL-niva, på grunn av at Nikita-loggmeldingen snakket om 'DELETE FROM as_fonds_fonds_creator WHERE f_pk_fonds_id = ? ;', hvilket så ut som SQL for meg. )
Det som forvirrer meg litt her er at H2 støtter UUID datatypen også (https://eur02.safelinks.protection.outlook.com/?url=https%3A%2F%2Fwww.h2data...https://www.h2database.com/html/datatypes.html#uuid_type). Feilen burde oppstått uansett.
Det jeg lurer mest på er kanskje om endringen er korrekt?
-- Vennlig hilsen Petter Reinholdtsen _______________________________________________ nikita-noark mailing list -- nikita-noark@nuug.no To unsubscribe send an email to nikita-noark-leave@nuug.no