Anonymous
Spring Boot SQL-Fehler beim Löschen von Datensatz mit Nicht-Null-Einschränkungsverletzung
Post
by Anonymous » 23 Feb 2025, 16:47
In Spring Start habe ich zwei Entitätsklassen < /p>
Code: Select all
import java.time.OffsetDateTime;
import java.util.Set;
import java.util.UUID;
import jakarta.persistence.*;
import lombok.*;
import org.apache.commons.lang3.StringUtils;
import org.cnr.plantvocdb.enums.LeafHabitus;
import org.cnr.plantvocdb.enums.PlantsRanks;
@Entity
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Getter
@Setter
@Table(name = "plants_voc")
public class PlantEntity {
@Id
@GeneratedValue(strategy = GenerationType.UUID)
@Column(name="id", length = 50, nullable = false, updatable = false)
private UUID id;
@Column(name="ipni", length = 50)
private String ipni;
@Setter(AccessLevel.NONE)
@Column(name="full_name_plain", length = 50)
private String fullNamePlain;
@Setter(AccessLevel.NONE)
@Column(name="full_name_no_authors_plain", length = 50)
private String fullNameNoAuthorsPlain;
@Setter(AccessLevel.NONE)
@Column(name="plant_name", length = 30, nullable = false)
private String name;
@Setter(AccessLevel.NONE)
@Column(name="family", length = 30, nullable = false)
private String family;
@Setter(AccessLevel.NONE)
@Column(name="genus", length = 30, nullable = false)
private String genus;
@Setter(AccessLevel.NONE)
@Column(name="species", length = 30, nullable = false)
private String species;
@Column(name="valid_nomenclature")
private boolean validNomenclature;
@Column(name="rank", length = 20)
@Enumerated(EnumType.STRING)
private PlantsRanks rank;
@Column(name="leaf_habitus", length = 20)
@Enumerated(EnumType.STRING)
private LeafHabitus leafHabitus;
@OneToMany(
fetch = FetchType.EAGER,
cascade = CascadeType.ALL,
mappedBy = "plant"
)
private Set
emitter;
@ElementCollection
@CollectionTable(
name = "synonyms", // Nome della tabella intermedia
joinColumns = @JoinColumn(name = "fk_synonyms_plant_id"),
foreignKey = @ForeignKey(name = "FK_synonyms_plant")
)
@Column(name="synonyms")
private Set synonyms;
@Column(name="created_datetime_utc", updatable = false) // creation_datetime_utc
private OffsetDateTime createdDatetimeUTC;
@Column(name="updated_datetime_utc") // last_modified_datetime_utc
private OffsetDateTime updatedDatetimeUTC;
public void setName(String name) {
this.name = StringUtils
.normalizeSpace(name.toLowerCase());
}
public void setFamily(String family) {
this.family = StringUtils
.normalizeSpace(StringUtils
.capitalize(family.toLowerCase()));
}
public void setGenus(String genus) {
this.genus = StringUtils
.normalizeSpace(StringUtils
.capitalize(genus.toLowerCase()));
}
public void setSpecies(String species) {
this.species = StringUtils
.normalizeSpace(species.toLowerCase());
}
public void setFullNamePlain(String fullNamePlain) {
this.fullNamePlain = StringUtils
.normalizeSpace(fullNamePlain);
}
public void setFullNameNoAuthorsPlain(String fullNameNoAuthorsPlain) {
this.fullNameNoAuthorsPlain = StringUtils
.normalizeSpace(fullNameNoAuthorsPlain);
}
}
< /code>
und < /p>
import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;
@Entity
@Table(name="emitters")
@Getter
@Setter
public class PlantEmitterEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name="emits", length = 50)
private boolean emits;
@Column(name="doi")
private String doi;
@ManyToOne(
fetch = FetchType.LAZY,
cascade = CascadeType.ALL
)
@JoinColumn(
name = "fk_emitters_plant_id",
nullable = false,
updatable = true,
insertable = true,
foreignKey = @ForeignKey(name = "FK_emitters_plant"))
private PlantEntity plant;
}
< /code>
Ich habe eine Reihe von Endpunkten im Controller entwickelt, um die klassischen GET, Put-, Löschen und Aktualisierungsvorgänge auszuführen. Wenn ich jedoch versuche, einen Anlagendatensatz mit seiner UUID -ID zu löschen, erhalte ich diesen Fehler: < /p>
org.postgresql.util.PSQLException: ERROR: null value in column "fk_emitters_plant_id" of relation "emitters" violates not-null constraint
Ich nehme an, dies ist auf die Einschränkung zurückzuführen, die mich nicht zusammen mit Plantemitterentity
controller < /p>
Code: Select all
@DeleteMapping("/{id}")
public ResponseEntity delete(@PathVariable("id") UUID id){
Optional optionalResponsePlantDTO = service.findPlantById(id);
if(optionalResponsePlantDTO.isPresent()){
service.delete(optionalResponsePlantDTO.get());
return ResponseEntity
.status(HttpStatus.OK)
.body(optionalResponsePlantDTO.get());
} else {
throw new PlantNotFoundException(
MessageFormat.format("Plant not found with id code: {0}.", id.toString())
);
}
}
Service
Code: Select all
public void delete(ResponsePlantDTO plant){
PlantEntity plantEntity = mapper.map(plant, PlantEntity.class);
repository.delete(plantEntity);
}
1740325667
Anonymous
In Spring Start habe ich zwei Entitätsklassen < /p> [code]import java.time.OffsetDateTime; import java.util.Set; import java.util.UUID; import jakarta.persistence.*; import lombok.*; import org.apache.commons.lang3.StringUtils; import org.cnr.plantvocdb.enums.LeafHabitus; import org.cnr.plantvocdb.enums.PlantsRanks; @Entity @AllArgsConstructor @NoArgsConstructor @Builder @Getter @Setter @Table(name = "plants_voc") public class PlantEntity { @Id @GeneratedValue(strategy = GenerationType.UUID) @Column(name="id", length = 50, nullable = false, updatable = false) private UUID id; @Column(name="ipni", length = 50) private String ipni; @Setter(AccessLevel.NONE) @Column(name="full_name_plain", length = 50) private String fullNamePlain; @Setter(AccessLevel.NONE) @Column(name="full_name_no_authors_plain", length = 50) private String fullNameNoAuthorsPlain; @Setter(AccessLevel.NONE) @Column(name="plant_name", length = 30, nullable = false) private String name; @Setter(AccessLevel.NONE) @Column(name="family", length = 30, nullable = false) private String family; @Setter(AccessLevel.NONE) @Column(name="genus", length = 30, nullable = false) private String genus; @Setter(AccessLevel.NONE) @Column(name="species", length = 30, nullable = false) private String species; @Column(name="valid_nomenclature") private boolean validNomenclature; @Column(name="rank", length = 20) @Enumerated(EnumType.STRING) private PlantsRanks rank; @Column(name="leaf_habitus", length = 20) @Enumerated(EnumType.STRING) private LeafHabitus leafHabitus; @OneToMany( fetch = FetchType.EAGER, cascade = CascadeType.ALL, mappedBy = "plant" ) private Set emitter; @ElementCollection @CollectionTable( name = "synonyms", // Nome della tabella intermedia joinColumns = @JoinColumn(name = "fk_synonyms_plant_id"), foreignKey = @ForeignKey(name = "FK_synonyms_plant") ) @Column(name="synonyms") private Set synonyms; @Column(name="created_datetime_utc", updatable = false) // creation_datetime_utc private OffsetDateTime createdDatetimeUTC; @Column(name="updated_datetime_utc") // last_modified_datetime_utc private OffsetDateTime updatedDatetimeUTC; public void setName(String name) { this.name = StringUtils .normalizeSpace(name.toLowerCase()); } public void setFamily(String family) { this.family = StringUtils .normalizeSpace(StringUtils .capitalize(family.toLowerCase())); } public void setGenus(String genus) { this.genus = StringUtils .normalizeSpace(StringUtils .capitalize(genus.toLowerCase())); } public void setSpecies(String species) { this.species = StringUtils .normalizeSpace(species.toLowerCase()); } public void setFullNamePlain(String fullNamePlain) { this.fullNamePlain = StringUtils .normalizeSpace(fullNamePlain); } public void setFullNameNoAuthorsPlain(String fullNameNoAuthorsPlain) { this.fullNameNoAuthorsPlain = StringUtils .normalizeSpace(fullNameNoAuthorsPlain); } } < /code> und < /p> import jakarta.persistence.*; import lombok.Getter; import lombok.Setter; @Entity @Table(name="emitters") @Getter @Setter public class PlantEmitterEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(name="emits", length = 50) private boolean emits; @Column(name="doi") private String doi; @ManyToOne( fetch = FetchType.LAZY, cascade = CascadeType.ALL ) @JoinColumn( name = "fk_emitters_plant_id", nullable = false, updatable = true, insertable = true, foreignKey = @ForeignKey(name = "FK_emitters_plant")) private PlantEntity plant; } < /code> Ich habe eine Reihe von Endpunkten im Controller entwickelt, um die klassischen GET, Put-, Löschen und Aktualisierungsvorgänge auszuführen. Wenn ich jedoch versuche, einen Anlagendatensatz mit seiner UUID -ID zu löschen, erhalte ich diesen Fehler: < /p> org.postgresql.util.PSQLException: ERROR: null value in column "fk_emitters_plant_id" of relation "emitters" violates not-null constraint [/code] Ich nehme an, dies ist auf die Einschränkung zurückzuführen, die mich nicht zusammen mit Plantemitterentity [b] controller [/b] < /p> [code]@DeleteMapping("/{id}") public ResponseEntity delete(@PathVariable("id") UUID id){ Optional optionalResponsePlantDTO = service.findPlantById(id); if(optionalResponsePlantDTO.isPresent()){ service.delete(optionalResponsePlantDTO.get()); return ResponseEntity .status(HttpStatus.OK) .body(optionalResponsePlantDTO.get()); } else { throw new PlantNotFoundException( MessageFormat.format("Plant not found with id code: {0}.", id.toString()) ); } } [/code] [b] Service [/b] [code]public void delete(ResponsePlantDTO plant){ PlantEntity plantEntity = mapper.map(plant, PlantEntity.class); repository.delete(plantEntity); } [/code]