Home > Net >  Referential integrity constraint violation with Cascade type ALL
Referential integrity constraint violation with Cascade type ALL

Time:01-25

I need your help with the following problem: there is a spring boot project, it has two entities: Bank and CreditDetails, the bank refers to the details as OneToMany, the details as ManyToOne. In the Bank entity, the cascade type is ALL, but when I try to delete the bank, I get an error, what could be the problem?

Bank:

@Entity
@Table(name = "banks")
@Getter
@Setter
@NoArgsConstructor
public class Bank {

    @Id
    @Column(name = "bank_id")
    @GeneratedValue(strategy = GenerationType.AUTO)
    private UUID id;

    @OneToMany(orphanRemoval = true,cascade = CascadeType.ALL,
            mappedBy = "bank", fetch = FetchType.LAZY)
    private List<CreditDetails> creditDetails = new ArrayList<>();

    @OneToMany(orphanRemoval = true,cascade = CascadeType.ALL,
            mappedBy = "bank", fetch = FetchType.LAZY)
    private List<Client> clients = new ArrayList<>();
}

Credit Details:

@Entity
@Table(name = "credit_details")
@Getter
@Setter
@NoArgsConstructor
public class CreditDetails {

    @Id
    @Column(name = "credit_details_id")
    @GeneratedValue(strategy = GenerationType.AUTO)
    private UUID id;

    @Column(name = "credit_limit")
    private BigDecimal creditLimit;

    @Column(name = "credit_percent")
    private BigDecimal creditPercent;

    @ManyToOne(targetEntity = Bank.class, cascade = {CascadeType.DETACH, CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH}, fetch = FetchType.EAGER)
    @JoinColumn(name = "bank_id")
    private Bank bank;

    @OneToMany(cascade = CascadeType.ALL,
            mappedBy = "creditDetails")
    List<CreditOffer> creditOffers;
}

Entities in DB(H2)

create table banks
(
    bank_id uuid primary key
);

create table credit_details
(
    credit_details_id uuid primary key,
    credit_limit      bigint,
    credit_percent    numeric(5, 2),
    bank_id           uuid references banks (bank_id),
    primary key (credit_details_id)
);

Stacktrace:

Referential integrity constraint violation: "CONSTRAINT_8: PUBLIC.CREDIT_DETAILS FOREIGN KEY(BANK_ID) REFERENCES PUBLIC.BANKS(BANK_ID) ('ae1ce5c1-b1eb-4ee7-a1a2-63d831b0fd0a')";

CodePudding user response:

I reconstructed your setup using spring, hibernate, an H2 database and a Postgres database. For me everything worked as intended.

To test the entities I used a BankRepository:

public interface BankRepository extends CrudRepository<Bank, UUID> {}

and a very simple RestController:

private final BankRepository bankRepository;

@DeleteMapping
public void removeBank(@RequestParam String uuid) {
    bankRepository.deleteById(UUID.fromString(uuid));
}

@PostMapping("/add")
public Bank addBank() {
    var bank = new Bank();

    var creditDetails = new CreditDetails();
    creditDetails.setBank(bank);
    bank.setCreditDetails(List.of(creditDetails));

    bankRepository.save(bank);

    return bank;
}

You might geht the error if you try to delete the Bank entity via some SQL directly or if you manually delete it from your database. Could you set

spring.jpa.show-sql: true

and post the generated JPA Queries? Mine looked like this:

Hibernate: select bank0_.bank_id as bank_id1_1_0_ from banks bank0_ where bank0_.bank_id=?
Hibernate: select creditdeta0_.bank_id as bank_id4_2_0_, creditdeta0_.credit_details_id as credit_d1_2_0_, creditdeta0_.credit_details_id as credit_d1_2_1_, creditdeta0_.bank_id as bank_id4_2_1_, creditdeta0_.credit_limit as credit_l2_2_1_, creditdeta0_.credit_percent as credit_p3_2_1_ from credit_details creditdeta0_ where creditdeta0_.bank_id=?
Hibernate: delete from credit_details where credit_details_id=?
Hibernate: delete from banks where bank_id=?
  •  Tags:  
  • Related