I get the error message:
WARN [org.hib.eng.jdb.spi.SqlExceptionHelper] (JPA Startup Thread) constraint "uk_efyrrfjynwrsi3itwh01fg52" of relation "users" does not exist, skipping
Sadly I do not understand the problem. I do not understand what the uk_efyrrfjynwrsi3itwh01fg52-constraint
should be. The application works normal.
I use quarkus (version 3.1.0) and in the the application.properties
file I set the hibernate property:
quarkus.hibernate-orm.database.generation=update
To me this means that missing objects/references are automatically created by Hibernate. So if a constraint is missing, why doesn't hibernate generate it? How can I resolve this problem?
If needed my users.java
file:
@Entity
@Table( name = "users" )
@Data
public class User extends AbstractEntity {
@Column( name = "iban", length = 35 )
private String iban;
@Column( name = "bic", length = 35 )
private String bic;
@Column( name = "ist_verein" )
private boolean istverein;
@Column( name = "iban_verein", length = 35 )
private String ibanverein;
@Column( name = "bic_verein", length = 35 )
private String bicverein;
@Column( name = "vereinsmitgliedschaftsprozente" )
private Integer vereinsmitgliedschaftsprozente;
@Column( name = "vereinsbeschreibung", length = 300 )
private String vereinsbeschreibung;
@Column( name = "vereinsUID", length = 300 )
private String vereinsUID;
@Column( name = "vereinsZVR", length = 300 )
private String vereinsZVR;
@Column( name = "vereinspassword", length = 30 )
private String vereinspassword; //Passwort um die Mitglieder von Extern abrufen zu können
@Column( name = "abrufexternemitglieder", columnDefinition = "DATE" )
private LocalDate abrufexternemitglieder; //Datum, damit wir nur einmal am Tag die Mitglieder ziehen dürfen
@Column( name = "anrede", length = 100 )
private String anrede;
@Column( name = "vorname", length = 150 )
private String vorname;
@Column( name = "nachname", length = 150 )
private String nachname;
@Column( name = "professional", columnDefinition="BOOLEAN DEFAULT false" )
private boolean professional; //z.B. Lehrer
@Column( name = "para", columnDefinition="BOOLEAN DEFAULT false" )
private boolean para; //z.B. Lehrer
@Column( name = "geburtsdatum", columnDefinition = "DATE" )
private LocalDate geburtsdatum;
@OneToOne( fetch = FetchType.LAZY )
@JoinColumn( name = "ueberpruefer_id" )
private User ueberpruefer; //Wer überprüft das Geburtsdatum des Tänzers?
@Column( name = "ueberpruefungsdatum" )
private LocalDate ueberpruefungsdatum; //Wann wurde das Geburtsdatum des Users überprüft?
@Enumerated( EnumType.STRING )
private GeburtsdatumStatus geburtsdatumStatus; //Korrekt, Falsch, Betrug
@Column( name = "keycloak_username", unique = true )
private String keycloakUsername;
@Column( name = "laendercode" )
private String laendercode;
@Column( name = "last_login", columnDefinition = "TIMESTAMP" )
private LocalDate lastLogin;
@Column( name = "telefonnummer" )
private String telefonnummer;
@Column( name = "rechnungsadresseDancer" )
private String rechnungsadresseDancer;
@Column( name = "adresseschool" )
private String addressSchool;
@Column( name = "schulname" )
private String schulname;
@Column( name = "homepageschool" )
private String homepageSchool;
@Column( name = "veranstalterhomepage")
private String veranstalterhomepage;
@Column( name = "veranstalter_kuerzel" )
private String veranstalterKuerzel;
@Column( name = "veranstalterbeschreibung", length = 650)
private String veranstalterbeschreibung;
@Enumerated( EnumType.STRING )
private Permission manageMeisterschaften;
@Enumerated( EnumType.STRING )
private Permission manageStammdaten;
@OneToMany( mappedBy = "vereinsadmin", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true )
private List<Mitgliedschaft> vereinsmitglieder = new ArrayList<>();
@OneToMany( mappedBy = "vereinsmitglied", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true )
private List<Mitgliedschaft> mitgliedBeiVerein = new ArrayList<>();
@OneToMany( mappedBy = "user", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true )
private List<Picture> pictures = new ArrayList<>();
/**
* Meisterschaften bei welchen dieser Veranstalter der Hauptveranstalter ist
*/
@OneToMany( fetch = FetchType.LAZY, mappedBy = "veranstalter" )
private Set<Meisterschaft> veranstalterMeisterschaften;
/**
* Meisterschaften bei welchen dieser Veranstalter ein Subveranstalter ist
*/
@OneToMany( mappedBy = "veranstalter", cascade = CascadeType.ALL, orphanRemoval = true )
private List<MeisterschaftSubVeranstalter> subveranstalterMeisterschaften = new ArrayList<>();
@OneToMany( mappedBy = "user", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true )
private Set<Feature> features = new HashSet<>();
/**
* Das sind die globalen Settings für alle Meisterschaften eines Users
*/
@OneToOne( fetch = FetchType.LAZY, mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true )
private MeisterschaftenSettings meisterschaftenSettings;
@OneToOne( fetch = FetchType.LAZY, mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true )
private PublicProfileDancer publicProfileDancer;
@ElementCollection( targetClass = Role.class )
@Enumerated( EnumType.STRING )
@CollectionTable( name = "user_role" )
@Column( name = "roles" )
private Set<Role> roles = new HashSet<>();
@OneToMany( mappedBy = "user", fetch = FetchType.LAZY )
private List<DanceRegistration> danceRegistrations = new ArrayList<>();
@OneToMany( mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true )
private List<ManagerStammdaten> stammdatenManagers = new ArrayList<>();
@OneToMany( mappedBy = "dancer", cascade = CascadeType.ALL, orphanRemoval = true )
private List<ManagerMeisterschaft> meisterschaftManagers = new ArrayList<>();
@OneToMany( mappedBy = "admin", cascade = CascadeType.ALL, orphanRemoval = true )
private List<UserDancer> dancers = new ArrayList<>();
@OneToMany( mappedBy = "dancer", cascade = CascadeType.ALL, orphanRemoval = true )
private List<UserDancer> dancingFor = new ArrayList<>();
@OneToMany( mappedBy = "judge", cascade = CascadeType.ALL, orphanRemoval = true )
private Set<MeisterschaftJudge> meisterschaftenToJudge = new HashSet<>();
public Set<Dance> getDances() {
return danceRegistrations.stream()
.map( danceRegistration -> danceRegistration.getMeisterschaftDance().getDance() )
.collect( Collectors.toSet());
}
public boolean hasDances() {
return getDances() != null && !getDances().isEmpty();
}
public void addDancer( User dancer ) {
if( this.dancers == null ) {
this.dancers = new ArrayList<>();
}
if ( CollectionUtils.isNotEmpty( this.dancers ) ) {
Predicate<User> isSameUser = existingDancer -> existingDancer.equals( dancer );
if ( this.dancers.stream().map( UserDancer::getDancer ).anyMatch( isSameUser ) ) {
return;
}
}
this.dancers.add( new UserDancer( this, dancer ) );
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!( o instanceof User other ))
return false;
return id != null &&
id.equals(other.getId());
}
@Override
public int hashCode() {
return 31;
}
}
This is a warning, not an error. In short the warning is telling you that the constraint is missing (probably due to a mapping change and/or Hibernate ORM upgrade), and if you did set the generation strategy to 'update', Hibernate ORM should fix this.
If the warning no longer appears on the next start of your application, then you're fine, Hibernate ORM created the missing constraint. If not, I'd recommend reporting a bug here, because it should have.